php-fpm和nginx通过fast-cgi的连接是否是持久(keep-alive)连接?

Mat*_*aur 5 php sockets nginx

我正在尝试编写一个服务器演示来连接 php-fpm ,但我不知道 fast-cgi 的 php-fpm 和 nginx 之间的连接是否是持久(keep-alive)连接?每次向 nginx 请求 http 时,nginx 是否会再次通过 tcp 3-Way Handshake 连接 php-fpm?或者nginx和php-fpm之间的连接是keep-alive连接,nginx尝试重用它?

apo*_*fos 3

PHP-FPM 是 fastCGI 协议的实现,因此它遵守所有 fastCGI 规范要求。

规范第 3.5 节中就有这样一项要求,特别是关于关闭连接:

Web 服务器控制传输连接的生命周期。当没有活动的请求时,Web 服务器可以关闭连接。或者,Web 服务器可以将关闭权限委托给应用程序(请参阅 FCGI_BEGIN_REQUEST)。在这种情况下,应用程序会在指定请求结束时关闭连接。这种灵活性可适应多种应用风格。简单的应用程序将一次处理一个请求,并为每个请求接受一个新的传输连接。更复杂的应用程序将通过一个或多个传输连接处理并发请求,并保持传输连接长时间打开。

简单的应用程序在完成写入响应后关闭传输连接,从而显着提高性能。Web 服务器需要控制长连接的连接生存期。

当应用程序关闭连接或发现连接已关闭时,应用程序会发起新的连接。

这意味着由网络服务器决定连接是否持续。这是通过fastcgi_keep_conn选项在 nginx 中实现的,该选项指出:

默认情况下,FastCGI 服务器将在发送响应后立即关闭连接。但是,当该指令设置为 on 值时,nginx 将指示 FastCGI 服务器保持连接打开。这是必要的,特别是对于 FastCGI 服务器的 keepalive 连接正常工作。

该声明旨在反映规范行为以及网络服务器的能力,该网络服务器可以提供 fastCGI 生成的内容以修改默认行为。

我的假设是,由于网络服务器的线程不断被回收,因此保持连接活动没有真正的意义。也许有指定数量的停放线程,但线程池的通常策略是杀死最近最少使用的线程,通常这意味着生成一个新线程将确保预先退出的线程被杀死。

诚然,我没有找到任何资源来支持 nginx 的池收集策略是 LRU 的说法,但也不是不可能,在这种情况下,保持连接活动并不会节省太多。