Impedir o tempo limite do gateway nginx 504 usando PHP set_time_limit ()

116

Estou recebendo mensagem de 504 tempos limite do nginx quando meu script PHP está sendo executado por mais tempo do que o normal. set_time_limit(0)não parece impedir isso! Não funciona ao executar php5-fpm no nginx? Em caso afirmativo, qual é a maneira adequada de definir o limite de tempo?

Erro:

504 Gateway Time-out
nginx/1.2.7
Nyxynyx
fonte

Respostas:

193

Existem várias maneiras de definir o tempo limite para php-fpm. Em /etc/php5/fpm/pool.d/www.confeu adicionei esta linha:

request_terminate_timeout = 180

Além disso, /etc/nginx/sites-available/defaultadicionei a seguinte linha ao bloco de localização do servidor em questão:

fastcgi_read_timeout 180;

Todo o bloco de localização se parece com isto:

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_read_timeout 180;
    include fastcgi_params;
} 

Agora apenas reinicie o php-fpm e o nginx e não deve haver mais tempo limite para solicitações que durem menos de 180 segundos.

pymkin
fonte
2
caso alguém esteja se perguntando, o padrão para o meu (nginx + php5-fpm) era de 60 segundos, então se você vir "gateway timeout" para um script @ 60 segundos, a configuração "fastcgi_read_timeout" deve ser adicionada
Michael Nguyen
1
Estou tentando descobrir isso há dias, e a resposta de @pymkin é o que funcionou para mim. Para outros amadores como eu que estão se perguntando como reiniciar o nginx e php5-fpm, execute os dois comandos a seguir: sudo service nginx restart e sudo service php5-fpm restart A única coisa que fiz diferente é que apliquei essas configurações a apenas um dos meus sites em vez da configuração de todos os sites em meu servidor.
Pamela
4
Infelizmente, não importa o que eu configurei fastcgi_read_timeoutnesse locationbloco, ele ainda atinge o tempo limite após 60 segundos.
Spencer Williams de
esta deve ser a resposta aceita. tentei tantas soluções, mas só funciona. Eu estava usando laravel homestead e tinha 504 erro de tempo limite de gateway e isso corrigiu.
Anbu369
Se estiver usando o Laravel, você precisa definir isso no locationbloco que lida com os scripts php, ao invés do docroot.
Ryan DuVal
50

