php-fpm开启多个主进程实例解决高并发下nginx出现502 的问题

我们经常在LNMP环境中遇到高并发下nginx出现502 的问题。

一般情况下,服务器在遇到高并发时nginx发起的连接数,远远超过了php-fpm所能处理的数目,导致端口(或socket)频繁被锁,造成堵塞,所以容易出现502错误。

那么我们可以给php-fpm开启多个实例解决高并发下nginx出现502 的问题

===============================================

譬如我想开400个php-fpm进程,注意大家要根据实际情况来调整。



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

实验环境:php5.3系列+php-fpm

具体操作:

1、第一步:


cp php-fpm.conf php-fpm2.conf

vi php-fpm2.conf 做相应的修改

[global]
#修改这里 1/2
pid = /usr/local/php/var/run/php-fpm2.pid
error_log = /usr/local/php/var/log/php-fpm2.log
#end
log_level = notice
[www]
#修改这里 2/2
listen = /tmp/php-cgi2.sock
#end
#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



2、第二步

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


3、第三步

这个根据情况。

有的启动脚本,启动/etc/init.d/php-fpm2 可能会报错,可以再复制一个  /sbin/php-fpm 为 /sbin/php-fpm2,但是对应配置文件也要调整下。


或者采用这样方法,写到 /etc/init.d/php-fpm 里面:

#/usr/local/php/sbin/php-fpm --fpm-config /usr/local/php/etc/php-fpm.1.conf
#/usr/local/php/sbin/php-fpm --fpm-config /usr/local/php/etc/php-fpm.2.conf

=====================================================

好了,接下来搞nginx的配置文件

编辑nginx.conf 主配置文件,在http段哦


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。
另外值得一题的是:高并发时使用tcp端口的方式比socket方式相对稳定一点,但是使用端口的方式,处理的效率确实比socket效率低了那么一点。

关键词: nginx出现502 , php-fpm

上一篇: 一个产品经理应该做好的三件事
下一篇: 分享一些常用的nginx全局变量,方便配置Nginx

#1
回复 我是王世斌 2014-11-03, 3:47 PM
已阅,包子是个好同志
回复 jincon 2014-11-05, 1:46 PM
@我是王世斌: 感谢王总莅临指导工作。
#2
回复 白龙君 2016-10-07, 2:28 PM
502和MYSQL有关系吗?
回复 jincon 2016-10-30, 1:44 PM
@白龙君: 没有直接关系,但是有间接关系,mysql影响php执行,php处理不了nginx发来的请求,就会导致502.
发表评论

评论内容 (必填):