我研究过这个问题,但大多数情况下 502 错误的原因是 nginx.conf 或上游服务配置不当。我相信这是不一样的。
正如标题所示,我将 ubuntu 服务器 14.04 升级到了 16.04。我使用 nginx 作为我的 Web 服务器,并且还运行 java/tomcat 服务器,在我的 nginx 配置中将其设置为 proxy_pass。
自升级以来,每次服务器启动时,nginx 都会502: Bad Gateway
在尝试连接到 proxy_pass 站点时显示错误。我的配置中指定的所有其他站点均按预期运行。
服务启动的顺序是否可能导致持续的 502 错误?
为了解决这个问题,我必须sudo systemctl restart nginx
,之后,proxy_pass 服务将按预期工作,直到下次重启。
从错误日志中:
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,并获取相应的内容。即使在此之后,通过 nginx 连接时仍会出现 502 错误。
没有为此定义上游块,但是位置块是:
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。如何解决这个问题?
答案1
upstream: "http://[::1]:4040/…
您的上游可能仅监听 IPv4 本地主机 ( 127.0.0.1:4040
),而 nginx 正尝试连接到 IPv6 本地主机 ( [::1]:4040
)。
lynx 之所以有效是因为它尝试了两者。
猜测:nginx可能因为它一开始就尝试了两种方式,但都失败了,所以从那时起它就坚持使用 IPv6。
修复:更改上游以127.0.0.1
明确使用或更改上游以侦听 IPv4 和 IPv6。