web-dev-qa-db-ja.com

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

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

エラー:

504 Gateway Time-out
nginx/1.2.7
101
Nyxynyx

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秒以下になることはもうありません。

176
pymkin

これを試してください link 、これを直す方法についてもっと良い解決法があります。手順は次のとおりです。

  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
    

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

40
arp

Nginxによるタイムアウトを防ぐためにPHPを使用することはできません。

もっと時間がかかるようにnginxを設定するには proxy_read_timeoutディレクティブ を参照してください。

9
Bart

正しい答えはあなたのNginxの設定でfastcgi_read_timeoutを増やすことです。
そのような単純な!

7
tfont
 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
kabus

ngx_http_proxy_moduleに追加のnginx指令(nginx.conf用)を追加する必要があります。例えば:

proxy_read_timeout 300;

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

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

FcgidBusyTimeout 300
FcgidIOTimeout 250

それからnginxとPHP5-FPMをリロードしてください。

Plesk

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

FastCGIの場合は、Webサーバー設定HTTP用の追加ディレクティブをチェックインします。

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

1
kenorb

Php-fpmまたは同様のプロセスマネージャを使用している場合、 set_time_limit(0) を使用しても意味がありません。

set_time_limitを使用するときには、php-fpmを使用しないでください。実行タイムアウトを増やすには、これをチェックしてください チュートリアル

0
pangkalizer

Php-fpmを使用しているので、fastcgi_finish_request()を利用してリクエストを処理する必要があります。

0
Kate

このような場合に発生する可能性があるタイムアウトは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;
    
    }
    

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

0