Nginx性能狂飙:吃透这 4 大核心并发参数,让服务器!

Nginx是大型架构核心,下面详解Nginx并发性能@mikechen

1. worker_processes(工作进程数)

这是最重要的一点,直接决定能利用多少CPU核心。

Nginx性能狂飙:吃透这 4 大核心并发参数,让服务器!

# 推荐设置:等于CPU核心数,或 auto(Nginx 1.11+ 支持)
worker_processes auto;
# 或者手动指定(推荐生产环境明确写死)
worker_processes 8;  # 根据你的CPU核心数调整,一般是物理核数或核数×线程数(如超线程)

查看核心数命令:

cat /proc/cpuinfo | grep "cpu cores" | uniq
lscpu | grep "CPU(s):"
# 或者使用自动检测(推荐)
worker_processes auto;

最佳实践:worker_processes = CPU物理核心数 × (1~2),有超线程建议乘2。

 

2. worker_connections(单个进程最大连接数)

每个worker进程能接受的最大并发连接数。

Nginx性能狂飙:吃透这 4 大核心并发参数,让服务器!

events {
    # 默认是1024,太低了!高并发必改
    worker_connections 10240;   # 常见值:10240 ~ 65535
    # 或者更高(需要配合系统限制)
    worker_connections 32768;
}

理论最大并发 = worker_processes × worker_connections

例如:8个进程 × 10240 = 81,920 并发(理论值)

 

3. 系统级连接数限制(ulimit 和 sysctl)

Nginx再牛,也受限于操作系统文件句柄和连接数限制。

Nginx性能狂飙:吃透这 4 大核心并发参数,让服务器!

修改用户级限制(ulimit):

# 永久修改 /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576
root soft nofile 1048576
root hard nofile 1048576

修改系统级限制:

# /etc/sysctl.conf 加入以下参数
fs.file-max = 1048576
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 16384
net.core.netdev_max_backlog = 16384

# TCP连接复用优化(强烈推荐)
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0   # 已经被废弃,建议不要开
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 300

# 应用配置
sysctl -p

4. multi_accept(一次接受多个连接)

让每个worker进程一次性接受尽可能多的新连接,而不是一个一个来。

Nginx性能狂飙:吃透这 4 大核心并发参数,让服务器!

events {
    use epoll;                  # Linux推荐使用epoll
    worker_connections 10240;
    multi_accept on;            # 默认是off,一定要打开!
}

最终推荐高并发配置示例(10万+并发常见配置):

worker_processes auto;          # 或写死为CPU核心数×2
worker_rlimit_nofile 1048576;   # 覆盖ulimit限制(非常重要!)

events {
    use epoll;
    worker_connections 32768;
    multi_accept on;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    keepalive_requests 100000;

    # 连接频率限制(防CC攻击)
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    limit_conn addr 50;

    # 其他优化...
}

验证当前能支持多少并发

# 查看Nginx最大文件句柄
cat /proc/$(cat /run/nginx.pid)/limits | grep "Max open files"

# 查看系统当前连接数
ss -s
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