总结:我如何从我的 php-fpm 后端告诉 nginx a) 发送“Connection:close”标头和 b) 不缓冲我的响应?
我在 nginx 后面运行 php-fpm。总体来说,这个设置运行得很好,我对此很满意,但有几个脚本非常希望向客户端浏览器发送“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,但这与本次讨论无关)
答案1
是的,nginx 有专门的命令,名为“fastcgi_pass_header”。在 location 或 HTTP 部分尝试此代码:
fastcgi_pass_header Connection-close;
答案2
您提到了 HAProxy。您尝试过在 HAProxy 端使用option httpclose
或吗?option forceclose