【解決】Nginxでローカルの別サービスにリバースするとエラー
Nginxでproxy_passを使ってリバースプロキシ使ってみた時にちょっとハマった時のメモです。
うまく動かない場合や、エラーが発生した場合は、Nginxのログを確認してください。調査に必要な情報が記録されていることが多いです。
エラーログの格納場所:/var/log/nginx/error.log
ファイアウォールの設定
ローカルで動作確認できたのに、ブラウザで外からアクセスした時に表示されな場合は、80番ポートが開いていない可能性が高いです。
その場合は、ファイアウォールの設定を確認してください。
502 Bad Gateway
NginxとSpringBootアプリ間がうまく連携できていない場合によく出ます。
- Nginxの設定ミス
- SpringBootアプリが停止している
- SELinuxによって保護されている
Nginxの設定ミス
nginx.confファイルの設定ミスである可能性が高い場合は、サービスの起動が失敗していると思います。ステータスを確認してみてください。
$ systemctl status nginx
SpringBootアプリが停止している or 起動中
Nginxは動作しているけれど、うまく表示されない場合は、転送先のサービスが停止、またはエラーが可能性があります。
起動して間もない場合は、まだ起動中である可能性が高いので、少し時間をおいてから再度確認してください。
SELinuxによって保護されている(Permission denied)
2019/09/26 10:28:07 [crit] 21012#21012: *1
connect() to 127.0.0.1:8080 failed (13: Permission denied)
while connecting to upstream, client: 121.117.166.82,
server: _, request: "GET / HTTP/1.1",
upstream: "http://127.0.0.1:8080/",
host: "34.70.144.xxx"
こんなログが残っていたら、こいつの仕業である可能性が高いです。
Security-Enhanced Linux (SELinux) は、アメリカ国家安全保障局 (NSA) がGPL下で提供している、Linuxのカーネルに強制アクセス制御 (MAC) 機能を付加するモジュールの名称。名前から勘違いされることが多いが、Linuxディストリビューションの一つではない。
Wikipediaより抜粋
ファイルシステムのパーミッションとは別に更に制御できる仕組みがあり、rootでも権限不足になるぐらいゴッツイものらしいです。とりあえず、SELinux自体をOFFにするのは怖いので、HTTPの接続の許可を設定します。
$ sudo setsebool -P httpd_can_network_connect 1
これは実行するとすぐに反映されるので、再度ブラウザで確認してください。
ぶっちゃけ今回はSELinuxで2時間もハマってしまいました…不覚…orz
私がLinuxいじってた2001年の頃にはこんなん無かったです。
どうやらLinuxには2003年に組み込まれたようで、全知全能の神であるrootの動作まで抑止してしまうとのことです。
コメント