由于我无法控制的原因(无法修改的应用程序),我需要获取一个通过 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”,但到目前为止还没有运气。
有人遇到过这个问题并找到了解决办法吗?
谢谢!