É possível dizer ao nginx sobre o fastcgi para passar um Connection: fechar o cabeçalho por inalterado?

2

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.

  • SO: Ubuntu 12.04
  • Nginx: 1.1.19 (estoque)
  • PHP: PHP 5.4.11 (auto-compilado)
  • 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)

por pilif 19.02.2013 / 09:26

2 respostas

1

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;
    
por 19.02.2013 / 10:06
0

Você mencionou o HAProxy. Já tentou usar o option httpclose ou option forceclose no lado HAProxy?

    
por 19.02.2013 / 12:48