Eu tenho o Apache2 com PHP + PHP-FPM configurado de acordo com:
http://wiki.apache.org/httpd/PHP-FPM
Estou escrevendo um script que levará muito tempo para ser executado em um Vhost interno, mas continuando com o tempo limite esgotado, tudo será executado sem falhas se o script for executado em menos de 30 segundos.
Meu log do apache me diz:
[Wed Apr 17 21:57:23.075175 2013] [proxy_fcgi:error] [pid 9263:tid 140530454267648] (70007)The timeout specified has expired: [client 58.169.202.172:49017] AH01075: Error dispatching request to :, referer:
Ao tentar executar o script, recebo um tempo 503 Service Unavailable
após exatamente 30 segundos de execução. Logicamente, isso significaria que eu tenho uma diretiva de tempo limite ou configuração definida como 30 segundos, mas eu as tenho na configuração do meu Vhost:
Timeout 600
<IfModule proxy_module>
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/home/pyrokinetiq/scripts/$1 timeout=600
ProxyTimeout 600
</IfModule>
(php-fpm está sendo executado na porta 9001 para mim)
Eu também tentei colocar o Timeout
e ProxyTimeout
dentro httpd.conf
sem diferença.
Parece que há outro tempo limite definido em algum lugar específico mod_proxy_fcgi
, mas não consigo encontrá-lo. Eu instalei o Apache2 httpd do tarball oficial, nenhum dos mods parece ter vindo com nenhum arquivo de configuração.
Se alguém puder me apontar na direção certa, seria muito apreciado.
fonte
Queria ressaltar que, embora essa resposta funcione bem para versões mais antigas, ela é quebrada nas versões recentes do Apache 2.4 com o código de erro AH00526.
ProxyPass
eProxyPassMatch
ou<Proxy>
e<ProxyMatch>
não podem ser usados juntos com o mesmo nome do trabalhador. Isso costumava funcionar muito bem, então não sei se isso foi alterado por design ou se é um bug.De qualquer forma, você pode corrigir isso usando apenas um ProxyPassMatch com o parâmetro 'timeout = 120' (ou qualquer que seja o valor desejado), por exemplo:
fonte
Eu tenho o Apache 2.4.6, mas o patch para corrigi-lo é fornecido no Apache> = 2.4.8. A chave aqui é iniciar sua saída imediatamente, para que o Apache (mod_proxy_fcgi) pense que a conexão está ativa.
Por exemplo, estou usando PHP e a consulta ao banco de dados para minha chamada AJAX leva> 30 segundos. Como sei que a resposta geral será "Content-Type: application / json", envio esse cabeçalho imediatamente.
fonte
Não deveria ser:
Certifique-se de que a configuração max_execution_time do php.ini também esteja definida como 600. (verifique phpinfo () na página ao vivo para garantir que você esteja vendo o valor real usado)
Como Jenny disse, defina a configuração php-fpm
(observe os s no final)
Não há muito o que configurar com o próprio mod_proxy_fcgi, como você pode ver na página apache. http://httpd.apache.org/docs/current/mod/mod_proxy_fcgi.html
Ative o log de depuração do php-fpm também para que você possa ver o tempo limite por aí. http://php-fpm.org/wiki/Configuration_File (também ative catch_workers_output)
E ative o log de nível de depuração para os módulos mod_proxy e mod_proxy_fcgi desde que você esteja usando o apache 2.4. Recurso muito bom, ative apenas para os módulos necessários: http://httpd.apache.org/docs/current/mod/core.html#loglevel
Se isso não ajudar, poste seu arquivo de configuração php-fpm.
Como último recurso, talvez algum daemon esteja matando um longo processo de execução?
fonte
Notei que você está usando PHP-FPM. Eu também uso, mas com o Apache 2.4.6.
Supondo que o problema existe há algum tempo, parece que o valor do tempo limite
mod_proxy_fcgi
é codificado . Eu escrevi o que encontrei aquifonte
Como você corrigiu as configurações de tempo limite no apache, esse não deve ser o problema. O segundo lugar para procurar seria qualquer equipamento de rede, mas como você faz proxy para seu próprio servidor, isso também é improvável. Portanto, o lugar restante para procurar é no servidor back-end.
No arquivo de configuração do php-pfm, procure
Isso deve ser definido como o mesmo ou um pouco abaixo da configuração de tempo limite no apache.
fonte
request_terminate_timeout
400, ainda nenhuma mudança :( Eu tenho a sensação de que há algo que eu preciso definir paramod_proxy_fcgi
, mas não parecem vir com quaisquer arquivos de configuração.Além do tempo limite, defina enablereuse = off. Descobri que quando estava em alguns pedidos de scripts de longa execução funcionaria corretamente e outros seriam mortos mais cedo.
fonte
Este post mudou todo o negócio para mim.
Adicione as seguintes linhas ao seu arquivo httpd.conf :
fonte