502高负载下带PHP-FPM的坏网关nginx

502高负载下带PHP-FPM的坏网关nginx,php,linux,amazon-web-services,nginx,amazon-ec2,Php,Linux,Amazon Web Services,Nginx,Amazon Ec2,我们目前正在AmazonEC2上运行nginx背后的PHP-FPM。站点将停止响应,并在每次高负载时向客户端输出502坏网关 这是来自php fpm error.log的日志 [25-FEB-2014:10:29∶50]警告:[池WWW ]服务器达到PM.Max儿童设置(14),考虑提高它 [25-Feb-2014 12:23:11]警告:[池www]child 2029在启动8736.088351秒后以代码3退出 [25-Feb-2014 12:23:11]通知:[泳池www]child 4

我们目前正在AmazonEC2上运行nginx背后的PHP-FPM。站点将停止响应,并在每次高负载时向客户端输出502坏网关

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

[25-FEB-2014:10:29∶50]警告:[池WWW ]服务器达到PM.Max儿童设置(14),考虑提高它

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

[25-Feb-2014 12:23:11]通知:[泳池www]child 4142已启动

这是nginx error.log中的日志

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

我们已经基于此交换实现了TCP/IP配置。

并将此修复程序也实现到我们的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

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

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

<代码> [25-FEB-2014:10:29∶50]警告:[池WWW ]服务器达到PM.Max儿童设置(14),考虑提高它

您可以增加这个,但这本身可能不是一个解决方案。达到max children的原因很可能是由于在实例上处理单个请求所需的时间。如果发生这种情况时,您的CPU已达到最大值,那么这可能不会有帮助

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

关于“我们应该在最大子代上设置什么数字的任何特定理论”,请参见此处

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

    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

尝试增加pm.max_children=14(即64),和减少超时。@ziollek是否有任何具体的理论,我们应该在最大子项上设置什么数字?当我们的服务器开始响应CPU没有达到最大值,并且内存中仍有大量的主机空间时,此链接可能对您调整配置非常有用。@user3351805然后尝试增加最大子项设置并查看是否有帮助。如果您的php请求正在等待外部服务,您可能需要并行处理更多的请求。是否有任何具体的理论,我们应该在max children上设置什么数字?@user3351805实际上没有。测试什么最适合你的情况。最终,你的硬件会有太多的开放线程,你无论如何都需要升级。