Я исследовал эту проблему, но в большинстве случаев причиной ошибки 502 является неправильно настроенный nginx.conf или вышестоящая служба. Я считаю, что это другое ...
Как следует из названия, я обновил сервер Ubuntu с 14.04 до 16.04. Я использую nginx в качестве своего веб-сервера, а также использую сервер java / tomcat, настроенный в моей конфигурации nginx как proxy_pass.
После обновления каждый раз, когда сервер запускается, nginx отображает ошибку 502: Bad Gateway
при попытке подключиться к сайту proxy_pass. Все остальные сайты, указанные в моей конфигурации, работают должным образом.
Возможно ли, что порядок, в котором запущены службы, может вызвать постоянную ошибку 502?
Чтобы решить проблему, я должен sudo systemctl restart nginx
, после чего служба proxy_pass работает как положено, до следующей перезагрузки.
Из error.log:
2018/01/24 11:33:20 [error] 1886#1886: *202 connect() failed (111: Connection refused) while connecting to upstream, client: 10.0.0.1, server: localhost, request: "GET /radio/rest2/savePlayQueue.view?u=user&p=enc:xxxxxxxx&v=2.0.0&c=DSub&id=0000¤t=0000&position=0 HTTP/1.1", upstream: "http://[::1]:4040/radio/rest2/savePlayQueue.view?u=user&p=enc:xxxxxxxx&v=2.0.0&c=DSub&id=0000¤t=0000&position=0", host: "www.myhostname.tld"
В то время, когда эта ошибка была сгенерирована nginx, я мог использовать lynx с этого сервера для подключения к localhost: 4040 / radio, и мне был предоставлен соответствующий контент. Даже после этого остается ошибка 502 при подключении через nginx.
Для этого не существует определенного восходящего блока, однако блок местоположения:
location ^~ /radio/ {
proxy_pass http://localhost:4040;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Connection "";
# health_check; # nginx: [emerg] unknown directive "health_check"
}
Я не хочу перезапускать nginx каждый раз при загрузке. Как я могу решить эту проблему?
upstream: "http://[::1]:4040/…
Ваш апстрим, вероятно, слушает только IPv4 localhost (127.0.0.1:4040
), тогда как nginx пытается подключиться к локальному хосту IPv6 ([::1]:4040
).
lynx работает, потому что пытается и то, и другое.
УГАДАЙ: nginx может будет терпеть неудачу, потому что он пробует оба вначале, оба терпят неудачу, затем он придерживается IPv6 с этого момента.
ИСПРАВЛЕНИЕ: изменить исходный поток для использования 127.0.0.1
явно или измените восходящий поток для прослушивания как IPv4, так и IPv6.