Nginx 性能优化

优化方法论:
在这里插入图片描述
Nginx应用软件方面:
工作进程、提升优先级、绑定cpu、延迟处理新连接、事件处理模型、并发连接数、同时接受多连接、工作进程负载均衡方式、文件io、隐藏 Nginx 版本号(server_tokens off)、TLS/SSL优化

worker_processes  4; #工作进程数量
worker_priority  -3; #进程优先级
worker_cpu_affinity  auto; #绑定CPU

events {
    use epoll;  #事件模型
    worker_connections  65535; #单个工作进程最大同时连接数
    multi_accept on;  #负载均衡锁
}
http {
    sendfile on;  #零拷贝io
    aio  on;  #异步io
    directio 4m; #直接io
     server {
         listen 80  deferred reuseport  
         #deferred:延迟处理新连接 
         # reuseport:工作进程负载均衡方式 性能优于multi_accept,使用后multi_accept就不会生效了 前提内核3.9+
         proxy_connect_timeout 60s
     }
} 

linux内核优化
可参考内核参数列表详解
内核参数详解—www.kernel.org文档
TCP三次握手优化思路
TCP四次挥手优化思路

#网络优化
cat /etc/sysctl.cnf
#三次握手
#主动方
net.ipv4.tcp_syn_retries = 5  #主动发起TCP SYN连接超时重传的次数,超时时间统计成公式2^(n+1) - 1
net.ipv4.ip_local_port_range = 32768 60999 #主动发起连接时使用的端口范围
#被动方
net.ipv4.tcp_max_syn_backlog = 1024	       #半连接队列长度(syn_rcvd状态)
net.ipv4.tcp_syncookies = 1 #仅当 SYN 半连接队列放不下时,再启用syncookies 功能 (用于应对 SYN 泛洪攻击)
net.ipv4.tcp_synack_retries = 5	#被动建立连接,半连接状态时发送syn+ack的重试次数,重试N次失败后断开连接时间公式2^(n+1) - 1
net.core.netdev_max_backlog = 8096 #接收自网卡,但未被内核协议栈处理的报文队列长度
net.ipv4.tcp_abort_on_overflow =0 #tcp_abort_on_overflow 设为 0 可以提高连接建立的成功率,只有你非常肯定 accept 队列会长期溢出时,才能设置为 1 (为1的作用:全连接队列满了直接回RST包,表示废掉这个握手过程和这个连)
net.core.somaxconn = 128 #系统级监听队列的长度 全连接队列取决于min(backlog,somaxconn) *backlog设置 例如在nginx的listen的backlog参数
net.ipv4.tcp_fastopen = 3 #开启TFP/TCP快速打开

#四次挥手
#主动方
net.ipv4.tcp_orphan_retries = 0 #重发 FIN 报文次数默认值是 0,特指 8 次
net.ipv4.tcp_max_orphans = 16384 #定义了孤儿连接或者FIN_WAIT1状态的最大数量
net.ipv4.tcp_fin_timeout = 60 #FIN_WAIT2 状态下连接的持续时长。
net.ipv4.tcp_max_tw_buckets = 5000 #当 TIME_WAIT 的连接数量超过该参数时,新关闭的连接就不再经历 TIME_WAIT 而直接关闭。
net.ipv4.tcp_tw_reuse = 1 #将 TIME_WAIT 状态的端口复用于作为客户端的新连接。
net.ipv4.tcp_timestamps = 1 #复用TIME_WAIT状态连接先决条件
net.ipv4.tcp_tw_recycle = 0 #它并不要求 TIME_WAIT 状态存在 60 秒,很容易导致数据错乱,不建议设置为 1


#读写缓冲区、窗口
net.ipv4.tcp_adv_win_scale = 1 #接收窗口与应用缓存分配,应用缓存=buffer / (2^tcp_adv_win_scale)
net.ipv4.tcp_window_scaling = 1 #扩充窗口 从2的16次方扩到2的30次方
net.ipv4.tcp_moderate_rcvbuf = 1#开启自动调整缓冲区模式
net.ipv4.tcp_wmem = 4096        16384   4194304 #写缓冲区 字节单位
net.ipv4.tcp_rmem = 4096        87380   6291456 #读缓冲区
net.core.rmem_default = 262144 #系统级默认读缓冲区-tcp_rmem会覆盖它
net.core.wmem_default = 262144#系统级默认写缓冲区-tcp_rmem会覆盖它
net.core.rmem_max = 2097152#系统级最大读缓冲区-tcp_rmem会覆盖它
net.core.wmem_max = 2097152#系统级最大写缓冲区-tcp_rmem会覆盖它
net.ipv4.tcp_mem = 88560        118080  177120 #启动压力阈值 页单位

net.ipv4.tcp_retries1 = 3 #此值会影响时间,在此时间之前,TCP决定由于未确认的RTO重传而出了问题,并将这种怀疑报告给网络层。有关更多详细信息,请参见tcp_retries2。RFC 1122建议至少进行3次重传,这是默认设置。
net.ipv4.tcp_retries2 = 15 #当RTO重传未得到确认时,此值会影响有效TCP连接的超时。给定值为N,在初始RTO为TCP_RTO_MIN的指数补偿之后的假设TCP连接将重传N次,然后在第(N + 1)个RTO处终止连接。
#默认值15会产生924.6秒的假定超时,并且是有效超时的下限。TCP将在超出假定超时的第一个RTO处有效地超时。RFC 1122建议至少100秒的超时时间,这对应于至少8的值。

TFP/TCP快速打开密钥设置。后续配合脚本和定时任务自动定期更换密钥为了防止 SYN 泛洪攻击

RAND=$(openssl rand -hex 16)
NEWKEY=${RAND:0:8}-${RAND:8:8}-${RAND:16:8}-${RAND:24:8}
echo "net.ipv4.tcp_fastopen_key=$NEWKEY" > /etc/sysctl.d/50-tcp_fastopen_key.conf
chmod 600 /etc/sysctl.d/50-tcp_fastopen_key.conf; chown root /etc/sysctl.d/50-tcp_fastopen_key.conf
sysctl -p /etc/sysctl.d/50-tcp_fastopen_key.conf
unset RAND NEWKEY
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值