私はこの問題を調査しましたが、ほとんどの場合、502エラーの原因は不適切に構成されたnginx.confまたはアップストリームサービスです。これは違うと思います。
タイトルが示すように、私はubuntuサーバー14.04を16.04にアップグレードしました。私はnginxをWebサーバーとして使用しており、Java/Tomcatサーバーも実行しており、nginx構成でproxy_passとしてセットアップしています。
アップグレード以降、サーバーが起動するたびに、proxy_passサイトに接続しようとすると、nginxはエラー502: Bad Gateway
を表示します。私の設定で指定された他のすべてのサイトは期待どおりに機能します。
サービスが開始される順序によって、永続的な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に接続することができ、適切なコンテンツが提供されました。その後も、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を再起動する必要はありません。この問題を解決するにはどうすればよいですか?
upstream: "http://[::1]:4040/…
アップストリームはおそらくIPv4localhost(127.0.0.1:4040
)のみをリッスンしていますが、nginxはIPv6 localhost([::1]:4040
)に接続しようとしています。
lynxは両方を試すため、機能します。
推測:nginx may開始時に両方を試行し、両方が失敗したために失敗し、その後はIPv6に固執します。
修正:アップストリームを変更して127.0.0.1
を明示的に使用するか、アップストリームを変更してIPv4とIPv6の両方でリッスンします。