Nginx fecha a conexão enquanto o PHP-Fpm está processando

1

Eu tenho um script PHP que faz algum processamento de dados. O tempo que leva para o script terminar todo o trabalho é baseado na entrada do usuário. Não é incomum que sejam necessários 5 a 15 minutos de processamento.

No apache, tudo funciona bem, mas no Nginx a conexão acabou de ser fechada. Quando o tempo de processamento é baixo, tudo está bem. O problema vem nos pedidos longos ...

Não há erro em nenhum dos logs. Eu suspeito que o navegador fecha a conexão.

Eu cheirei os cabeçalhos e parece que o Nginx não envia nenhuma resposta até que o processamento seja concluído. Nem um único cabeçalho.

Eu tentei enviar cabeçalhos do script, mas parece que o nginx armazena todos eles.

Depois, desabilitei o buffer de saída do PHP e habilitei o flush implícito. Desativei a compactação gzip e o zlib. Eu minimizo FAST_CGI_BUFFERS para o mínimo permitido, que é: fastcgi_buffers 2 1k; fastcgi_buffer_size 1k; fastcgi_busy_buffers_size 1k; fastcgi_max_temp_file_size 0;

Ainda assim, ele se recusa a enviar cabeçalhos ...

Então, só para provar meu caso, em um dos loops dentro do código, fiz um var_export para um dos objetos ...

BOOM !!! - funciona ...

Alguém pode pensar em uma solução mais elegante?

Obrigado.

Atualização de 19 de agosto

Algo louco está acontecendo. Depois que eu tentei depurá-lo por 2 dias inteiros sem qualquer sorte, tentei algo que deveria ter feito antes.

Eu tentei essa configuração no Linode e funciona !!!

Então, provavelmente, o problema está em algum lugar na configuração do Ubuntu ... Não tenho a menor idéia de onde procurar.

    
por tounano 18.08.2012 / 01:16

2 respostas

1

Você tem que brincar com os tempos limite do servidor. O Nginx está fechando a conexão porque acredita que ela está pronta e silenciosamente fecha a conexão. Existem quatro diretivas que vêm à minha mente que poderiam fazer o truque para você.

client_body_timeout (default is 65)
client_header_timeout (default is 65)
keepalive_timeout (default is 65)
send_timeout (default is 65)

Todos os valores estão em segundos. Por favor, informe-se se algum deles foi feito (pessoalmente, acredito que deva ser mantido vivo, mas por favor teste).

    
por 18.08.2012 / 02:39
0

@ Fleshgrinder está no caminho certo, eu acho, mas existem parâmetros específicos de timeout fastcgi que você deve verificar, como listado no documentação do fastcgi_module . Em particular, eu olharei para aumentar fastcgi_read_timeout de seu padrão de 60s para 1000 e ver se isso é ordenado.

    
por 18.08.2012 / 04:44