Sim, o nginx tem um comando especial para ele, chamado "fastcgi_pass_header". Experimente este código na localização ou na seção HTTP:
fastcgi_pass_header Connection-close;
TL; DR : Como posso dizer ao nginx do meu backend do php-fpm para a) enviar um cabeçalho "Connection: close" e b) para não armazenar em buffer minha resposta?
Eu tenho uma configuração executando o php-fpm por trás do nginx. Em geral, isso funciona muito bem e estou feliz com isso, mas existem alguns scripts que gostariam muito de enviar um cabeçalho "Connection: close" para o navegador do cliente (um para garantir que uma conexão completamente nova atinja o HAProxy ), para poder transmitir uma resposta a clientes que não conseguem lidar com a codificação de transferência em partes (o .NET tem um bug).
Agora, se eu fizer isso no PHP:
<?php
header('Connection: close');
echo "foobar";
E tente com o curl, eu entendo isso:
curl -I http://localhost/foo.php
HTTP/1.1 200 OK
Server: nginx/1.1.19
Date: Tue, 19 Feb 2013 08:07:03 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.4.11
Como você pode ver, o "Close" se transformou em "keep-alive". Mas não só isso: aparentemente, o nginx também armazena essa resposta e envia tudo de uma vez (confirmado enviando muitos dados, dormindo, enviando mais dados).
Examinando a documentação, descobri o cabeçalho 'X-Accel-Buffering', que está documentado para usar proxies aqui e para fastgi aqui . Esse cabeçalho parece que está fazendo exatamente o que eu quero (bem. Ele não corrige o problema do cabeçalho da conexão, mas deve pelo menos parar o buffer), mas, infelizmente, sem sorte
<?php
header('Connection: close');
header('X-Accel-Buffering: no');
echo "foobar";
curl -I http://localhost/foo.php
HTTP/1.1 200 OK
Server: nginx/1.1.19
Date: Tue, 19 Feb 2013 08:16:22 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.4.11
Ainda manter vivo e ainda fazendo o buffer. Meu próximo pensamento foi que talvez a configuração padrão do ubuntu defina a opção fastcgi_ignore_headers, mas, não:
crazyhat@app99:/etc/nginx$ grep -lri 'ingore_header' *
crazyhat@app99:/etc/nginx$
Então, agora estou perdido e vindo para cá - não há nada de óbvio para eu experimentar.
O nginx está configurado para usar o php-fpm em execução com
upstream php-5.4 {
server unix:///opt/php/5.4/var/fpm.socket;
}
(e 5.3, mas isso não é relevante para esta discussão)
Sim, o nginx tem um comando especial para ele, chamado "fastcgi_pass_header". Experimente este código na localização ou na seção HTTP:
fastcgi_pass_header Connection-close;
Você mencionou o HAProxy. Já tentou usar o option httpclose
ou option forceclose
no lado HAProxy?
Tags php nginx fastcgi php-fpm keep-alive