PHPのset_time_limit()を使用してnginx 504ゲートウェイのタイムアウトを防止


116

PHPスクリプトの実行時間が通常より長くなると、nginxから504のタイムアウトメッセージが表示されます。set_time_limit(0)それを防ぐことはないようです!nginxでphp5-fpmを実行すると機能しませんか?もしそうなら、時間制限を設定する適切な方法は何ですか?

エラー:

504 Gateway Time-out
nginx/1.2.7

回答:


193

php-fpmのタイムアウトを設定する方法はいくつかあります。で/etc/php5/fpm/pool.d/www.conf、私の行を追加しました:

request_terminate_timeout = 180

また、/etc/nginx/sites-available/default問題のサーバーのロケーションブロックに次の行を追加しました。

fastcgi_read_timeout 180;

ロケーションブロック全体は次のようになります。

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_read_timeout 180;
    include fastcgi_params;
} 

今度はphp-fpmとnginxを再起動するだけで、180秒未満のリクエストのタイムアウトはなくなります。


2
他の誰かが不思議に思っている場合、私のデフォルト(nginx + php5-fpm)は60秒だったので、スクリプトの「ゲートウェイタイムアウト」が60秒で表示された場合、「fastcgi_read_timeout」設定を追加する必要があります
Michael Nguyen

1
私は何日もこれを理解しようと努めてきました、そして@pymkinの答えは私のために働いたものです。nginxとphp5-fpmを再起動する方法を疑問に思っている他のアマチュアの場合は、次の2つのコマンドを実行します。sudo service nginx restart&sudo service php5-fpm restartサーバー上のすべてのWebサイトの構成ではなく、私のWebサイト。
Pamela 14

4
悲しいことに、fastcgi_read_timeoutそのlocationブロックで何を設定しても、60秒後にタイムアウトします。
スペンサーウィリアムズ

これは受け入れられる答えになるはずです。非常に多くの解決策を試しましたが、これだけが機能します。私はlaravel homesteadを使用していて、504ゲートウェイタイムアウトエラーがあり、これで修正されました。
Anbu369

Laravelを使用する場合locationは、docrootではなく、phpスクリプトを処理するブロックでこれを設定する必要があります。
Ryan DuVal

50

