是否可以通过 fastcgi 告诉 nginx 传递 Connection: close 标头而不做任何改变?

是否可以通过 fastcgi 告诉 nginx 传递 Connection: close 标头而不做任何改变?

总结:我如何从我的 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

相关内容