本文将分享我个人在2核2G的 Ubuntu 上对 Nginx 的高并发配置,在其他 Linux 系统上可能不一样,仅供参考。性能说明由于我这是个人的2核2G小机器,磁盘也很小,请求量过大所以我没有看访问access.log日志,无法计算出QPS/TPS等指标,并且正在对外提供服务,我没有做压测,并不知道极限在哪里,所以我只能给出目前正常对外服务时的一些情况:
- 请求量:平均每秒1368次请求;每分钟8万次请求;每小时492万次请求;每天1亿次请求;每月34亿次请求
- 并发量:3千左右(netstat -apn|grep nginx|wc -l)
- CPU:在50%~60%
- HTTPS:未开启,开启SSL以后CPU会爆满
为啥请求量每秒1千3,但并发量3千?因为我Nginx后面还有业务服务啊,后面的业务需要时间处理,如果每秒处理不了1千3,nginx 这里就需要维护连接等待我后面的业务响应,并发数就大于每秒请求数了。
环境说明
- 硬件:共享云主机 2核心 AMD EPYC,2G 内存,4G SWAP
- 系统:Ubuntu 22.04.3 LTS
- 软件:Nginx 1.18.0
- SSL:关闭,由 CDN 提供 HTTPS 证书加密,回源使用 HTTP 协议
操作系统配置在 Linux 中一切皆文件,我们的 tcp 连接也会用文件来表示,所以我们需要先调整 Linux 操作系统的配置,因为 Linux 会限制一个进程最大文件打开数。文件打开数编辑 /etc/security/limits.conf 文件,每一行描述一个用户配置,在后面新增:
www-data soft nofile 1048576
www-data hard nofile 1048576
我给 nginx 分配的执行用户是 www-data,请根据你的实际情况编写配置。这个配置的意思是将软限制和硬限制都设置到 9999999。编辑 /etc/systemd/system.conf 文件,有则修改,无则添加 DefaultLimitNOFILE:
DefaultLimitNOFILE=65535:524288
编辑 /etc/sysctl.conf 文件,添加 fs.file-max:
fs.file-max = 1048576
vm.max_map_count = 1048576
编辑 /etc/default/nginx 文件,添加 ULIMIT:
ULIMIT="-n 1048576"
编辑 /proc/sys/vm/max_map_count 文件内容:1048576,调整连接跟踪模块的最大连接数,可以直接执行命令:
echo 1048576 > /proc/sys/vm/max_map_count
Nginx 配置编辑 nginx 的配置文件,我的是在 /etc/nginx/nginx.conf,主要有以下改动:
- worker_processes 2; #按照CPU线程数填
- worker_rlimit_nofile 65535; #最大打开文件数
- events 中 worker_connections 65535; #每个线程服务多少个客户端
- events 中 multi_accept on; #让每个进程接受多个连接。
- events 中 use epoll; #较新 Linux 版本的首选连接方法,连接复用?
合并起来,如下配置:
user www-data;
worker_processes 1;
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
http 节点中的配置,就需要根据你实际的后端服务去调整了,比如请求头,请求体的相关大小,我就不做展示了。查看配置生效情况内核参数的调整可能需要重启,建议重启,不能重启时,执行命令:
sysctl -p
执行 ulimit -n 查看当前配置的文件打开数,然后先通过 ps 命令寻找 nginx 的进程编号,我这里是 601,然后打印进程的限制:
cat /proc/601/limits
看下 Max open files 的限制是不是已经变了。