企业级nginx内核优化篇

1. cpu核心配置

   方法1: worker_processes auto;  自动调用[推荐]
   方法2: worker_processes 4;  手工配置

        检查CPU核心:yum install numactl 
        命令: numactl --hardware
    [root@leilei ~]# numactl --hardware
     available: 1 nodes (0)
     node 0 cpus: 0 1
     node 0 size: 4095 MB
     node 0 free: 194 MB
     node distances:
     node   0 
       0:  10 

2. cpu绑定减少进程切换:

   #如  双核CPU配置:  worker_cpu_affinity 01  10;
        四核cpu配置:  worker_cpu_affinity 0001 0010 0100 1000;
        八核cpu配置:  worker_cpu_affinity 0001 0010 0100 1000 1001 1010 1100 1101;   
                   自动切换:  worker_cpu_affinity auto;

3. 进程优先级:

   方法1: worker_priority 0; 默认配置
   方法2: worker_priority -20;  优先级最高   

4. 并发连接:

     worker_connections  100000;
        nginx默认为1024,当访问量过大时1024就不够用了
        需要修改worker_rlimit_nofile文件打开数,这个不能被worker_connections超出,否则会出现wern,所以基本配置:
        worker_rlimit_nofile 65535;  #不应该超过ulimit -a中的数值.
        worker_connections  100000;  #单个work进程的最大并发数
        
        worker_rlimit_nofile 65535;
        worker_connections  100000;

5. 事件处理模型:

events {
    use epoll;
    worker_rlimit_nofile 65535;    
        worker_connections  100000;  #上下游连接加起来 都是使用这个句柄数.
    multi_accept on;   #允许尽可能接受多的连接  默认值off 建议改为 on
    accept_mutex on;   # 防止被唤醒,从而加重服务器压力,默认值 off 建议改为on
    accept_mutex_delay 10ms;  # 设置获得互斥锁的最少延迟时间。 默认值 500ms
    }

6. 开启同时接受多连接

    events {
        multi_accept on;
                }

7. 避免频繁唤醒

    events {
        accept_mutex on;
                }

8. sendfile 高效传输:

     配置区块: http server location
        sendfile   on;

9. 内核优化:

   cat /etc/sysctl.cnf
   net.core.netdev_max_backlog = 1000 #默认值1000  在高并发情况下该值可以改为 102400
   net.core.somaxconn = 128           #默认值1000  在高并发情况下可以设置更高 102400
   net.ipv4.tcp_max_orphans = 32768   #默认值32768 这是TCP连接套戒指缓存,用于防止DDOS攻击,在内存较大时可以修改的大一些 如: 102400
   net.ipv4.tcp_max_syn_backlog = 256 #默认值256   这是用于记录未被确认的连接,一般需要加大 如: 102400
   net.ipv4.tcp_timestamps = 1        #默认值1     这是用于数据包时间戳的支持设置,避免网络异常,默认值 1  建议修改为 0 禁用此设置
   net.ipv4.tcp_synack_retries = 5    #默认值5     这是设置内核放弃TCP连接之前向客户端发送SYN+ACK包的数量,用于三次握手,如果值设置过多会影响性能 建议改为 2 
   net.ipv4.tcp_syn_retries = 5       #默认值5     与上面功能类似,建议修改为 2 

10. 多核负载均衡:

  listen  80 reuseport;
   listen 443 ssl http2 default_server reuseport;
   连接请求的速度是很高的,但是请求不需要大量的处理,reuseport 也能大幅提高性能,此优化项需要继续centos7以上或Linux内核3.9以上的版本才可以使用. 因为它是基于内核层面负载均衡
   引用reuseport参数后,对引用的socket,accept_mutex参数将会无效

11. TCP连接握手优化[内核调优]:

        net.ipv4.tcp_syn_retries = 6                   #主动建立连接,发送SYN报文的重试次数.
        net.ipv4.ip_local_port_range = 32768 60999     #建立连接后本地端口的可用范围
        net.ipv4.tcp_fastopen = 3                      #fast open 配置:  0 关闭   1 作为客户端使用  2 作为服务器使用  3 无论客户端和服务器都可以使用
        net.ipv4.tcp_retries1 = 3                      #丢包重传上限,到达上限,更新缓存
        net.ipv4.tcp_retries2 = 15                     #丢包重传上限,到达上限,更新缓存
        net.ipv4.ip_local_port_range = 20000 65535     #可用端口范围
        net.ipv4.tcp_sack = 1                          #错误状态快速恢复
        #net.ipv4.tcp_fack = 1                         #拥塞避免和 快速重传功能 当tcp_sack设置为0的时候,这个值即使设置为1也无效
        net.ipv4.tcp_max_syn_backlog = 128             #syn_rcvd状态连接最大个数# 防止TCP半连接报文攻击
        net.ipv4.tcp_synack_retries =  1               #三次握手中的第二次握手,该配置决定Linux内核放弃连接之前发送syn+ack确认包的数量
        net.ipv4.tcp_tw_recycle = 1                    #TCP连接中的time_wait sockets的快速回收
        net.ipv4.tcp_tw_reuse = 1                      #开启连接复用,将time_wait sockets重新用于新的tcp连接.
        net.ipv4.ip_local_port_range = 20000 65535     #对外处理连接的端口反围
        fs.file-max = 204800                           #文件句柄数
        
        这些调优参数加入到 /etc/sysctl.conf 后 使用 sysctl -p 让他生效

12. TCP连接建立优化

    net.core.netdev_max_backlog = 25000     #默认128 [防止syn攻击backlog] 这是接受来自网卡,但是未被内核协议栈处理的报文队列长度.
    net.ipv4.tcp_max_syn_backlog = 25000    #默认128 syn_rcvd状态连接最大个数# 防止TCP半连接报文攻击

13. TCP设置时间戳,避免复用

    net.ipv4.tcp_timestamps = 0

14. 主动建立连接应用层超时时间[反向代理相关]

     proxy_connect_timeout  60s;

15. 超出处理能力,对新来的SYN直接丢弃连接 [别配置]

     net.ipv4.tcp_abort_on_overflow = 0

16. SYN队列满后,新的SYN不进入列队 1代表启用 0 关闭

    net.ipv4.tcp_syncookies = 1