我们经常在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效率低了那么一点。

NGINX下进行301永久重定向...

起初是为了解决多个域名分权的问题,比如yoff.cn  和www.yoff.cn 权重只能集中到其中一个,另外一个必须做好永久重定向,刚好服务器...

阅读全文

MYSQL实战高并发配置优化详解...

mysql配置优化这个课题谁都跑不掉,就算你靠搜索能够得到一些数据但是始终没有你自己的东西,你的程序员道路是无法进阶的,很惭愧我之前没有详细研究过,只好现...

阅读全文

php-fpm动不动就负载太高,...

最近遇到一个问题,php-fpm动不动就负载太高,导致了内存经常耗尽,改了很多配置都没有成功最后只好用最土的办法,就是监测负载高的时候直接重启,下面是相关...

阅读全文