• [转]你如何面对—LNMP高并发时502


    From : http://www.topthink.com/topic/5683.html

    之前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处理多少时间,都是开发者需要考虑的点。

  • 相关阅读:
    ImageLightbox.js – 响应式的图片 Lightbox 插件
    精美素材:10套最新出炉的免费扁平图标下载
    盘点2013年那些最优秀的网页设计作品【系列三】
    12个带给你惊喜用户体验的手机界面设计
    一款效果精致的 jQuery 多层滑出菜单插件
    创意无限:20幅惊人的霓虹灯摄影照片欣赏
    『设计前沿』14款精致的国外 iOS7 图标设计示例
    2013年值得我们学习的网页设计作品【系列二】
    Summernote – 基于 Bootstrap 的文本编辑器
    『摄影欣赏』2013年微软必应搜索十大首页美图
  • 原文地址:https://www.cnblogs.com/Athrun/p/4596876.html
Copyright © 2020-2023  润新知