无法让 Nginx/Apache + FastCGI + PHP-FPM + HTTP/1.0 使用 Keep-Alive

无法让 Nginx/Apache + FastCGI + PHP-FPM + HTTP/1.0 使用 Keep-Alive

由于我无法控制的原因(无法修改的应用程序),我需要获取一个通过 FastCGI 处理 PHP 页面 HTTP 请求的服务器,以遵守“连接:保持活动”(由所述客户端发送)并且请求也声明为“HTTP / 1.0”。

这对于静态内容、常规代理内容等非常有用。(意思是 - 如果您使用:

curl -0v http://server/static.html

您会按预期收到“连接:关闭”,但如果您还明确要求保持连接,如下所示:

curl -H "Connection: keep-alive" -0v http://server/static.html

只要 static.html 位于服务器本地,或者位于另一台由 Web 服务器代理的服务器上(例如 Nginx 中的 proxy_pass))。

但是,一旦你在 FastCGI 上添加了 PHP 后端并访问http://服务器/file.php,似乎所有响应都会变成“连接:关闭”,无论您尝试什么......并且这种行为似乎与最新稳定的 Nginx 和 Apache 2.4 共享。

但是请注意,在 mod_php 下提供 PHP 服务的 Apache 不会出现此问题;我本来会使用它,但我确实需要性能,不幸的是这个应用程序的 PHP 使用非线程安全的库,因此不能使用基于线程的 Apache MPM。

我已经根据互联网上的各种文档在 Nginx 中尝试过但没有帮助:

fastcgi_keep_conn on;

(在 PHP 位置 {} 块上)

    upstream fastcgi_backend {
            server 127.0.0.1:9000;
            keepalive 8;
    }

(在 http {} 块内)

我嗅探了 FastCGI 请求并发现它正在通过网络发送 SERVER_PROTOCOL 1.0,因此我编辑了 /etc/nginx/fastcgi_params,并修改了:

fastcgi_param  SERVER_PROTOCOL    $server_protocol;

到:

fastcgi_param  SERVER_PROTOCOL    HTTP/1.1;

看到它在嗅探器上更新,但无济于事;无论如何,所有请求仍然返回“连接:关闭”。

我甚至尝试在各个地方修改 Nginx 源代码本身(如果没有其他解决方案,这对我来说是一个可以接受的解决方案)(但对它了解不多:))以使其“认为”请求是“1.1”,但到目前为止还没有运气。

有人遇到过这个问题并找到了解决办法吗?

谢谢!

相关内容