2024/2/167 次阅读0 条评论
Nginx 性能优化终极版,让网站无敌丝滑
nginx优化:
1. cpu:核心配置
Terminal
方法1: worker_processes auto; 自动调用[推荐]方法2: worker_processes 4; 手工配置
2. cpu绑定减少进程切换:
Terminal
#如 双核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. 进程优先级:
Terminal
方法1: worker_priority 0; 默认配置方法2: worker_priority -20; 优先级最高
4. 并发连接:
Terminal
worker_connections 100000;nginx默认为1024,当访问量过大时1024就不够用了需要修改worker_rlimit_nofile文件打开数,这个不能被worker_connections超出,否则会出现wern,所以基本配置:worker_rlimit_nofile 65535; #不应该超过ulimit -a中的数值.worker_connections 100000; #单个work进程的最大并发数
5. 事件处理模型:
Terminal
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. 开启同时接受多连接:
Terminal
events { multi_accept on; }
7. 避免频繁唤醒:
Terminal
events { accept_mutex on; }
8. sendfile 高效传输:
Terminal
配置区块: http server locationsendfile on;
9. 内核优化:
Terminal
cat /etc/sysctl.cnfnet.core.netdev_max_backlog = 1000 #默认值1000 在高并发情况下该值可以改为 102400net.core.somaxconn = 128 #默认值1000 在高并发情况下可以设置更高 102400net.ipv4.tcp_max_orphans = 32768 #默认值32768 这是TCP连接套戒指缓存,用于防止DDOS攻击,在内存较大时可以修改的大一些 如: 102400net.ipv4.tcp_max_syn_backlog = 256 #默认值256 这是用于记录未被确认的连接,一般需要加大 如: 102400net.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 net.ipv4.tcp_retries1 = 3 #默认值3 达到路由上线后,更新路由缓存 表示放弃回应一个TCP连接请求前进行重传的次数。 net.ipv4.tcp_retries2 = 15 #默认值15 达到上限后关闭TCP连接 表示放弃在已经建立通讯状态下的一个TCP数据包前进行重传的次数。
10. 多核负载均衡:
Terminal
listen 80 reuseport;listen 443 ssl http2 default_server reuseport;连接请求的速度是很高的,但是请求不需要大量的处理,reuseport 也能大幅提高性能,此优化项需要继续centos7以上或Linux内核3.9以上的版本才可以使用. 因为它是基于内核层面负载均衡引用reuseport参数后,对引用的socket,accept_mutex参数将会无效
11. TCP连接握手优化[内核调优]:
Terminal
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 #文件句柄数#nginx keepalivenet.ipv4.tcp_keepalive_time = 7200 #发送心跳的周期net.ipv4.tcp_keepalive_intvl = 75 #探测包发送重试时间间隔net.ipv4.tcp_keepalive_probes = 9 #探测包重试次数这些调优参数加入到 /etc/sysctl.conf 后 使用 sysctl -p 让他生效
12. TCP连接建立优化:
Terminal
net.core.netdev_max_backlog = 25000 #默认128 [防止syn攻击backlog] 这是接受来自网卡,但是未被内核协议栈处理的报文队列长度.net.ipv4.tcp_max_syn_backlog = 25000 #默认128 syn_rcvd状态连接最大个数# 防止TCP半连接报文攻击
13. TCP设置时间戳,避免复用:
Terminal
net.ipv4.tcp_timestamps = 0
14. 主动建立连接应用层超时时间[反向代理相关]:
Terminal
proxy_connect_timeout 60s;
15. 超出处理能力,对新来的SYN直接丢弃连接 [可以无需配置]:
Terminal
net.ipv4.tcp_abort_on_overflow = 0
16. SYN队列满后,新的SYN不进入列队 1代表启用 0 关闭:
Terminal
net.ipv4.tcp_syncookies = 1
17. 开启自动调整缓存模式:
Terminal
net.ipv4.tcp_moderate_rcvbuf = 1
18 .读缓存最小值,默认值,最大值 该参数会覆盖 net.core.rmem_max 配置:
Terminal
net.ipv4.tcp_rmem = 4096 87380 6291456
19. 写缓存最小值,默认值,最大值 该参数会覆盖 net.core.wmem_max 配置:
Terminal
net.ipv4.tcp_wmem = 4096 16384 4194304
20. 系统无内存压力,启动压力模式阈值,最大值,单位为页的数量:
Terminal
net.ipv4.tcp_mem = 1541646 2055528 3083292
21. 调整接受窗口与应用缓存:
Terminal
net.ipv4.tcp_adv_win_scale = 1计算公式: 应用缓存 = buffer / (2^tcp_adv_win_scale)
22. 启用Nagle算法:
Terminal
该算法会将很多小报文组成一个大的报文发出,减少传输次数,提高带宽利用率,但是会发送延迟.默认开启可用区域: http server location开启方法: tcp_nodelay off; 禁用方法: tcp_nodelay on; [推荐.]
23. 避免小报文发送:
Terminal
默认配置 1460默认关闭 [推荐]postpone_output 1460;开启方法: tcp_nopush on; 仅在 sendfile on; 配置加入的时候这才会生效.
24. 减少time_wait时间.[四次握手等待确认时间]:
Terminal
CLOSE_WAIT状态:如果频繁出现 CLOSE_WAIT 说明应用进程没有及时响应对端关闭连接LAST_ACK状态:等待接收主动关闭端操作系统发来的针对FIN的ack报文.
25. 发送FIN报文的重试次数,0相当于8:
Terminal
net.ipv4.tcp_orphan_retries = 0
26. 保持在FIN_WAIT_2状态的时间:
Terminal
net.ipv4.tcp_fin_timeout = 60
27. time_wait状态连接的最大数量,超出后关闭连接:
Terminal
net.ipv4.tcp_max_tw_buckets = 262144
28. 延迟关闭TCP连接 lingering_close 指令:
Terminal
lingering_close off|on|always
29. 延迟关闭TCP连接 lingering_time 指令:
Terminal
语法: lingering_time time;默认: lingering_time 30s;可用区块: http server location启用后,最长读取用户请求时间为设置的 30s 超出后立刻关闭连接.
30. 检测客户端是否有请求到达,超时后关闭连接:
Terminal
语法: lingering_timeout time;默认: lingering_timeout 5s;可用区块: http server location启用后,检测客户端是否仍有请求到达,超时后没有数据到达则关闭连接.
31. 以rst代替正常四次握手关闭连接:
Terminal
语法: reset_timedout_connection on|off; 默认: reset_tomedout_connection off; 可用区块: http server location
32.TLS/SSL优化握手性能:
Terminal
语法: ssl_session_cache off|none|[builtin[:size]]默认: ssl_session_cache none|off|buitin|shared:name:size;可用区块: http serveroff: 不适用session缓存,并且nginx在协议中告诉客户端session缓存不被使用.none: 不适用session缓存buitin: 使用openssl的session缓存,由于在内存中,所以只有当同一个客户端两次命中到worker进程时,session缓存才会生效.shared:name:size : 定义一个共享内存,为所有woker进程提供session缓存服务,1MB大约可以用于4000个session.
33. http长连接优化:
Terminal
语法: keepalive_requests number默认: keepalive_requests 100;可用区块: http,server,location,upstream
34. gzip压缩:
Terminal
语法: gzip on|off默认: gzip off; 可用区块: http server location if in location 例子:gzip on; #开启压缩gzip_min_length 500; #小于多少字节不压缩gzip_buffers 4 256k; #开辟一块缓冲区进行连续压缩响应gzip_http_version 1.1; #只对http1.1 进行压缩gzip_comp_level 5; # 压缩的级别 [1-9]gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; #需要压缩的类型gzip_vary on; #开启后响应客户端压缩..响应头会增加 Vary: Accept-Encodinggzip_proxied expired no-cache no-store private auth; #是否对上游进行压缩gzip_disable \"MSIE [1-6]\.\"; #不进行压缩
35. 磁盘i/o优化:
Terminal
1. sedfile 零拷贝2. 内存磁盘减少写入:1. aio2. 增大error_log急别3. 关闭access_log4. 压缩access_log5. 是否启用 proxy buffering6. syslog代替本地io
35.1 大文件较多,启用 directIO功能避免buffered io模式下磁盘页缓存的拷贝消耗:
Terminal
直接I/O:directio size|off;默认: directio off;作用区块: http server location例子:server {directio 10M;}
35.2 aio 使用场景:
Terminal
需要添加模块 --with-threads: 例子:1. 配置文件顶部添加线程池: thread_pool leilei threads=32 max_queue=65536;2. 对应模块中调用线程池 aio threads=leilei;
35.3 减少磁盘i/o:
Terminal
官方模块: empty_gif 只能应用于location,默认在nginx中.empty_gif
36.1 日志优化:
Terminal
1. 配置日志压缩: server { access_log logs/leilei.log main buffer=32k gzip=2 flush=5s; }2. 重启nginx3. 通过zcat 查看日志.
36.2 日志传递给syslog [高吞吐量下该配置有利于性能提升]:
Terminal
rsyslog 配置: vim /etc/rsyslog.conf 1. $ModLoad imudp #取消注释$UDPServerRun 514 #取消注释 2. local6.* /var/log/nginx/nginx.log 3. nginx配置文件添加: access_log syslog:server=127.0.0.1:514,facility=local6,nohostname,tag=nginx,serverity=info main;
37. 隐藏nginx版本:
Terminal
http {server_tokens off;}