来源:运维技术圈 | 发布日期:2026-05-26
生产级 Nginx 性能优化
Nginx 性能调优是在 CPU、内存、网络 I/O 之间寻求平衡的艺术。核心内功:看懂底层逻辑,摸透流量特性,结合监控数据,小步快跑地验证式调优。
优化框架总览
第一道防线:OS 内核调优(文件句柄 + TCP 协议栈)
第二道防线:Nginx 全局指令(Worker + Events)
第三道防线:HTTP 层 I/O 调优(sendfile/gzip/缓存)
第四道防线:Upstream 代理调优(Buffer/超时/重试)
云原生场景:K8S sysctl / 优雅停机 / Ingress-Nginx ConfigMap
监控兜底:stub_status / VTS / nginx-prometheus-exporter
第一道防线:操作系统内核调优
文件句柄限制
# /etc/security/limits.conf
* soft nofile 655350
* hard nofile 655350
# /etc/sysctl.conf
fs.file-max = 655350
TCP 协议栈压榨
# TIME-WAIT 复用(短连接场景极其重要)
net.ipv4.tcp_tw_reuse = 1
# ⚠️ 绝对不要开启 tcp_tw_recycle(新内核已废弃,NAT 下严重丢包)
# FIN-WAIT-2 等待时间
net.ipv4.tcp_fin_timeout = 15
# TIME_WAIT 最大数量
net.ipv4.tcp_max_tw_buckets = 262144
# 全连接/半连接队列
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 262144
# TCP Keepalive(默认 2h,缩短到 10min)
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 3
# TCP 缓冲区(大文件传输或高延迟网络)
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
第二道防线:Nginx 全局指令
Worker 进程与 CPU 亲和性
worker_processes auto; # 自动按 CPU 核心数设定
worker_cpu_affinity auto; # 绑核(1.9.10+ 支持 auto)
worker_rlimit_nofile 655350; # worker 进程最大文件数
Events 事件模型
events {
use epoll; # Linux 必选 epoll
worker_connections 65535; # 每 worker 最大连接数
multi_accept on; # 一次性接受所有新连接(缓解惊群)
}
理论最大并发 = worker_processes × worker_connections,反向代理场景一个请求占两个连接,实测量需减半。
第三道防线:HTTP 层 I/O 调优
http {
## 基础 I/O
sendfile on; # 零拷贝,大幅提升静态文件传输
tcp_nopush on; # 累积到最大报文再发送(配合 sendfile)
tcp_nodelay on; # 禁用 Nagle 算法(低延迟优先)
## 长连接
keepalive_timeout 60; # 客户端长连接超时
keepalive_requests 10000; # 单连接最大请求数
## Gzip 压缩
gzip on;
gzip_comp_level 5; # 1(最快)~9(最慢),建议 4~5
gzip_vary on; # 代理缓存识别
gzip_min_length 1024; # <1KB 不压缩
gzip_types text/plain text/css text/javascript ...
gzip_disable "msie6";
## 请求体限制与缓存
client_body_buffer_size 128k;
client_max_body_size 100m;
client_header_buffer_size 1k;
large_client_header_buffers 4 8k;
## 静态文件缓存(防磁盘 IO 成为瓶颈)
open_file_cache max=65535 inactive=60s;
open_file_cache_valid 80s;
open_file_cache_min_uses 2;
## 日志缓冲(防日志写入拖慢主流程)
access_log /var/log/nginx/access.log main buffer=64k flush=5s;
}
第四道防线:Upstream 代理调优
Proxy Buffer
location / {
proxy_buffering on; # 开启代理缓冲
proxy_buffer_size 8k; # 响应头 buffer 大小
proxy_buffers 8 64k; # 响应体 buffer 数量和大小
proxy_busy_buffers_size 128k; # 发送给客户端时的最大 buffer
}
Proxy Buffer 让 Nginx 飞速接收后端响应后缓存到内存,再慢慢发给客户端,迅速释放后端线程。
超时与重试
location / {
proxy_connect_timeout 3s; # 内网连接超时(建议 2-5s)
proxy_read_timeout 15s; # 等待后端响应超时
proxy_send_timeout 15s; # 发送请求给后端超时
# 失败重试(防止雪崩放大)
proxy_next_upstream error timeout invalid_header
http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3; # 限制重试次数
}
云原生(K8s)场景
Pod sysctl 调整
securityContext:
sysctls:
- name: net.core.somaxconn
value: "65535"
- name: net.ipv4.ip_local_port_range
value: "1024 65535"
优雅停机
worker_shutdown_timeout 30s; # 等现有请求处理完再退出
配合 K8s Deployment:
terminationGracePeriodSeconds: 45
# preStop hook 确保 Endpoint 摘除后再关进程
Ingress-Nginx ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: ingress-nginx-controller
data:
max-worker-connections: "65535"
keep-alive: "60"
keep-alive-requests: "10000"
upstream-keepalive-connections: "64"
监控
location /nginx_status {
stub_status on; # 开启基本状态
access_log off;
allow 10.0.0.0/8;
deny all;
}
核心指标:
Active connections— 当前活跃连接,持续高需排查或扩容Reading / Writing / Waiting— Waiting 高说明长连接复用好,但过高就需调小 keepalive_timeout
推荐方案: Nginx VTS 模块或 nginx-prometheus-exporter 将 QPS、状态码、响应耗时接入 Prometheus + Grafana。
关联页面
| 页面 | 关联点 |
|---|---|
| nginx-config-pitfalls | Nginx 配置常见踩坑(gzip/worker 连接/文件描述符等) |
| nginx-security-config-guide | Nginx 安全加固配置 |
| nginx-502-504-connection-reset-guide | 502/504/Connection Reset 排障 |
| nginx-load-balancing-strategy-guide | 负载均衡策略指南 |
| linux-kernel-tuning-guide | Linux 高并发内核优化(含网络参数) |