Назад | Перейти на главную страницу

Можно ли продлить тайм-аут 504 в nginx для каждого местоположения

Можно ли установить директивы тайм-аута в блоке местоположения, чтобы запретить 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$ !

Я наткнулся на это интересное сообщение в блоге

Подводя итог, вам необходимо:

  1. Увеличить max_execution_time переменная конфигурации в вашем php.ini.
  2. Увеличить request_terminate_timeout переменная конфигурации php-fpm.
  3. Установить 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;
}