编程

配置和排除 PHP-FPM 故障

350 2023-11-26 03:30:00

PHP-FPM 通常带有一个设置过低的特定设置。当流量过大时,通常在服务器资源耗尽之前,就会导致网关错误。

让我们看看这个设置是什么,以及如何纠正它。

什么是 PHP-FPM

PHP-FPM 是一个应用网关。它位于 Nginx(网络服务器)和您的代码库之间。Nginx 将获得一个 HTTP 请求,然后使用快速CGI协议将请求“代理”配置到 PHP-FPM。

当 PHP-FPM 接收到来自 Nginx 请求时,它会启动一个进程(如果一个进程尚未运行),该进程会运行 PHP 应用的实例(调用 index.php 文件或其他任何文件,其中包含所有所需的数据- $_SERVER$_GET$_POST、请求主体等等)。

PHP-FPM 的问题

问题是 PHP-FPM 有一个设置 max_children。这是可能运行的进程数量。由于每个子进程一次串行处理一个 HTTP 请求,处理并发请求的唯一方法是启动更多的进程。最终,我们可以达到配置的最大进程数(max_children),从而导致网关错误(PHP-FPM拒绝处理请求,也不会对请求进行排队)。

这种情况可能会过早发生——在服务器实际耗尽资源(RAM、CPU)之前。然而,它往往与您的数据库过载相吻合。在这种情况下,请求可能无法及时响应,从而导致挂起的 HTTP 请求堆积,最终导致 max_children 被命中和可怕的 Gateway 错误。

这一直困扰着我——它有时是自我限制的(当 max_children 设置得太低时),而其他时候则掩盖了真正的问题(例如数据库过载)。

调试 PHP-FPM 问题

如果遇到网关错误,可以在 PHP-FPM 日志中查看发生了什么。这通常在 linux 服务器上的 /var/log 中。在 Debian/Ubuntu 服务器上,它是 /var/log/php8.2-fpm.log(根据PHP版本的需要进行调整)。

你会看到错误,上面写着“You're going to hit your max limit soon”,也许还有像“max_children reached”这样的错误。如果你看到了这些,你就知道你可能应该增加你的 PHP-FPM 配置的 max_children

如何配置 PHP-FPM

要配置好的 max_children 数量,您需要知道服务器可以处理多少并发请求。

我通常会做这样的计算:

floor(RAM available / RAM used per request)

如果我有一个 4gb RAM 服务器,我可能会安排 3gb 给 web 服务器。如果每个 PHP web 请求消耗 100mb,也就是 3072 / 100 或者大约会允许服务器处理 30 个并发请求。这意味着我会将 max_children 设置为 30!

空闲 RAM 的数量下降许多,

当您在服务器中竞争资源时,可用 RAM 的数量会下降很多。如果您的数据库在同一台服务器上,那么您应该为 PHP 分配更少的 RAM 来处理 web 请求。

一个重要的技巧

我能给你的最好的优化技巧是让你的数据库离开你的网络服务器,进入它自己的专用服务器。这为您的数据库提供了可能需要的更多资源,并释放了您的 web 服务器,使其能够将更多的资源用于服务 web 请求。

 

PHP