Experimente este link , tem uma solução melhor de como consertar isso. Portanto, as etapas são:

  1. Abra seu nginx.confarquivo localizado no /etc/nginxdiretório.
  2. Adicione o código abaixo na http {seção:

    client_header_timeout 3000;
    client_body_timeout 3000;
    fastcgi_read_timeout 3000;
    client_max_body_size 32m;
    fastcgi_buffers 8 128k;
    fastcgi_buffer_size 128k;

    Nota: Se já estiver presente, altere os valores de acordo.

  3. Recarregue o Nginx e php5-fpm.

    $ service nginx reload
    $ service php5-fpm reload

    Se o erro persistir, considere aumentar os valores.

arp
fonte
1
Isso não faz com que se encontre a causa, apenas aumenta as vezes até o erro. Mas o melhor seria encontrar uma solução por que ele carrega tanto. Quando no localhost eu sou o único cliente e carrega tanto, que não adianta esperar enquanto desenvolvo.
Darius.V
16
A pergunta não é a causa do script lento, mas uma maneira de fazer o servidor esperar mais. Às vezes, você precisa executar scripts especiais que realizam tarefas que demoram muito tempo, e isso não é uma coisa ruim.
ou
Link atualizado (acima): codetweet.com/nginx/…
nadavkav
2
Para aqueles que podem estar se perguntando o que legitimamente demoraria tanto tempo, poderia ser, por exemplo, um script de instalação de uma interface da web que tenta fazer uma conexão com um banco de dados e, em seguida, cria muitas tabelas iniciais e as preenche com dados. pode levar algum tempo antes de uma resposta.
Imme
Lembre-se de que essas configurações globais serão substituídas pelas configurações por site em /etc/nginx/sites-available/mysite.com.
Mac
11

Você não pode usar o PHP para evitar um timeout emitido pelo nginx.

Para configurar o nginx para permitir mais tempo, consulte a proxy_read_timeoutdiretiva .

Bart
fonte
Isso resolveu o problema que eu estava enfrentando, onde 504s começavam a aparecer na minha caixa vagrant (usando vaprobash).
Andy Fleming
2
Acredito que essa resposta só se aplica se você estiver usando o Nginx como servidor proxy. Isso não funcionaria se você estiver usando o Nginx como seu servidor web principal (com PHP-FPM).
ou
10

A resposta correta é aumentar fastcgi_read_timeout em sua configuração Nginx.
Simples assim!

tfont
fonte
7
 sudo nano /etc/nginx/nginx.conf

Adicione essas variáveis ​​ao arquivo nginx.conf:

http {  
  # .....
  proxy_connect_timeout       600;
  proxy_send_timeout          600;
  proxy_read_timeout          600;
  send_timeout                600;
}

E então reinicie:

service nginx reload
kabus
fonte
4

Existem três tipos de timeouts que podem ocorrer em tal caso. Percebe-se que cada resposta está focada em apenas um aspecto dessas possibilidades. Então, pensei em anotar para que alguém que visitar aqui no futuro não precise verificar aleatoriamente cada resposta e obter sucesso sem saber qual funcionou.

  1. Tempo limite da solicitação do solicitante - É necessário definir o cabeçalho de tempo limite (consulte a configuração do cabeçalho na biblioteca solicitante)
  2. Tempo limite do nginx ao fazer a solicitação (antes de encaminhar para o servidor proxy), por exemplo: Arquivo enorme sendo carregado
  3. Tempo limite após o encaminhamento para o servidor proxy , o servidor não responde nginx a tempo. por exemplo: scripts demorados em execução no servidor

Portanto, as correções para cada problema são as seguintes.

  1. definir cabeçalho de tempo limite, por exemplo: em ajax

$.ajax({
    url: "test.html",
    error: function(){
        // will fire when timeout is reached
    },
    success: function(){
        //do something
    },
    timeout: 3000 // sets timeout to 3 seconds
});

  1. Tempo limite do cliente nginx

    http{
         #in seconds
        fastcgi_read_timeout 600;
        client_header_timeout 600;
        client_body_timeout 600;
     }
  2. tempo limite do servidor proxy nginx

    http{
      #Time to wait for the replying server
       proxy_read_timeout 600s;
    
    }

Portanto, use o que você precisa. Talvez em alguns casos, você precise de todas essas configurações. Eu precisei.

Gayan Kavirathne
fonte
1

Você precisa adicionar uma diretiva nginx extra (para ngx_http_proxy_module) em nginx.conf, por exemplo:

proxy_read_timeout 300;

Basicamente, a proxy_read_timeoutdiretiva nginx altera o tempo limite do proxy, FcgidIOTimeouté para scripts que são silenciosos por muito tempo eFcgidBusyTimeout é para scripts que demoram muito para executar.

Além disso, se você estiver usando o aplicativo FastCGI, aumente essas opções também:

FcgidBusyTimeout 300
FcgidIOTimeout 250

Em seguida, recarregue o nginx e o PHP5-FPM.

Plesk

No Plesk, você pode adicioná-lo nas Configurações do Servidor da Web em Diretivas adicionais do nginx .

Para FastCGI, verifique em Configurações do servidor da Web em Diretivas adicionais para HTTP .

Veja: Como corrigir problemas de tempo limite do FastCGI no Plesk?

Kenorb
fonte
A FcgidBusyTimeoutvariável não existe apenas para o Apache?
Slavik,
0

Já que você está usando php-fpm, você deve tirar vantagem de fastcgi_finish_request () para processar solicitações que você sabe que podem demorar mais.

Kate
fonte
-1

Usando set_time_limit(0) é inútil quando se usa php-fpm ou gerenciador de processo semelhante.

Bottomline não é para usar set_time_limitao usar php-fpm, para aumentar seu tempo limite de execução, verifique este tutorial .

pangkalizer
fonte
8
pode ser fornecida alguma explicação da resposta aqui, bem como esta resposta pode se tornar obsoleta se o link expirar.
Lakshmi
-7

Eu resolvo esse problema com o config APACHE! Todos os métodos (neste tópico) estão incorretos para mim ... Então eu tento chanche apache config:

Timeout 3600

Então meu script funcionou!

NeuroZ
fonte
5
A questão afirma nginx, se você tiver problemas com o apache, você deve pesquisar por isso.
hogan
A questão está no Nginx e php-fpm, não no Apache.
Kevin Kaburu,