nginx 504 ゲートウェイ タイムアウト エラーのトラブルシューティングと解決の記録。繰り返し検査した結果、この問題の原因は PHP の CURL がタイムアウトを設定していないことであることが判明しました。解決策はタイムアウトを設定するか変更することで解決できます。 nginx の設定。
説明できない Web サイトの応答喪失のトラブルシューティングを思い出してください。以前は、Web サイトはプロキシ バックエンドとして nginx を使用し、サービスを提供するために php を実行する Apache を使用していました。 Apache は頻繁にサービスの提供に失敗し、時々応答を失い、その後 nginx に「504 Gateway Time-out」が表示されます
エラー ログには何も表示されないので、Apache のバグだと思いました (そうではありません、理由は以下で説明します)。
おそらく、年齢を重ねるにつれて、いじくり回すのが好きではなくなり、物事を現状のままにし、監視ツールを使用し、生き残るためにアラームを受信するたびに Apache を再起動することをいとわないでしょう。ついにある日、私は php を扱うことに飽きてしまい、Apache 本社が必要なくなったので、ソースを使用して php-fpm をインストールし、php を実行するようにしました。 PHPのインストールは面倒ではなく、ソースを使ったインストールはPHPワーカープロセスのログを出力するように設定するだけで非常にスムーズです。
すべての準備ができたら、元の proxy_pass を fastcgipass に置き換えるだけです。
アップストリーム apachephp {
サーバー www.jb51.net:8080; #Apache1
}
....
proxy_pass http://apachephp;
は
アップストリーム php {
サーバー 127.0.0.1:9000;
}
...
fastcgi_pass php;
Apache 上で実行されている php を php-fpm に移行できます。
移行が完了したら、ゆっくり座って問題ないと思っていましたが、問題の根本原因を分析しないと問題が発生します。問題は依然として発生しており、翌日には nginx が 504 ゲートウェイのタイムアウトを報告しました。今回は Apache には何も起こりません。Apache は最終的に関係を解消しました。
nginx と php-fpm のままであるはずです。nginx のエラー ログを確認すると、
[error] 6695#0: *168438 Upstream timed out (110: Connection timed out) while reading from upstream, が表示されます。
...
リクエスト: "GET /kd/open.php?company=chinapost&number=PA24977020344 HTTP/1.1"、アップストリーム: "fastcgi://127.0.0.1:9000"、ホスト: "www.jb51.net"
これを見ると、nginx の疑いは基本的に解消されます。nginx は php が「GET /kd/open.php?company=chinapost&number=PA24977020344 HTTP/1.1」を処理するのを待っていてタイムアウトしました。
すぐに php-fpm を再起動すると、問題は解消され、Web サイトにアクセスできるようになります。
再度ページにアクセスしても応答はありませんでしたが、ページが数回更新されると、通常は同時に他のページにアクセスし、Webサイト全体が不正なゲートウェイタイムアウトになりました。
問題はこのphpスクリプトに絞り込まれています。
netstat -napo |grep "php5-fpm" |
PHP の動作プロセスを見ると、設定ファイルの上限の 10 に達しており、open.php スクリプトで皆さんが行き詰まっているように感じます。
PHPスクリプトの実行時間がphp.iniの設定項目max_execution_timeを超えて結果が得られない場合、強制終了されます。
php.ini の max_execution_time が実際に設定されていることを確認し、その値が 30 であることを確認しました。
ユニバーサルグーグルが便利です。一定のグーグルを実行した後、次の文が得られました。
set_time_limit() 関数と設定命令 max_execution_time は、スクリプト自体の実行時間にのみ影響します。スクリプト実行の最大時間は、スクリプトがすでに実行されているときに発生する system() を使用したシステム コール、ストリーム操作、データベース操作などのスクリプト実行には含まれません。 www.jbxue.com
つまり、スクリプト内で他の操作を実行する時間がスクリプトの実行時間に含まれていない場合、タイムアウトを設定しない場合、PHP は常に呼び出しの結果を待ちます。
open.php ソース ファイルを見ると、curl タイムアウトが設定されていないことがわかります。
次の 2 行を追加し、再度更新すると問題は解決します。
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); //接続時のタイムアウト
;
curl_setopt($ch, CURLOPT_TIMEOUT, 10); //応答時のタイムアウト
php-fpmの設定ファイルでは、リクエストの実行がこの時間を超えると強制終了されるパラメータrequest_terminate_timeoutを設定できます。
同時に、遅いリクエストのログを記録するために使用されるパラメーター request_slowlog_timeout もあります。
コマンドラインからphpを実行する場合は、このコードを使用できます
れーれー
http://www.bkjia.com/PHPjc/776506.html