Назад | Перейти на главную страницу

Можно ли указать 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, который задокументирован для проксирования. Вот и для фастги Вот. Этот заголовок выглядит так, как будто он должен делать именно то, что я хочу (ну, это не решает проблему с заголовком соединения, но должно, по крайней мере, остановить буферизацию), но, увы, не повезло

<?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 для этого есть специальная команда с именем fastcgi_pass_header. Попробуйте этот код в разделе местоположения или HTTP:

fastcgi_pass_header Connection-close;

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