Можно ли указать nginx через fastcgi пропустить заголовок Connection: close через неизмененный?

TL; DR: Как я могу сказать nginx из моего бэкэнда php-fpm: а) отправить заголовок "Connection: close" и б) не буферизовать мой ответ?

У меня есть настройка запуска php-fpm позади nginx. В целом, это работает очень хорошо, и я доволен этим, но есть несколько сценариев, которые очень хотели бы отправить заголовок "Connection: close" в браузер клиента (один, чтобы гарантировать, что полностью новое соединение достигнет HAProxy), чтобы иметь возможность потоковой передачи ответа клиентам, которые не могут справиться с кодировкой чанкин-передачи (там есть ошибка в.NET).

Теперь, если я сделаю это в PHP:

<?php
header('Connection: close');
echo "foobar";

И попробуйте с curl, я получаю это:

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

Как видите, "Close" превратился в "keep-alive". Но не только это: по-видимому, nginx также буферизует этот ответ и отправляет его сразу (подтверждается отправкой большого количества данных, сном, отправкой большего количества данных).

Просматривая документацию, я узнал о заголовке "X-Accel-Buffering", который документирован для прокси здесь и для fastgi здесь. Этот заголовок выглядит так, как будто он должен делать именно то , что я хочу (ну, он не решает проблему заголовка соединения, но он должен хотя бы остановить буферизацию), но, увы, не повезло

<?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

Все еще поддерживает жизнь и все еще выполняет буферизацию. Моей следующей мыслью было, что, возможно, конфигурация по умолчанию в ubuntu устанавливает опцию fastcgi_ignore_headers, но нет:

crazyhat@app99:/etc/nginx$ grep -lri 'ingore_header' *
crazyhat@app99:/etc/nginx$

Так что теперь я в растерянности и прихожу сюда - ничего очевидного для меня не осталось, чтобы попробовать.

  • ОС: Ubuntu 12.04
  • Nginx: 1.1.19 (сток)
  • PHP: PHP 5.4.11 (скомпилированный)
  • nginx настроен на использование php-fpm с

    upstream php-5.4 {
        server unix:///opt/php/5.4/var/fpm.socket;
    }
    

    (и 5.3, но это не имеет отношения к этому обсуждению)

2 ответа

Да, nginx имеет специальную команду для этого, названную "fastcgi_pass_header". Попробуйте этот код в разделе местоположения или HTTP:

fastcgi_pass_header Connection-close;

Вы упомянули HAProxy. Пытался использовать option httpclose или же option forceclose на стороне HAProxy?

Другие вопросы по тегам