[转]你如何面对—LNMP高并发时502

本文介绍了一种解决PHP-FPM在高并发下出现502错误的方法,通过调整配置如增加进程数、优化backlog设置及采用双实例负载均衡等手段,有效提升了系统的稳定性和响应能力。

From : http://www.topthink.com/topic/5683.html

之前php-fpm配置:

单个php-fpm实例,使用socket方式,内存8G 静态方式,启动php-fpm进程数300,具体参数如下

listen = /tmp/php-cgi.sock #listen = 127.0.0.1:9000 listen.backlog = 2048 listen.allowed_clients = 127.0.0.1 pm = static pm.max_children = 300 pm.start_servers = 50 pm.min_spare_servers = 30 pm.max_spare_servers = 250 request_terminate_timeout = 0 request_slowlog_timeout = 2


由于架构,代码等原因,单台几百并发就出现502错误。

初步解决:各种相关优化

增大pm.max_children为400

nginx和fpm 添加了 listen.backlog = 2048

最大打开文件句柄数 65535

/etc/sysctl.conf 都进行了微调,高并发时nginx发起的连接数,远远超过了php-fpm所能处理的数目,导致端口(或socket)频繁被锁,造成堵塞。依然出现502错误

终极解决方法:

启用两个php-fpm实例,把php-fpm分为两部分,每部分各听一个端口或socket,这样就减少了lock,依然保持400个php-fpm进程,每个实例启用200个,采用nginx的upstream负载均衡,轮询每个socket来处理请求。

具体操作:

cp php-fpm.conf php-fpm2.conf vi php-fpm2.conf 做相应的修改 [global] pid = /usr/local/php/var/run/php-fpm2.pid error_log = /usr/local/php/var/log/php-fpm2.log log_level = notice [www] listen = /tmp/php-cgi2.sock #listen = 127.0.0.1:9000 listen.backlog = 2048 listen.allowed_clients = 127.0.0.1 pm = static pm.max_children = 200 pm.start_servers = 50 pm.min_spare_servers = 30 pm.max_spare_servers = 250 request_terminate_timeout = 0 request_slowlog_timeout = 2 slowlog = var/log/slow.log cp /etc/init.d/php-fpm /etc/init.d/php-fpm2   vi  /etc/init.d/php-fpm2  修改 prefix=/usr/local/php exec_prefix=${prefix} php_fpm_BIN=${exec_prefix}/sbin/php-fpm php_fpm_CONF=${prefix}/etc/php-fpm2.conf php_fpm_PID=${prefix}/var/run/php-fpm2.pid


启动php-fpm2即可

配置nginx

编辑nginx.conf 主配置文件,如果后端采用虚拟主机,跟我一样,

添加

upstream backend{
              server unix:/tmp/php-cgi.sock;               server unix:/tmp/php-cgi2.sock;                 } vi vhost/test.conf

修改此处 fastcgi_pass  backend; 调用fastcgi是,使用负载均衡的方式。

location ~ [^/]\.php(/|$) { try_files $uri =404; fastcgi_pass backend; # fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; # include pathinfo.conf; }



重启nginx。

等待验证吧,502错误会大大地减少,网站抢购甚欢,消费者甚欢。

总结:

高并发时使用tcp端口的方式比socket方式相对稳定一点,但是使用端口的方式,处理的效率确实比socket效率低了那么一点。LNMP环境下,在面对高并发时,除了一个合理的架构,与合理的调优之外,开发者的代码逻辑与高效的代码也是影响高并发的一个重要因素。一个请求调用多少次php-fpm,每个php-fpm处理多少时间,都是开发者需要考虑的点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值