• [转]你如何面对—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处理多少时间,都是开发者需要考虑的点。

  • 相关阅读:
    带外数据
    数组中的第K个最大元素
    广播和多播
    反转链表
    ioctl操作
    非阻塞式I/O
    [CSP-S模拟测试]:简单的括号序列(组合数)
    [CSP-S模拟测试]:最大异或和(数学)
    关于我
    [CSP-S模拟测试]:礼物(数学)
  • 原文地址:https://www.cnblogs.com/Athrun/p/4596876.html
Copyright © 2020-2023  润新知