É possível estender um tempo limite de 504 em nginx em uma base por local

3

É possível definir diretivas de tempo limite em um bloco de localização para evitar que o nginx retorne um 504 de um script PHP de longa execução (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;
}

Isso não tem efeito ao fazer uma solicitação para example.com/someurlpath . O tempo limite ocorre após aproximadamente 60 segundos. O PHP está configurado para permitir que o script seja executado até a conclusão (set_time_limit(0))

Se eu definir o fastcgi_read_timeout no bloco principal ~ /.php {} , isso resolve o problema.

Eu não quero definir um tempo limite global para todos os scripts.

    
por codecowboy 12.06.2014 / 16:41

4 respostas

3

Primeiro, dê uma olhada nos locais aninhados. A razão pela qual seu segundo bloco de localização não é levado em conta é porque quando nginx corresponde a um local, ele pára. Então, http://ubuntu-vm.test-api/someurlpath , se houver um index.php na pasta correspondente, apenas coincide com o location ~ \.php$ !

Eu tropecei em esta interessante postagem no blog

Para resumir isso, você precisa:

  1. Aumente a variável de configuração max_execution_time no seu php.ini.
  2. Aumente a variável de configuração request_terminate_timeout do php-fpm.
  3. Defina o fastcgi_read_timeout no local desejado, no arquivo de configuração nginx.

O problema é que você não pode dizer ao php-fpm para usar um arquivo de configuração diferente apenas para esse local.

No entanto, você pode definir uma variável de configuração do php.ini em sua configuração nginx da seguinte forma:

fastcgi_param PHP_VALUE "max_execution_time=1000";
    
por 24.06.2014 / 11:32
1

Eu encontrei o mesmo problema e, embora eu ache que você poderia usar a configuração Nginx para definir fastcgi_read_timeout por localização como está tentando fazer, acaba sendo complicado configurar os locais adequadamente dessa maneira. E então ainda pode ser tempo limite se você não definir o max_execution_time do PHP.

Descobri que uma solução melhor é configurá-lo para que os tempos limite do Nginx não sejam realmente usados e permitir que o PHP manipule os tempos limite (como acontece com outros servidores como o mod-Apache e a linha de comando).

Portanto, na seção "location ~ .php $" da configuração do Nginx, defina request_terminate_timeout como um valor muito alto (ou melhor ainda, defina-o como 0 para desativar o tempo limite). E também defina fastcgi_read_timeout como o maior número de segundos que você deseja que qualquer script seja executado.

E, em seguida, ajuste-o definindo um valor padrão, definindo max_execution_time no seu arquivo php.ini. Agora, quando você tiver o script que deseja permitir que seja executado por um longo tempo, use o comando PHP set_time_limit () nesses scripts.

    
por 02.08.2016 / 23:27
0

Você pode definir os tempos limite em qualquer bloco location , server ou http , conforme mostrado na documentação do nginx. Eles serão herdados do bloco que os contém, e é por isso que o snippet que você postou não funcionou.

    
por 12.06.2014 / 18:06
0

você tentou definir fastcgi_pass dentro desse local?

location {
     fastcgi_pass 127.0.0.1:9000;
     fastcgi_read_timeout 100000s;
}
    
por 12.06.2014 / 18:14