RHEL 6.6 の Web サーバー Varnish + Nginx + FastCGI (php-fpm) で次のスタックを実行しています。
毎回異なる結果セットを持つ動的な Web サイトであり、Google でインデックス化された約 200 万の URL があります。
- nginx/1.5.12 および PHP 5.3.3 で実行されます (最新の nginx および PHP にすぐにアップグレードされます)。
- Nginx は、ポート 9000 で同じサーバー上でローカルに実行されている php-fpm に接続します
一部のページで断続的に 504 ゲートウェイ タイムアウトが発生しますが、解決できません。504 を与える URL は、しばらくすると正常に動作します。ログから 504 について知ることができましたが、任意の URL でランダムに発生し、しばらくすると機能するため、これを複製することはできませんでした。
私は開発者といくつかの議論をしましたが、彼によると、基礎となるphpスクリプトはほとんど何もせず、これほど長くはかからないはずです(120秒)が、それでも504ゲートウェイタイムアウトが発生します.
問題が発生した正確な場所を特定する必要があります。
- Nginxの問題ですか?
- php-fpm に問題がありますか?
- 基礎となるphpスクリプトに問題がありますか?
- nginx が php-fpm に接続できない可能性はありますか?
- への TCP/IP 接続の代わりに Unix ソケットを使用すると解決しますか?
URL は 504 で 120 秒後にタイムアウトします
以下は見られるエラーです: 2016/01/04 17:29:20 [エラー] 1070#0: *196333149 アップストリーム タイムアウト (110: 接続タイムアウト) アップストリームへの接続中に、クライアント: 66.249.74.95、サーバー: xxxx、リクエスト: "GET /Some/url HTTP/1.1"、アップストリーム: "fastcgi://127.0.0.1:9000"、ホスト: "example.com"
以前は 150 秒の fastcgi_connect_timeout で、RHEL 6.6 ではデフォルトの net.ipv4.tcp_syn_retries = 5 で 63 秒後に 502 ステータス コードが表示されていました。その後、net.ipv4.tcp_syn_retries = 6 を設定すると、127 秒後に 502 が返され始めました。
fastcgi_connect_timeout = 120 を設定すると、504 ステータス コードが返され始めました。このような高い値の fastcgi_connect_timeout が良くないことは理解しています。
正確に 504 を取得している理由を見つける必要があります (タイムアウトはわかっていますが、原因は不明です)。根本的な原因を突き止めて、完全に修正する必要があります。
問題の正確な場所を確認するにはどうすればよいですか?
すでに定義されているタイムアウトの一部を次に示します。
サーバー全体の nginx.conf の下:
- キープアライブ_タイムアウト 5;
- send_timeout 150;
特定の vhost.conf の下:
- proxy_send_timeout 100
- proxy_read_timeout 100
- プロキシ接続タイムアウト 100
- fastcgi_connect_timeout 120
- fastcgi_send_timeout 300
- fastcgi_read_timeout 300
タイムアウトにはさまざまな値が使用されるため、どのタイムアウトが正確にトリガーされたかを把握できます。
以下は sysctl.conf の設定の一部です:
- net.ipv4.ip_local_port_range = 1024 65500
- net.ipv4.tcp_fin_timeout = 10
- net.ipv4.tcp_tw_reuse = 1
- net.ipv4.tcp_syn_retries = 6
- net.core.netdev_max_backlog = 8192
- net.ipv4.tcp_max_tw_buckets = 2000000
- net.core.somaxconn = 4096
- net.ipv4.tcp_no_metrics_save = 1
- vm.max_map_count = 256000
コードの記述が不十分な場合は、nginx または php-fpm が原因ではなく、php コードの問題が原因で 504 が発生していることを開発者に通知する必要があります。Nginx または Php-fpm が原因である場合は、修正する必要があります。
前もって感謝します!
======
さらに更新:
2 つのケースがあります。
- 504 @ 120 秒で以下のエラーが発生します:
2016/01/05 03:50:54 [エラー] 1070#0: *201650845 アップストリーム タイムアウト (110: 接続タイムアウト) アップストリームへの接続中に、クライアント: 66.249.74.99、サーバー: xxxx、要求: "GET /some /url HTTP/1.1"、アップストリーム: "fastcgi://127.0.0.1:9000"、ホスト: "example.com"
- 504 @ 300 秒で、以下のエラーが発生します。
2016/01/05 00:51:43 [エラー] 1067#0: *200656359 アップストリームがタイムアウトしました (110: 接続がタイムアウトしました) アップストリームからの応答ヘッダーの読み取り中に、クライアント: 115.112.161.9、サーバー: 192.168.12.101、リクエスト: "GET /some/url HTTP/1.1"、アップストリーム: "fastcgi://127.0.0.1:9000"、ホスト: "example.com"
- php-fpm ログにエラーは見つかりませんでした。
php-fpm プロセスの数も正常でした。他のリクエストが同時に正常に処理されたため、バックエンドが過負荷になっているようには見えません。
1 つの php-fpm プールのみが使用されています。通常、1 つの php-fpm マスター (親) プロセスとその他のスレーブ (子) プロセスは、5xx が観測された場合にのみ正常範囲にあります。php-fpm プロセスの数が大幅に増加することはなく、たとえ増加したとしても、サーバーには新しいプロセスをフォークしてリクエストを処理するのに十分な容量があります。