您有时会遇到网关错误,通常是 502 Bad Gateway
或 504 Gateway Timeout
。
这些是 Nginx 在将请求发送到 PHP 但 PHP 返回一些错误表明它无法处理请求时返回的错误。通常这些错误不是发生在您的应用程序中,而是 (通常) 在应用程序甚至处理请求之前发生的错误。
什么是网关
网关是位于 Web 服务器 (通常是 Nginx) 和您的应用程序之间的东西。对我们大多数人来说,这就是 PHP-FPM。Nginx 将使用 fastcgi 协议将 Web 请求转换为 PHP-FPM 可以理解的东西。然后 PHP-FPM 运行您的应用程序,使用它需要的信息设置 PHP (设置超全局变量 $_GET
、$_POST
、$_SESSION
、$_SERVER
等)。
如果 PHP-FPM 返回错误,Nginx 会给我们一个网关错误。
错误网关
当 PHP-FPM 返回错误时,会返回错误网关。这通常是以下原因之一
- PHP-FPM 未运行 (可能是由于太多错误)
- PHP-FPM 已达到其
max_children
限制,无法处理更多请求 - 某种类型的 PHP 错误,例如段错误
网关超时
网关超时错误通常发生在您的应用程序处理过多的流量时。这可能与 PHP-FPM max_children
错误相关 (太多它配置为处理的请求),但主要发生在您的数据库超载并且无法处理进行查询的额外连接时。返回查询需要太多时间。
如果您的应用程序进行的任何网络连接未及时返回响应,也会发生这种情况,但数据库是最常见的瓶颈。
调试网关错误
调试网关错误的 tl;dr
是日志。我从网络请求堆栈的顶部开始,然后向下移动。这意味着我检查的日志顺序是
- Nginx
- PHP-FPM
- 服务器资源使用情况
- 应用程序日志
Nginx 日志通常包含最无用的数据,尽管它可能会让您了解 PHP-FPM 未运行的问题 (如果它找不到 PHP-FPM 的套接字文件,例如 /var/run/php-fpm.sock
)。
FPM 日志通常最有帮助,因为 PHP-FPM 是返回错误的网关!通常,您会看到有关达到 (或接近) max_children
限制的错误。不太常见的是,您可能会看到一个段错误 (如果您看到该错误,您可能在代码中的某个地方存在递归)。
服务器资源使用情况是我接下来要检查的内容。您可以使用 htop
或类似工具来检查 CPU/RAM 使用情况,以及哪些进程在使用它们。您还应通过 df -h
检查磁盘使用情况,以检查磁盘是否已满。
您也可能耗尽了 inode!inode 是“索引节点”,用于在 Linux 系统上跟踪文件使用情况。由于所有内容都是文件 (包括 Linux 如何处理开放的网络连接!),耗尽 inode 可能会成为问题。您可以运行 df -i
来查看每个磁盘驱动器的 inode 使用情况。
最后,我检查应用程序日志。这些日志可能显示与超时或数据库错误相关的错误,但有时问题并非特定于应用程序代码库。这些日志在网关错误中的有用性会有所不同。