连接到上游时资源暂时不可用 (php5-fpm)

alf*_*ish 7 nginx php-fpm socket 502-error

当大约 +10K 连接(netstat -an |grep 80 |wc -l)时,我经常在随机页面上收到此错误。当仍有 +10GB 的可用内存且服务器负载小于 3 时,就会发生这种情况。

我的相关配置:

/etc/php5/fpm/php.ini

memory_limit = 1024M
default_socket_timeout = 120
Run Code Online (Sandbox Code Playgroud)

/etc/php5/fpm/pool.d/www.conf

pm = dynamic 
pm.max_children = 30 
pm.start_servers = 5
pm.min_spare_servers = 2 
pm.max_spare_servers = 5 
;pm.max_requests =20000 #uncommented with any value didn't fixed
request_terminate_timeout = 120s
Run Code Online (Sandbox Code Playgroud)

我还将上述 vlues(即 60 个孩子,10 个开始,10 个最大服务器)加倍,但无济于事。

/etc/nginx/nginx.conf

worker_connections 4024;
keepalive_timeout 10;
Run Code Online (Sandbox Code Playgroud)

Nginx 本身在 Varnish 和 memcached 后面是启用的。页面渲染通常非常快。

这似乎是一个很常见的问题,我找不到任何有用的解决方案,甚至无法分析可能的原因。因此,非常感谢您的提示/解决方案。

sna*_*nap 8

不幸的是,如果没有更多细节,很难对这个问题给出明确的答案。

不过我有几个猜测:

我的第一个猜测是,您的 php5-fpm 工作套接字对于您的负载而言侦听积压太少。Linux 上的 backlog 队列长度默认为 128。

要增加它,您应该:

  1. 增加net.core.somaxconnsysctl 值。
  2. 增加listen.backlogphp5-fpm 配置设置。

例如,您可以尝试将两者都增加到 2048 以查看是否有帮助。

我的第二个猜测是 nginx 工作人员的每个进程最大打开文件描述符限制。增加它的正确方法取决于您的分布。在 Ubuntu/Debian 上,您应该查看/etc/default/nginx文件和worker_rlimit_nofilenginx 配置设置。