是否可以在位置块内设置超时指令以防止 nginx 从长时间运行的 PHP 脚本(PHP-FPM)返回 504?
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 {}
则可以解决问题。
我不想为所有脚本设置全局超时。
答案1
首先,看一下嵌套位置。第二个位置块未被考虑的原因是,当 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 仅针对该位置使用不同的配置文件。
但是,您可以在 nginx 配置中设置 php.ini 配置变量,如下所示:
fastcgi_param PHP_VALUE "max_execution_time=1000";
答案2
我遇到了同样的问题,虽然我认为你可以使用 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 命令。
答案3
fastcgi_pass
您是否尝试过在该位置内设置?
location {
fastcgi_pass 127.0.0.1:9000;
fastcgi_read_timeout 100000s;
}