Можно ли указать 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?