我:我对 nginx 和 FastCGI 总体来说还是新手,如果这是老生常谈并且显而易见的话,我深表歉意,但谷歌搜索显示很多人推荐随机配置值,但没有人解释他们决定背后的原因。
nginx worker_process 和 PHP-FPM worker 之间有什么关系?更多的 nginx worker 是否意味着更多的 PHP-FPM worker,还是它们之间没有关系?
我对这一工作方式的理解是
- 用户请求网页
- nginx 处理该请求,发现这是一个 PHP 页面
- nginx 将请求转交给 PHP-FPM
- PHP-FPM 要么使用现有进程处理请求,要么生成新进程
我不清楚 PHP-FPM 生成新子进程与哪些 nginx 工作进程正在与其通信之间是否存在任何关系。例如,如果您有两个相同的 Web 服务器,一个带有,worker_process = 4
另一个带有worker_process = 8
,并且它们都看到相同的 Web 流量,那么一个服务器会比另一个服务器创建更多的 php-fpm 子进程吗?或者我在这里说了一些非常愚蠢的话,表明我缺少一个基本概念?(如果是这样,那是什么?)
并不是试图解决一个特定的问题——只是试图学习如何推理 nginx 和 php-fpm 的行为,这样我就可以为扩展和性能集思广益/故障排除做出贡献。
答案1
nginx es 和 php-fpm 子进程之间没有内在关系worker_process
。它们甚至不必在同一台机器上运行!但如果它们在同一台机器上,它们可能会争夺 CPU(这通常不是问题,因为与 PHP 相比,nginx 所需的 CPU 非常少)。
答案2
Nginx 工作进程连接到 php-fpm。但是,它们通过创建异步连接来实现这一点,并将它们视为正常的上游,就像任何其他上游一样。
Nginx 是一个事件驱动的应用程序,这意味着它执行的大多数 I/O 操作(尤其是连接到上游)都是异步的。因此,一个工作进程在任何时候都可以与上游建立任意数量的连接。
PHP-FPM 将为收到的每个请求生成(或者,出于性能原因,理想情况下使用已生成但未使用的进程)。
因此,考虑到这些,通常两者之间没有直接关系。 您将始终拥有与定义完全相同的 nginx 工作进程数,但 php-fpm 进程的数量在大多数情况下会根据其接收的请求数而变化,这与 nginx 工作进程数没有直接关系。
有人可能会说,如果在 nginx 中启用 fastcgi keepalive,php-fpm 进程将停留更长时间。考虑到每个工作进程都有自己的使用 keepalive 的上游连接池,这可能会导致 php-fpm 为每个工作进程始终保持更多进程运行。但是,据我所知,php-fpm 中的 fastcgi keepalive 已损坏,所以这应该不是问题 :)。