是否可以根据每个位置延长 nginx 中的 504 超时时间

是否可以根据每个位置延长 nginx 中的 504 超时时间

是否可以在位置块内设置超时指令以防止 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$

我偶然发现这篇有趣的博客文章

综上所述,您需要:

  1. 增加max_execution_timephp.ini 中的配置变量。
  2. 增加request_terminate_timeoutphp-fpm的配置变量。
  3. 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;
}

相关内容