ロケーションブロック内でタイムアウトディレクティブを設定して、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 {}
ブロックして問題を解決します。
すべてのスクリプトにグローバルタイムアウトを設定したくありません。
まず、ネストされた場所を確認します。2番目の場所ブロックが考慮されない理由は、nginxが場所と一致すると停止するためです。 。したがって、http://ubuntu-vm.test-api/someurlpath
は、対応するフォルダにindex.phpがある場合、location ~ \.php$
にのみ一致します。
私は偶然に遭遇しました この興味深いブログ投稿
これを要約するには、次のことを行う必要があります。
max_execution_time
構成変数を増やします。request_terminate_timeout
構成変数を増やします。fastcgi_read_timeout
を設定します。問題は、php-fpmにその1つの場所に対してのみ異なる構成ファイルを使用するように指示できないことです。
ただし、次のようにnginx構成でphp.ini構成変数を設定できます。
fastcgi_param PHP_VALUE "max_execution_time=1000";
私も同じ問題に遭遇しましたが、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コマンドを使用します。
Nginxのドキュメントに示されているように、location
、server
、またはhttp
ブロックでタイムアウトを設定できます。それらは包含ブロックから継承されるため、投稿したスニペットは機能しませんでした。
その場所にfastcgi_pass
を設定しようとしましたか?
location {
fastcgi_pass 127.0.0.1:9000;
fastcgi_read_timeout 100000s;
}