共计 2918 个字符,预计需要花费 8 分钟才能阅读完成。
问题: 最近的抢购有点火,到点抢购的时候网站就会出现 502 bad gateway 错误 顶不住消费者的压力。
LNMP 架构
推荐:Nginx 502 错误触发条件与解决办法汇总 http://www.linuxidc.com/Linux/2014-08/105815.htm
伤。。。。。
之前 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 处理多少时间,都是开发者需要考虑的点。
————————————– 分割线 ————————————–
CentOS 6.2 实战部署 Nginx+MySQL+PHP http://www.linuxidc.com/Linux/2013-09/90020.htm
使用 Nginx 搭建 WEB 服务器 http://www.linuxidc.com/Linux/2013-09/89768.htm
搭建基于 Linux6.3+Nginx1.2+PHP5+MySQL5.5 的 Web 服务器全过程 http://www.linuxidc.com/Linux/2013-09/89692.htm
CentOS 6.3 下 Nginx 性能调优 http://www.linuxidc.com/Linux/2013-09/89656.htm
CentOS 6.3 下配置 Nginx 加载 ngx_pagespeed 模块 http://www.linuxidc.com/Linux/2013-09/89657.htm
CentOS 6.4 安装配置 Nginx+Pcre+php-fpm http://www.linuxidc.com/Linux/2013-08/88984.htm
Nginx 安装配置使用详细笔记 http://www.linuxidc.com/Linux/2014-07/104499.htm
Nginx 日志过滤 使用 ngx_log_if 不记录特定日志 http://www.linuxidc.com/Linux/2014-07/104686.htm
————————————– 分割线 ————————————–
Nginx 的详细介绍 :请点这里
Nginx 的下载地址 :请点这里