В путешествиях по сети неоднократно можно наткнуться на безапелляционное "502 bad gateway". Разберемся что же это и как это ремонтировать.
В путешествиях по сети неоднократно можно наткнуться на безапелляционное 502 bad gateway . Разберемся что же это и как это ремонтировать.
Причин возникновения ошибки с кодом 502 или "bad gateway" может быть несколько:
- Nginx работает как прокси для другого веб-сервера (чаще всего для Apache web server)
- Nginx работает с PHP-FPM
- Nginx работает с другим сервисом как прокси
- Некорректные значения buffer или timeout.
То есть ошибка с кодом 502 возникает в случае недоступности проксируемого сервиса для nginx в нашем случае или очень малыми значениями таймаутов. Лучше сказать, что ошибка 502 возникает на шлюзе, который возвращает некий трафик. Шлюз - это как "точка доступа", которая позволяет вам получать трафик через себя от других сервисов. В нашем случае, шлюз - это сторонняя служба или приложение, который получает запросы от nginx.
Теперь подробно разберемся в причинах возникновения ошибки 502:
- Nginx работает как прокси для другого веб-сервера: в этом случае шлюзом является другой веб-сервер. То есть Nginx используется как прокси для другого веб-сервера, и, в случае некорректной настройки веб-сервера или неработоспособности, вы получаете 502 ошибку, то есть Nginx не получил трафика от шлюза по какой-то причине. Чаще всего достаточно перезапустить веб-сервер. Небольшой пример конфигурации nginx как прокси
server { listen 0.0.0.0:80; server_name proxy.it-e.ru; root /var/www/localhost/htdocs; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
Nginx принимает трафик на порт 80 для proxy.it-e.ru и перенаправляет его на http://127.0.0.1:8080. Если веб-сервер на порту 8080 не отвечает, то Nginx вернет ошибку 502. - Nginx работает с PHP-FPM: как и в первом примере, для получения ошибки 502, необходимо чтобы php-fpm не отвечал (остановлен, не доступен по сети или сокету из-за прав доступа, как правило). Чаще всего достаточно перезапустить php-fpm, который, например, перегружен запросами. Небольшой пример конфигурации nginx как прокси
location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/var/run/php.sock; }
Nginx принимает трафик для локейшна php$ и перенаправляет его на сокет /var/run/php.sock. Если сокета нет (то есть php-fpm остановлен) или недоступен для чтения, то Nginx вернет ошибку 502. Убедитесь, что параметр "listen" имеет правильное значение. Если в логе php-fpm видите сообщение "php5-fpm.sock failed (13: Permission denied)", то выставите корректные значения "listen.owner", "listen.group", "listen.mode" - права, которые будут установлены на сокет, при старте,а также "user", "nobody" - пользователь, от имени которого работает php-fpm. - Nginx работает как прокси с другим сервисом или приложением: как и в самом первом примере - пробуйте перезапустить шлюз. Конфигурация аналогична первому примеру.
- Некорректные значения buffer или timeout.
Попробуйте увеличить значения буферов и таймаутов в http блоке конфигурации Nginx. Например:fastcgi_buffers 32k; fastcgi_buffer_size 64k; fastcgi_connect_timeout 2m; fastcgi_send_timeout 2m; fastcgi_read_timeout 5m;
Комментарии (0)