Можно ли установить директивы тайм-аута в блоке местоположения, чтобы запретить 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 {}
заблокировать это решает проблему.
Я не хочу устанавливать глобальный тайм-аут для всех скриптов.
Во-первых, взгляните на вложенные местоположения. Причина, по которой ваш второй блок местоположения не учитывается, заключается в том, что когда nginx соответствует местоположению, он останавливается. Так, http://ubuntu-vm.test-api/someurlpath
, если в соответствующей папке есть index.php, соответствует только location ~ \.php$
!
Я наткнулся на это интересное сообщение в блоге
Подводя итог, вам необходимо:
max_execution_time
переменная конфигурации в вашем php.ini. request_terminate_timeout
переменная конфигурации php-fpm. fastcgi_read_timeout
в нужном месте в файле конфигурации nginx. Проблема в том, что вы не можете указать php-fpm использовать другой файл конфигурации только для этого одного места.
Однако вы можете установить переменную конфигурации php.ini в конфигурации nginx следующим образом:
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
на очень высокое значение (или еще лучше, установите его на 0 чтобы отключить тайм-аут). А также установить fastcgi_read_timeout
до максимального количества секунд, в течение которого вы можете захотеть запустить любой скрипт.
А затем настройте его, установив значение по умолчанию, установив max_execution_time
в твоем php.ini. Теперь, когда у вас есть сценарий, который вы хотите разрешить запускать в течение длительного времени, используйте set_time_limit()
Команда PHP в этих скриптах.
Вы можете установить время ожидания в любом location
, server
или http
блок, как показано в документации nginx. Они будут унаследованы от содержащего блока, поэтому опубликованный вами фрагмент не сработал.
вы пытались установить fastcgi_pass
внутри этого места?
location {
fastcgi_pass 127.0.0.1:9000;
fastcgi_read_timeout 100000s;
}