今回は、先日のちょっとしたやらかし談をご紹介します。
先日新しくサーバーを構築していて、nginxでバックエンドのApacheへのリバースプロキシを構築していたのですが、途中でこんなエラーに遭遇し、サイトが表示されなくなってしまいました。
logを確認するとこんなメッセージが。
accept4() failed (24: Too many open files)
いろいろ調べたところ、OSファイルディスクリプタ数上限の設定やnginxの制限の設定などを変えると解決するという情報を発見て、sysctl.confやらnginxのコンフィグやらを色々変えたのですが、何度試しても同じエラーが出続けて動作せず。
おかしいなーと思いながらもう一度設定ファイルを見返したところ、あることに気づきました。
バックエンドのApacheでは3003番ポートでListenしていて、nginxの3001番ポート経由でバックエンドのサーバーにつなげさせたかったのですが、設定ファイルには
server { listen 3001; server_name node.example.com; client_max_body_size 1g; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto \$scheme; location / { proxy_pass http://localhost:3001; #←!? } }
となっていました。
そう、つまりlocalhostの3003番ポートで動作しているApacheへリバースプロキシさせるはずが、あろうことかnginxが待ち受ける3001番ポート自身をまたリバースプロキシするような設定になってしまっていました。
当然、nginxの待ち受けポートをnginx自身がリバースプロキシしてしまっているので接続が無限にループしてしまい、それが原因でOSの上限を超えてしまっていたというのが今回の原因でした。
すぐに
proxy_pass http://localhost:3003;
に修正したところ、正常にページが表示されるようになりました。
見慣れないエラーが出ると慌ててついいろいろ試してしまいますが、まずは自分の凡ミスを疑ってみることも大事なんだなと思いました(;´∀`)