nginx性能调优及高并发配置
Nginx: 采用:单线程,异步非阻塞处理请求,事件驱动,IO复用技术(epoll),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换。所以才使得Nginx支持更高的并发。
所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接
事件处理(select/poll/epoll/kqueue这样的系统调用,可以监控多个事件)相比多线程:没有上下文切换,事件处理非常轻量,只会占用更多内存
一:nginx层面优化
worker_processes 1; # 1.nginx进程数,一般设置cpu的核心数或核心数X2,一般为它的倍数,
worker_rlimit_nofile 65535; # 2.一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致
events {
use epoll; # 3.使用epoll的I/O模型
worker_connections 65535; # 4.每个worker进程允许的最多连接数,理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections
multi_accept on; # 设置一个进程是否同时接受多个网络连接,默认为off
accept_mutex on; # 5.设置网路连接序列化,防止惊群现象发生,默认为on
}
http {
access_log off; #取消服务日志
keepalive_timeout 0; # 6.禁用keepalive_timeout或设置较低值(60)
gzip on; # 7.开启压缩功能
# 表示允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取
gzip_min_length 1k;默认值是0,表示不管页面多大都进行压缩,建议设置成大于1K。如果小于1K可能会越压越大
gzip_buffers 4 32k; #压缩缓存区大小
gzip_http_version 1.1; #压缩版本
gzip_comp_level 6; #压缩比率, 一般选择4-6,为了性能
gzip_types text/css text/xml application/javascript application/octet-stream; #指定压缩的类型
gzip_vary on; #是否传输gzip压缩标志
gzip_disable "MSIE [1-6]\."; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
gzip_proxied off; # 设置请求者代理服务器,该如何缓存内容
Nginx做为反向代理的时候启用:
off – 关闭所有的代理结果数据压缩
expired – 如果header中包含”Expires”头信息,启用压缩
no-cache – 如果header中包含”Cache-Control:no-cache”头信息,启用压缩
no-store – 如果header中包含”Cache-Control:no-store”头信息,启用压缩
private – 如果header中包含”Cache-Control:private”头信息,启用压缩
no_last_modified – 启用压缩,如果header中包含”Last_Modified”头信息,启用压缩
no_etag – 启用压缩,如果header中包含“ETag”头信息,启用压缩
auth – 启用压缩,如果header中包含“Authorization”头信息,启用压缩
any – 无条件压缩所有结果数据
#设定请求缓冲
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
proxy_connect_timeout 90; # 8.proxy超时设置
proxy_send_timeout 90;
proxy_read_timeout 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k
#sendfile 开启高效文件传输模式,指定 nginx 是否调用 sendfile 函数(zero copy零拷贝方式)来输出文件,
#搭配二选一:tcp_nopush或tcp_nodelay开启
#可防止网络及磁盘I/O阻塞,提升Nginx工作效率
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#平衡磁盘与网络I/O处理速度,可防止网络及磁盘I/O阻塞,提升Nginx工作效率,降低系统的uptime.
sendfile on; # 9.开启高效文件传输模式。
tcp_nopush on; # (优化大文件传输和网络阻塞)需要在sendfile开启模式才有效:每个数达到阈值时一次性发送,减少网络报文段的数量。
tcp_nodelay on; # (优化小块传输)使缓冲区数据立即发送
sendfile_max_chunk 100k; # 10.每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
upstream my_back {
server 127.0.0.1:7878;
server 192.168.10.121:333 backup;# 热备
}
server {
keepalive_requests 120; # 单连接请求上限次数
#为静态文件启用缓存为静态文件启用缓存,以减少带宽并提高性能,可以添加下面的命令,限定计算机缓存网页的静态文件:
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
}
}
}
worker_cpu_affinity auto; # 10. cpu的亲和配置,cache不会因为进程切换而失效
二:系统层面
# 调整同时打开文件数量ulimit针对当前shell的当前用户
ulimit -n 20480 # 1.shell级限制
vim /etc/security/limits.conf # 2.用户级限制
# 添加下面两行
soft nofile 65535 #应用软件级别的最大可打开文件数的限制
hard nofile 65535 #操作系统级别的最大可打开文件数的限制
vim /proc/sys/fs/file-max # 3.系统级别限制
# TCP最大连接数
echo 10000 > /proc/sys/net/core/somaxconn
# TCP连接立即回收、回用(recycle、reuse)
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
# 不做TCP洪水抵御
echo 0 > /proc/sys/net/ipv4/tcp_syncookies
可以直接使用优化后的配置,在/etc/sysctl.conf中加入:
# TCP最大连接数,每一个端口最大的监听队列的长度,默认128,负载要求很高(并发要求很大)的服务程序的要求是远远不能满足的
net.core.somaxconn = 2048
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216
net.ipv4.tcp_mem = 786432 2097152 3145728
net.ipv4.tcp_max_syn_backlog = 16384
net.core.netdev_max_backlog = 20000
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_syn_backlog = 16384、
# tcp连接重用
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
# 不抵御洪水攻击
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144 #该参数用于设定系统中最多允许存在多少TCP套接字不被关联到任何一个用户文件句柄上,主要目的为防止Ddos攻击
vm.swappiness = 10 #物理内存剩下10%时使用虚拟内存
使用:sysctl -p 生效
sysctl -p
# 总限制文件句柄数
cat /proc/sys/fs/file-max
# 当前使用的文件句柄数
cat /proc/sys/fs/file-nr
# 修改
vim /etc/security/limits.conf
(*表示所有用户、soft表示可以超出,但只是警告;hard表示绝对不能超出,unlimited用于表示不限制)
### 缓存+gzip+sendfile+http2
# 三:nginx+keepalived实现高可用
# 四:nginx -s reload 平滑升级(创建新的worker接受新的请求,旧的worker等处理完所有请求后关闭)
参考:
nginx性能调优及高并发配置
https://centyuan.github.io/2023/11/07/中间件/nginx性能调优及高并发配置/