我在一个相当繁忙的互联网站点工作,该站点经常会出现非常大的流量高峰。在这些高峰期间,每秒请求数百页,这会产生随机的 502 网关错误。
现在我们在具有 4 个 SAS 15k 驱动器 (raid10) 的机器上运行 Nginx (1.0.10) 和 PHP-FPM,该驱动器具有 16 核 CPU 和 24GB DDR3 内存。我们还使用最新的 Xcache 版本。数据库位于另一台机器上,但是这台机器的负载非常低,没有问题。
在正常负载下,一切运行完美,系统负载低于 1,PHP-FPM 状态报告从未真正同时显示超过 10 个事件进程。始终有大约 10GB 的内存可用。在正常负载下,机器每秒处理大约 100 次浏览量。
当出现巨大的流量高峰时,问题就出现了,并且每秒数百次页面浏览量是从机器请求的。我注意到 FPM 的状态报告随后会显示多达 50 个事件进程,但这仍然远低于我们配置的 300 个最大连接数。在这些高峰期间,Nginx 状态报告多达 5000 个事件连接,而不是正常的平均 1000 个。
操作系统信息:CentOS 5.7 版(最终版)
CPU:Intel(R) Xeon(R) CPU E5620 @ 2.40GH(16 核)
php-fpm.conf
daemonize = yes
listen = /tmp/fpm.sock
pm = static
pm.max_children = 300
pm.max_requests = 1000
我没有设置 rlimit_files,因为据我所知,如果你不这样做,它应该使用系统默认值。
fastcgi_params(仅向标准文件添加值)
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
fastcgi_pass unix:/tmp/fpm.sock;
nginx.conf
worker_processes 8;
worker_connections 16384;
sendfile on;
tcp_nopush on;
keepalive_timeout 4;
Nginx 通过 Unix Socket 连接到 FPM。
sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 1
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.eth0.rp_filter=1
net.ipv4.conf.lo.rp_filter=1
net.ipv4.ip_conntrack_max = 100000
limits.conf
* soft nofile 65536
* hard nofile 65536
这些是以下命令的结果:
ulimit -n
65536
ulimit -Sn
65536
ulimit -Hn
65536
cat /proc/sys/fs/file-max
2390143
问题:如果 PHP-FPM 没有用完连接,负载仍然很低,并且有足够的 RAM 可用,那么在高流量期间可能会导致这些随机 502 网关错误的瓶颈是什么?
注意:默认情况下,这台机器的 ulimit 是 1024,因为我将它更改为 65536,所以我没有完全重启机器,因为它是生产机器,这意味着停机时间太长。
最佳答案
这应该可以解决它...
你有: fastcgi_buffers 4 256k;
将其更改为: fastcgi_buffers 256 16k;//总共 4096k
同时设置 fastcgi_max_temp_file_size 0,这将在回复开始超过您的 fastcgi 缓冲区时禁用缓冲到磁盘。
关于nginx - 高负载下502网关错误(nginx/php-fpm),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8772015/