Nginx是大型架构核心,下面我详解Nginx优化@mikechen
进程与连接优化
worker_connections & worker_processes,这两个参数直接决定了 Nginx 能支撑的最大并发连接数。

# Nginx 配置文件 (nginx.conf)
worker_processes auto; # 自动匹配CPU核心数
worker_cpu_affinity auto; # 开启CPU亲和性绑定,避免进程上下文切换
events {
worker_connections 65535; # 单个 worker 进程允许的最大连接数
use epoll; # 显式指定使用 epoll 事件模型
multi_accept on; # 收到新连接通知后,尽可能多地接受连接
}
光改 Nginx 没用,必须同步修改 Linux 系统的文件句柄限制。
# /etc/security/limits.conf
* soft nofile 655350
* hard nofile 655350
网络全连接优化
在高并发请求瞬间涌入时,如果内核队列满了,客户端就会收到拒绝服务或超时错误,这是决定网络吞吐量的“咽喉”。

# /etc/sysctl.conf
# 提升系统全局的 listen 队列最大长度
net.core.somaxconn = 65535
# 提高半连接队列长度,防范 SYN Flood 攻击并应对突发流量
net.ipv4.tcp_max_syn_backlog = 65535
同时在 Nginx 的 listen 指令中必须显式指定 backlog(默认值通常只有 511):
Nginx
server {
listen 80 backlog=65535;
}
零拷贝与缓冲区优化
处理静态资源(如图片、JS/CSS、大文件)时的绝对神器,能够实现吞吐量的指数级提升。

sendfile (Zero-Copy):传统文件传输需要经过:磁盘 -> 内核缓冲区 -> 用户缓冲区 -> Socket 缓冲区 -> 网卡。
开启 sendfile 后,数据直接在内核态完成 磁盘 -> 内核缓冲区 -> 网卡 的传输,跳过了用户态的内存复制,CPU 利用率直线下降。
http {
sendfile on; # 开启高效文件传输模式(零拷贝)
tcp_nopush on; # 激活 TCP_CORK 选项,包裹数据包后再发送
tcp_nodelay on; # 禁用 Nagle 算法,提高实时响应性
# 保持连接超时时间
keepalive_timeout 65;
}
tcp_nopush 与 tcp_nodelay 组合拳
在 sendfile 开启时,tcp_nopush on 会让 Nginx 尽可能攒满一个完整的 TCP 包再发送,避免频繁的碎片包对带宽的浪费。

而 tcp_nodelay on 则确保在最后的响应阶段,即使数据不满一个包也立即发送,降低延迟。
Nginx 内部对这两个看似矛盾的参数做了完美的兼容和动态平衡。