502 Bad gateway nginx with PHP-FPM 在高负载下

Posted

技术标签:

【中文标题】502 Bad gateway nginx with PHP-FPM 在高负载下【英文标题】:502 Bad gateway nginx with PHP-FPM under high load 【发布时间】:2014-03-27 22:57:58 【问题描述】:

我们目前在 Amazon EC2 上的 nginx 后面运行 php-FPM。每次高负载时,站点都会停止响应并向客户端输出 502 bad gateway。

这是来自 php-fpm error.log 的日志

[25-Feb-2014 10:29:50] 警告:[pool www] 服务器达到 pm.max_children 设置 (14),考虑提高它

[25-Feb-2014 12:23:11] 警告:[pool www] child 2029 在 8736.088351 秒后以代码 3 退出

[25-Feb-2014 12:23:11] 通知:[pool www] child 4142 开始

这是来自 nginx error.log 的日志

2014/02/25 14:14:30 [错误] 2013#0: *51168 recv() 在从上游读取响应标头时失败(104:对等方重置连接),客户端:192.168.160.215,服务器:域.com,请求:“GET / HTTP/1.1”,上游:“fastcgi://127.0.0.1:9000”,主机:“www.domain.com”

2014/02/25 14:24:15 [错误] 2013#0: *51310 recv() 在从上游读取响应标头时失败(104:对等方重置连接),客户端:192.168.160.215,服务器:域.com,请求:“GET / HTTP/1.1”,上游:“fastcgi://127.0.0.1:9000”,主机:“www.domain.com”

2014/02/25 14:40:21 [错误] 2013#0: *51312 recv() 在从上游读取响应标头时失败(104:对等方重置连接),客户端:192.168.160.215,服务器:域.com,请求:“GET / HTTP/1.1”,上游:“fastcgi://127.0.0.1:9000”,主机:“www.domain.com”

我们已经基于这个交换实现了 TCP/IP 配置。 Error 502 in nginx + php5-fpm

并且还对我们的 php-fpm 配置实施此修复 502 Gateway Errors under High Load (nginx/php-fpm)

这是我们在 php-fpm.d/www.conf 中使用的配置

listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 14
pm.start_servers = 7
pm.min_spare_servers = 7
pm.max_spare_servers = 14

nginx/conf.d/www.conf 上的配置是这样的

fastcgi_buffers 256 16k
fastcgi_buffer_size 32k
fastcgi_connect_timeout 300
fastcgi_send_timeout 300
fastcgi_read_timeout 300

【问题讨论】:

尝试增加 pm.max_children = 14(即 64),并减少超时。 @ziollek 有没有什么具体的理论可以说明我们应该为我们的最大孩子设置什么数字? 此链接可能对您调整配置有用if-not-true-then-false.com/2011/… 【参考方案1】:

使用PHP FPM,将需要php进程的请求从nginx传递到php-fpm进程并返回结果。

如果您一次有太多请求(如果您的任何请求花费的时间过长,或者您的资源与您的负载不匹配,则可能发生这种情况)您将开始收到超时或被 php 拒绝的请求-fpm。您看到的是哪个 502 错误。

[25-Feb-2014 10:29:50] WARNING: [pool www] server reached pm.max_children setting (14), consider raising it

您可以增加此值,但这本身可能不是解决方案。您达到 max children 的原因很可能是由于在您的实例上处理单个请求所花费的时间。如果发生这种情况时您的 CPU 已用尽,则可能无济于事。

您可能需要考虑增加实例大小作为短期解决方案。或者更改代码以更好地利用缓存。

【讨论】:

当我们的服务器开始响应时,CPU 没有达到最大值,内存中仍有大量空间。 @user3351805 然后尝试增加 max_children 设置,看看是否有帮助。如果您的 php 请求正在等待,对于外部服务,您可能需要并行处理更多。 是否有任何具体的理论来说明我们应该为我们的最大孩子设置什么数字? @user3351805 不是真的。测试最适合您的情况的方法。最终,您的硬件将获得太多的开放线程,无论如何您都需要升级。【参考方案2】:

关于“我们应该在我们的最大子代上设置什么数字”的任何具体理论,请参见此处 https://serverfault.com/questions/295766/what-is-wrong-in-my-php-fpm-configuration

顺便说一句,我认为你的价值观

    pm.start_servers = 7
    pm.min_spare_servers = 7
    pm.max_spare_servers = 14

很大 试试这些

    pm.start_servers = 3
    pm.min_spare_servers = 2
    pm.max_spare_servers = 5

【讨论】:

以上是关于502 Bad gateway nginx with PHP-FPM 在高负载下的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 显示502 Bad Gateway错误

502 bad gateway nginx怎么解决

nginx 502 Bad Gateway 错误解决办法

调试 502 Bad Gateway 错误 - Ubuntu、Nginx、Unicorn

服务器域返回 502 Bad Gateway - Nginx

nginx 502 bad gateway