13

我在使用 nginx 和 php-fpm 时遇到了随机 502 网关错误的问题。就我而言,我发现了一个场景,其中各种 php.ini error_log 设置和 error_reporting 级别导致出现随机 502 网关错误。

通过更改 php.ini 设置 error_reporting 和 error_log 我能够使 502 网关错误消失 - 但更重要的是我能够查看日志中真正的 php 错误并修复它们。

主要问题是,如果“error_reporting 设置为显示通知”,“error_logging = On”,那么我需要确保将 error_log 设置为可写入服务器的有效路径。

// !!! 502 Gateway Error (unhappy server)
error_reporting = E_ALL & E_NOTICE
; error_log = php_errors.log (note this is commented)

// Happy Server, no 502 gateway error
error_reporting = E_ALL & E_NOTICE
error_log = /valid/log/path/and/permissions

// Happy Server, no 502 gateway error
error_reporting = E_CORE_ERROR
; error_log = php_errors.log (note this is commented)

请注意,实际错误是 php 通知......但是 ngingx 为与未设置属性相关的 php 通知抛出 502 网关错误。

另请注意,并非在每个 php 通知中都会触发 502 网关错误。

希望这可以节省一些人的挫败感!

4

4 回答 4

3

Nginx 中的 502 网关错误是由 php-fpm 没有足够的进程和/或超时引起的。日志记录只会告诉您问题是什么,而不是 502 错误的原因。

我在 25 台服务器上使用 stunnel+haproxy+nginx+php-fpm。pfp-fpm 中的默认值非常低,即使对于中等繁忙的服务器也是如此。配置 fpm 子进程的方式与使用 apache mod_php 的方式大致相同。

我使用以下内容:

pm.max_children = 250
pm.start_servers = 20
pm.min_spare_servers =10
pm.max_spare_servers = 20
pm.max_requests = 1500

这是一个 2GB 内存的服务器。它每天提供 20-30GB 流量,没有 502

于 2012-07-12T16:50:25.527 回答
0

我在以 fastCGI 模式运行 iis 和 php 的 Windows 机器上遇到过这个问题,所以这不仅仅是一个 nix 问题。

罪魁祸首也是 php 日志记录。您不必将其设置为静态目录,但如果您授予适当的权限,它可以写入脚本所在的同一目录。(如果您有一个庞大而复杂的站点,这将非常有帮助)

我的服务器是这样设置的,我只是添加了一条不向公众提供错误日志的规则。

总而言之,检查权限!=)

于 2012-06-22T18:23:48.340 回答
0

我有一个类似的问题,可以通过禁用 PHP 警告来解决,但是,我认为这个问题与错误日志记录使用的缓冲区的 NGINX 配置有关。该错误仅在一定数量的警告消息排队后触发,并且似乎是可以预见的可重复的;但我无法弄清楚涉及哪些设置,所以在我可以解决损坏的设置之前关闭警告。

于 2013-07-08T04:53:47.963 回答
0

如果上述步骤不能帮助您解决问题,请检查您是否启用了加速器。

通过禁用 php.ini 或 php.d/eaccelerator.ini 中的 load .so 条目来全局禁用它

所有的问题都没有了。似乎加速器在某些情况下与 php-fpm 结合使用会失败。

于 2013-07-21T11:30:02.820 回答