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, который задокументирован для проксирования. Вот и для фастги Вот. Этот заголовок выглядит так, как будто он должен делать именно то, что я хочу (ну, это не решает проблему с заголовком соединения, но должно, по крайней мере, остановить буферизацию), но, увы, не повезло
<?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$
Так что теперь я в растерянности и иду сюда - мне больше нечего попробовать.
nginx настроен на использование php-fpm, работающего с
upstream php-5.4 {
server unix:///opt/php/5.4/var/fpm.socket;
}
(и 5.3, но это не относится к этому обсуждению)
Да, в nginx для этого есть специальная команда с именем fastcgi_pass_header. Попробуйте этот код в разделе местоположения или HTTP:
fastcgi_pass_header Connection-close;
Вы упомянули HAProxy. Пробовали использовать option httpclose
или option forceclose
на стороне HAProxy?