このリンクを試してください。これを修正する方法についてのより良い解決策があります。したがって、手順は次のとおりです。

  1. ディレクトリにnginx.confあるファイルを開きます/etc/nginx
  2. http {セクションの下に以下のコードを追加します。

    client_header_timeout 3000;
    client_body_timeout 3000;
    fastcgi_read_timeout 3000;
    client_max_body_size 32m;
    fastcgi_buffers 8 128k;
    fastcgi_buffer_size 128k;

    注:すでに存在する場合は、それに応じて値を変更します。

  3. Nginxとphp5-fpmをリロードします。

    $ service nginx reload
    $ service php5-fpm reload

    エラーが解決しない場合は、値を増やすことを検討してください。


1
これは原因を特定するのではなく、エラーまでの時間を増やすだけです。しかし、ロードが長すぎるのはなぜかという解決策を見つけることです。localhostにいるときは、私が唯一のクライアントであり、それが非常に長くロードされるため、開発中に待つのはまったく良くありません。
Darius.V 2014年

16
問題は、スクリプトが遅い原因を尋ねることではなく、サーバーをより長く待機させる方法を求めることです。非常に長い時間がかかるタスクを実行する特別なスクリプトを実行する必要がある場合がありますが、それは悪いことではありません。
2016

リンク(上)更新:codetweet.com/nginx/...
nadavkav

2
何が合法的に時間がかかるのか不思議に思う人にとっては、たとえば、データベースへの接続を試み、その後多くの初期テーブルを作成してデータで埋めるWebインターフェイスからのインストールスクリプトが考えられます。応答するまでにかなり時間がかかる可能性があります。
imme

これらのグローバル設定は、のサイトごとの設定によって上書きされることに注意してください/etc/nginx/sites-available/mysite.com
Mac

11

PHPを使用して、nginxによって発行されるタイムアウトを防ぐことはできません。

より多くの時間を許可するようにnginxを構成するには、proxy_read_timeoutディレクティブを参照してください。


これにより、(vaprobashを使用して)504が私のvagrantボックスに表示され始める問題を解決しました。
アンディフレミング2015年

2
この答えは、プロキシサーバーとしてNginxを使用している場合にのみ当てはまると思います。NginxをプライマリWebサーバーとして使用している場合(PHP-FPMを使用)、これは機能しません。
16

10

正解は、Nginx構成でfastcgi_read_timeoutを増やすことです
そのような単純な!


7
 sudo nano /etc/nginx/nginx.conf

これらの変数をnginx.confファイルに追加します。

http {  
  # .....
  proxy_connect_timeout       600;
  proxy_send_timeout          600;
  proxy_read_timeout          600;
  send_timeout                600;
}

そして再起動します:

service nginx reload

4

このような場合に発生する可能性のあるタイムアウトには3種類あります。各回答は、これらの可能性の1つの側面のみに焦点を当てていることがわかります。だから、私はそれを書き留めて、将来ここにアクセスする誰かがランダムに各回答をチェックして、どちらがうまくいったかを知らずに成功する必要がないようにすることを考えました。

  1. リクエスタからのリクエストをタイムアウトする-タイムアウトヘッダーを設定する必要があります(リクエストするライブラリのヘッダー構成を参照)
  2. リクエストの作成中のnginxからのタイムアウト(プロキシサーバーに転送する前)に例:アップロードされる巨大なファイル
  3. プロキシされたサーバーへの転送後のタイムアウト、サーバーは時間内にnginxに応答しません。例:サーバーで実行される時間のかかるスクリプト

したがって、各問題の修正は次のとおりです。

  1. タイムアウトヘッダーを設定します。例:ajax

$.ajax({
    url: "test.html",
    error: function(){
        // will fire when timeout is reached
    },
    success: function(){
        //do something
    },
    timeout: 3000 // sets timeout to 3 seconds
});

  1. nginxクライアントのタイムアウト

    http{
         #in seconds
        fastcgi_read_timeout 600;
        client_header_timeout 600;
        client_body_timeout 600;
     }
  2. nginxプロキシサーバーのタイムアウト

    http{
      #Time to wait for the replying server
       proxy_read_timeout 600s;
    
    }

必要なものを使用してください。場合によっては、これらすべての構成が必要になることがあります。必要だった。


1

に追加のnginxディレクティブ(のngx_http_proxy_module)を追加する必要がありますnginx.conf。例:

proxy_read_timeout 300;

基本的に、nginx proxy_read_timeoutディレクティブはプロキシのタイムアウトを変更します。これFcgidIOTimeoutは、静かすぎるスクリプト用です。FcgidBusyTimeout実行に時間がかかりすぎるスクリプト用です。

また、FastCGIアプリケーションを使用している場合は、これらのオプションも増やします。

FcgidBusyTimeout 300
FcgidIOTimeout 250

次に、nginxとPHP5-FPMをリロードします。

Plesk

Pleskでは、追加のnginxディレクティブの下のWebサーバー設定追加できます。

FastCGIの場合は、HTTPの追加ディレクティブの下のWebサーバー設定で確認します。

参照:PleskのFastCGIタイムアウト問題を修正する方法?


FcgidBusyTimeout変数はApacheだけに存在しませんか?
Slavik

0

php-fpmを使用しているため、fastcgi_finish_request()を利用して、時間がかかる可能性があるリクエストを処理する必要があります。


-1

使用する set_time_limit(0) PHP-FPMまたは類似のプロセスマネージャを使用するときに無駄です。

を使用するset_time_limit場合php-fpm、ボトムラインは使用しません。実行タイムアウトを増やすには、このチュートリアルを確認してください


8
ここで答えのいくつかの説明を提供するかもしれませんし、リンクが期限切れになるとこの答えは陳腐化するかもしれません。
ラクシュミ2014年

-7

この問題はconfig APACHEで解決します!(このトピックの)すべての方法は私にとって正しくありません...それから私はchanche apache configを試します:

Timeout 3600

その後、私のスクリプトはうまくいきました!


5
質問はnginxについて述べています。Apacheに問題がある場合は、それを検索する必要があります。
ホーガン

問題は、NginxとApacheではなくphp-fpmに関するものです。
Kevin Kaburu、2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.