问题:最近的抢购有点火,到点抢购的时候网站就会出现502错误 顶不住消费者的压力。
之前php-fpm配置: 单个php-fpm实例,使用socket方式,内存8G 静态方式,启动php-fpm进程数300,具体参数如下
由于架构,代码等原因,单台几百并发就出现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来处理请求。 具体操作:
启动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处理多少时间,都是开发者需要考虑的点。 (责任编辑:IT) |