web-dev-qa-db-ja.com

ロケーションごとにnginxで504タイムアウトを延長することは可能ですか

ロケーションブロック内でタイムアウトディレクティブを設定して、nginxが504を長時間実行しないようにすることはできますかPHPスクリプト(PHP-FPM))?

server
{
  listen 80;
  server_name ubuntu-vm.test-api;
  root /home/me/Sites/path/to/site/; 
  index index.php;

  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }

  location ~ \.php$ {


    try_files $uri =404;

    # Fix for server variables that behave differently under nginx/php-fpm than typically expected
    fastcgi_split_path_info ^(.+\.php)(/.+)$;

    # Include the standard fastcgi_params file included with nginx
    include fastcgi_params;
    fastcgi_param  PATH_INFO        $fastcgi_path_info;
    fastcgi_index index.php;

    # Override the SCRIPT_FILENAME variable set by fastcgi_params
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

    # Pass to upstream PHP-FPM; This must match whatever you name your upstream connection
    fastcgi_pass unix:/var/run/php5-fpm.sock;

    }

    location /someurlpath {

    try_files $uri $uri/ /index.php?$query_string;

    # Fix for server variables that behave differently under nginx/php-fpm than typically expected
    fastcgi_split_path_info ^(.+\.php)(/.+)$;

    # Include the standard fastcgi_params file included with nginx
    include fastcgi_params;
    fastcgi_param  PATH_INFO        $fastcgi_path_info;
    fastcgi_index index.php;

    # Override the SCRIPT_FILENAME variable set by fastcgi_params
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

    # Pass to upstream PHP-FPM; This must match whatever you name your upstream connection
    fastcgi_pass unix:/var/run/php5-fpm.sock;

    fastcgi_read_timeout 100000s;
    }

    error_log /var/log/nginx/my_api_error.log;
    access_log /var/log/nginx/my_api_access.log;
}

これは、example.com/someurlpath。タイムアウトは約60秒後に発生します。 PHPは、スクリプトが完了するまで実行できるように構成されています(set_time_limit(0))

fastcgi_read_timeout 概して ~ /.php {}ブロックして問題を解決します。

すべてのスクリプトにグローバルタイムアウトを設定したくありません。

6
codecowboy

まず、ネストされた場所を確認します。2番目の場所ブロックが考慮されない理由は、nginxが場所と一致すると停止するためです。 。したがって、http://ubuntu-vm.test-api/someurlpathは、対応するフォルダにindex.phpがある場合、location ~ \.php$にのみ一致します。

私は偶然に遭遇しました この興味深いブログ投稿

これを要約するには、次のことを行う必要があります。

  1. Php.iniのmax_execution_time構成変数を増やします。
  2. Php-fpmのrequest_terminate_timeout構成変数を増やします。
  3. Nginx構成ファイルで、必要な場所にfastcgi_read_timeoutを設定します。

問題は、php-fpmにその1つの場所に対してのみ異なる構成ファイルを使用するように指示できないことです。

ただし、次のようにnginx構成でphp.ini構成変数を設定できます。

fastcgi_param PHP_VALUE "max_execution_time=1000";
4
moebius_eye

私も同じ問題に遭遇しましたが、Nginx構成を使用して場所ごとに_fastcgi_read_timeout_を設定することができると思いますが、そのように場所を適切に構成するのは複雑になります。また、PHPの_max_execution_time_も設定しないと、タイムアウトになる可能性があります。

Nginxタイムアウトが実際に使用されないように設定し、代わりにPHPがタイムアウトを処理するようにすること(mod-Apacheやコマンドライン)。

したがって、Nginx構成の_location ~ \.php$_セクションで、_request_terminate_timeout_を非常に高い値に設定します(または、タイムアウトを無効にするにはに設定します)。また、_fastcgi_read_timeout_を、スクリプトを実行する可能性のある最大秒数に設定します。

php.iniに_max_execution_time_を設定してデフォルト値を設定し、微調整します。これで、長時間実行したいスクリプトがある場合は、それらのスクリプトでset_time_limit() PHPコマンドを使用します。

1
orrd

Nginxのドキュメントに示されているように、locationserver、またはhttpブロックでタイムアウトを設定できます。それらは包含ブロックから継承されるため、投稿したスニペットは機能しませんでした。

0
Michael Hampton

その場所にfastcgi_passを設定しようとしましたか?

location {
     fastcgi_pass 127.0.0.1:9000;
     fastcgi_read_timeout 100000s;
}
0
ADM