502在高负载下使用PHP-FPM的错误网关nginx

时间:2014-02-25 15:36:24

标签: php linux amazon-web-services nginx amazon-ec2

我们目前在Amazon EC2上运行nginx后面的PHP-FPM。每次高负荷时,该站点都会停止响应并向客户端输出502坏网关。

这是来自php-fpm error.log

的日志
  

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

     

[2014年2月25日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

2 个答案:

答案 0 :(得分: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

你可以增加这一点,但这本身可能不是解决方案。您达到最大子项的原因可能是由于在您的实例上处理单个请求所花费的时间。如果你的CPU在发生这种情况时最大化,它可能无济于事。

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

答案 1 :(得分:0)

关于"任何特定的理论,我们应该为我们的最大孩子设置什么数字"看这里 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