【解決】Nginxでローカルの別サービスにリバースするとエラー

スポンサーリンク
IT
スポンサーリンク

【解決】Nginxでローカルの別サービスにリバースするとエラー

Nginxproxy_passを使ってリバースプロキシ使ってみた時にちょっとハマった時のメモです。

うまく動かない場合や、エラーが発生した場合は、Nginxのログを確認してください。調査に必要な情報が記録されていることが多いです。

エラーログの格納場所:/var/log/nginx/error.log

ファイアウォールの設定

ローカルで動作確認できたのに、ブラウザで外からアクセスした時に表示されな場合は、80番ポートが開いていない可能性が高いです。

その場合は、ファイアウォールの設定を確認してください。

502 Bad Gateway

NginxとSpringBootアプリ間がうまく連携できていない場合によく出ます。

  1. Nginxの設定ミス
  2. SpringBootアプリが停止している
  3. 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の動作まで抑止してしまうとのことです。

コメント

タイトルとURLをコピーしました