当前位置: > Linux服务器 > nginx >

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

时间:2015-09-20 22:49来源:linux.it.net.cn 作者:IT

我们经常在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、第一步:

 

01 cp php-fpm.conf php-fpm2.conf
02  
03 vi php-fpm2.conf 做相应的修改
04  
05 [global]
06 #修改这里 1/2
07 pid = /usr/local/php/var/run/php-fpm2.pid
08 error_log = /usr/local/php/var/log/php-fpm2.log
09 #end
10 log_level = notice
11 [www]
12 #修改这里 2/2
13 listen = /tmp/php-cgi2.sock
14 #end
15 #listen = 127.0.0.1:9000
16 listen.backlog = 2048
17 listen.allowed_clients = 127.0.0.1
18 pm = static
19 pm.max_children = 200
20 pm.start_servers = 50
21 pm.min_spare_servers = 30
22 pm.max_spare_servers = 250
23 request_terminate_timeout = 0
24 request_slowlog_timeout = 2
25 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;
}

 

然后;

 

01 vi vhost/test.conf
02  
03 修改此处 fastcgi_pass  backend; 调用fastcgi是,使用负载均衡的方式。
04  
05 location ~ [^/]\.php(/|$)
06  {
07          try_files $uri =404;
08          fastcgi_pass  backend; #代理
09          #fastcgi_pass  127.0.0.1:9000;
10          fastcgi_index index.php;
11          include fastcgi.conf;
12          # include pathinfo.conf;
13 }

 

再重启下nginx。
另外值得一题的是:高并发时使用tcp端口的方式比socket方式相对稳定一点,但是使用端口的方式,处理的效率确实比socket效率低了那么一点。


(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容