zoukankan      html  css  js  c++  java
  • 高流量站点NGINX与PHP-fpm配置优化

    导读 使用Nginx搭配PHP已有7年的经历,这份经历让我们学会如何为高流量站点优化NGINX和PHP-fpm配置。

    small-Nginx

    以下正是这方面的一些提示和建议:
    1. 将TCP切换为UNIX域套接字

    1. 将TCP切换为UNIX域套接字
    UNIX域套接字相比TCP套接字在loopback接口上能提供更好的性能(更少的数据拷贝和上下文切换)。

    但有一点需要牢记:仅运行在同一台服务器上的程序可以访问UNIX域套接字(显然没有网络支持)。

    upstream backend
    {
        # UNIX domain sockets
        server unix:/var/run/fastcgi.sock;
    
        # TCP sockets
        # server 127.0.0.1:8080;
    }
    
    2. 调整工作进程数

    现代计算机硬件是多处理器的,NGINX可以利用多物理或虚拟处理器。

    多数情况下,你的Web服务器都不会配置为处理多种任务(比如作为Web服务器提供服务的同时也是一个打印服务器),你可以配置NGINX使用所有可用的处理器,NGINX工作进程并不是多线程的。

    运行以下命令可以获知你的机器有多少个处理器:

    Linux上 -

    cat /proc/cpuinfo | grep processor
    

    FreeBSD上 -

    sysctl dev .cpu | grep location
    

    将nginx.conf文件中work_processes的值设置为机器的处理器核数。

    同时,增大worker_connections(每个处理器核心可以处理多少个连接)的值,以及将"multi_accept"设置为ON,如果你使用的是Linux,则也使用"epoll":

    # We have 16 cores
    worker_processes 16;
    
    # connections per worker
    events
    {
        worker_connections 4096;
        multi_accept on;
    }
    
    3. 设置upstream负载均衡

    以我们的经验来看,同一台机器上多个upstream后端相比单个upstream后端能够带来更高的吞吐量。

    例如,如果你想支持最大1000个PHP-fpm子进程(children),可以将该数字平均分配到两个upstream后端,各自处理500个PHP-fpm子进程:

    upstream backend {
        server unix:/var/run/php5-fpm.sock1 weight=100 max_fails=5 fail_timeout=5;
        server unix:/var/run/php5-fpm.sock2 weight=100 max_fails=5 fail_timeout=5;
    }
    
    4. 禁用访问日志文件

    这一点影响较大,因为高流量站点上的日志文件涉及大量必须在所有线程之间同步的IO操作。

    access_log off;
    log_not_found off;
    error_log /var/log/nginx-error.log warn;
    

    若你不能关闭访问日志文件,至少应该使用缓冲:

    access_log /var/log/nginx/access.log main buffer=16k;
    
    
    5. 启用GZip
    gzip on;
    gzip_disable "msie6";
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_min_length 1100;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    
    6. 缓存被频繁访问的文件相关的信息
    open_file_cache max=200000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
    
    
    7. 调整客户端超时时间
    client_max_body_size 500M;
    client_body_buffer_size 1m;
    client_body_timeout 15;
    client_header_timeout 15;
    keepalive_timeout 2 2;
    send_timeout 15;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    
    8. 调整输出缓冲区大小

    fastcgi_buffers 256 16k;
    fastcgi_buffer_size 128k;
    fastcgi_connect_timeout 3s;
    fastcgi_send_timeout 120s;
    fastcgi_read_timeout 120s;
    reset_timedout_connection on;
    server_names_hash_bucket_size 100;

    9. /etc/sysctl.conf调优
    # Recycle Zombie connections
    net.inet.tcp.fast_finwait2_recycle=1
    net.inet.tcp.maxtcptw=200000
    
    # Increase number of files
    kern.maxfiles=65535
    kern.maxfilesperproc=16384
    
    # Increase page share factor per process
    vm.pmap.pv_entry_max=54272521
    vm.pmap.shpgperproc=20000
    
    # Increase number of connections
    vfs.vmiodirenable=1
    kern.ipc.somaxconn=3240000
    net.inet.tcp.rfc1323=1
    net.inet.tcp.delayed_ack=0
    net.inet.tcp.restrict_rst=1
    kern.ipc.maxsockbuf=2097152
    kern.ipc.shmmax=268435456
    
    # Host cache
    net.inet.tcp.hostcache.hashsize=4096
    net.inet.tcp.hostcache.cachelimit=131072
    net.inet.tcp.hostcache.bucketlimit=120
    
    # Increase number of ports
    net.inet.ip.portrange.first=2000
    net.inet.ip.portrange.last=100000
    net.inet.ip.portrange.hifirst=2000
    net.inet.ip.portrange.hilast=100000
    kern.ipc.semvmx=131068
    
    # Disable Ping-flood attacks
    net.inet.tcp.msl=2000
    net.inet.icmp.bmcastecho=1
    net.inet.icmp.icmplim=1
    net.inet.tcp.blackhole=2
    net.inet.udp.blackhole=1
    
    10. 监控

    持续监控打开连接的数目,空闲内存以及等待状态线程的数目。

    设置警报在超出阈值时通知你。你可以自己构建这些警报,或者使用类似ServerDensity的东西。

    确认安装了NGINX的stub_status模块。该模块默认并不会编译进NGINX,所以可能你需要重新编译NGINX -

    ./configure --with-http_ssl_module --with-http_stub_status_module --without-mail_pop3_module
    --without-mail_imap_module --without-mail_smtp_module
    make install BATCH=yes

     免费提供最新Linux技术教程书籍,为开源技术爱好者努力做得更多更好:https://www.linuxprobe.com/

  • 相关阅读:
    HDU 2236 无题Ⅱ
    Golden Tiger Claw(二分图)
    HDU 5969 最大的位或 (思维,贪心)
    HDU 3686 Traffic Real Time Query System (图论)
    SCOI 2016 萌萌哒
    Spring Boot支持控制台Banner定制
    构建第一个Spring Boot程序
    Spring Boot重要模块
    Java fastjson JSON和String互相转换
    BCompare 4 Windows激活方法【试用期30天重置】
  • 原文地址:https://www.cnblogs.com/linuxprobe/p/5343613.html
Copyright © 2011-2022 走看看