ホームページ  >  記事  >  バックエンド開発  >  一度覚えておいてください nginx 504 ゲートウェイ タイムアウト 504 タイムアウト nginx 504 ゲートウェイ 504 ゲートウェイ

一度覚えておいてください nginx 504 ゲートウェイ タイムアウト 504 タイムアウト nginx 504 ゲートウェイ 504 ゲートウェイ

WBOY
WBOYオリジナル
2016-07-29 08:55:191717ブラウズ

今日、プログラムが Excel エクスポート タスクを実行しているときに、nginx タイムアウト メッセージが表示されました。

nginx 504 Gateway Time-out

トラブルシューティング プロセス:

タスクを表示すると、内容が 20,000 個の情報のデータ量であることがわかりました。 、各情報には 50 がありました この問題は、フィールドが Excel にエクスポートされたときに発生しました

タイムアウトが発生するまでの実行時間は約 10 分でした

分析:

Nginx 504 ゲートウェイ タイムアウトは、要求されたゲートウェイが要求されていないことを意味します簡単に言うと、実行できる PHP-CGI のリクエストがないことを意味します。 通常、次のような状況でこの問題が発生します。
1. プログラムが大量のデータを処理している、または無限大などの問題が発生しているループ
2. 何らかの理由で接続できず、タイムアウト障害に対するメカニズムがないため、常に接続が作成されるため、データベースなどの接続を作成します
3. プログラム内にいくつかの http リクエストがあります。これらのリクエストの実行時間が長すぎるため、タイムアウトが発生します

タイムアウトを確認するには、nginx と php の関連する設定をそれぞれ表示します

nginx 設定ファイルを見つけます

<span>#修改Nginx配置:
fastcgi_connect_timeout 1200s;#原设置为300s
fastcgi_send_timeout 1200s;<span>#原设置为300s</span>fastcgi_read_timeout 1200s;<span>#原设置为300s</span>fastcgi_buffer_size 64k;
fastcgi_buffers </span><span>4</span><span> 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;</span>

ここで最も重要な設定は、最初の 3 つ、つまり、

<span>fastcgi_connect_timeout #同 FastCGI 服务器的连接超时时间,默认值60秒,它不能超过75秒;<br>fastcgi_send_timeout #Nginx 进程向 FastCGI 进程发送 request ,整个过程的超时时间,默认值60秒;<br>fastcgi_read_timeout #FastCGI  进程向  Nginx  进程发送 response ,整个过程的超时时间,默认值60秒;<br></span>

php 設定ファイル

<span>php.ini<br></span><span>max_execution_time = 300s;PHP 脚本的最大执行时间,但是,在 php-cgi(php-fpm) 中,该参数不会起效。<br>php-fpm<br>request_terminate_timeout = 0; #设置单个请求的超时中止时间.设置为0 即一直执行下去直到程序结束 不会超时
</span>

上記の設定を変更した後、再度実行すると、504 タイムアウト プロンプトが表示されず、ページが空白になり、ファイルがエクスポートされないことがわかります。実行中にphpがタイムアウトするはずです

phpコードをチェックする方法がなく、実行時間の設定もありません:

set_time_limit

Baiduでphp関数の実行時間を検索したところ、次のことが見つかりました:

set_time_limit

この機能は、このページの最大実行時間を設定するために使用されます。デフォルト値は 30 秒で、php.ini の max_execution_time 変数で設定されています。0 に設定されている場合、最大時間は制限されません。

この関数を実行すると計算が開始されます。たとえば、デフォルトが 30 秒で、この関数が実行される前に 25 秒が実行されており、この関数を使用してそれを 20 秒に変更すると、ページの最大実行時間は 45 秒になります。

最後に、php 関数に次の行を追加しました:

set_time_limit(0);

もう一度実行すると、結果は OK です。

以上、504ゲートウェイタイムアウトの内容も含めてnginx 504ゲートウェイタイムアウトについて紹介しましたが、PHPチュートリアルに興味のある友人の参考になれば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。