我们经常在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 |
03 |
vi php-fpm2.conf 做相应的修改 |
07 |
pid = /usr/ local /php/var/run/php-fpm2.pid |
08 |
error_log = /usr/ local /php/var/log/php-fpm2.log |
13 |
listen = /tmp/php-cgi2.sock |
17 |
listen.allowed_clients = 127.0.0.1 |
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;
}
然后;
03 |
修改此处 fastcgi_pass backend; 调用fastcgi是,使用负载均衡的方式。 |
05 |
location ~ [^/]\.php(/|$) |
10 |
fastcgi_index index.php; |
再重启下nginx。
另外值得一题的是:高并发时使用tcp端口的方式比socket方式相对稳定一点,但是使用端口的方式,处理的效率确实比socket效率低了那么一点。
(责任编辑:IT) |