nginx性能调优及高并发配置

nginx_process_model

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全能解析及性能优化

nginx平台架构


nginx性能调优及高并发配置
https://centyuan.github.io/2023/11/07/中间件/nginx性能调优及高并发配置/
作者
hlyuan
发布于
2023年11月7日
许可协议