引言:Nginx不仅是Web服务器
Nginx早已超越了传统Web服务器的范畴,在现代架构中它同时扮演着反向代理、负载均衡器、API网关、内容缓存等多重角色。然而,大多数运维团队仅使用了Nginx不到30%的能力——默认配置是为通用场景设计的妥协产物,真正的高性能需要针对业务场景逐层调优。本文将从TCP连接、请求处理、缓存策略、高可用部署四个维度,给出生产级的Nginx优化方案。
一、操作系统层:为Nginx铺好基石
Nginx的性能天花板由操作系统参数决定。以下是针对高并发场景的关键系统调优:
# /etc/sysctl.conf — 高并发Web服务器推荐配置
# 最大文件描述符数(每个进程)
fs.file-max = 1000000
# TCP连接队列长度
net.core.somaxconn = 65535
# TCP SYN队列长度(应对SYN flood)
net.ipv4.tcp_max_syn_backlog = 65535
# TIME_WAIT状态优化
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 50000
# TCP保活探测
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
# 允许本地端口范围
net.ipv4.ip_local_port_range = 1024 65535
# TCP缓冲区大小(16MB)
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
同时需要提升Nginx进程的文件描述符限制:
# /etc/security/limits.conf
nginx soft nofile 1000000
nginx hard nofile 1000000
# 或在systemd service中配置
[Service]
LimitNOFILE=1000000
二、事件模型与连接处理优化
Nginx的事件驱动架构是其高性能的根基,正确配置事件模块至关重要:
events {
# epoll是Linux最高效的I/O多路复用
use epoll;
# 单个worker最大连接数
# 总并发 = worker_connections × worker_processes
worker_connections 65535;
# 允许worker一次性接受所有新连接
multi_accept on;
# 优化accept互斥,避免惊群效应
accept_mutex on;
accept_mutex_delay 500ms;
}
Worker进程数的一般原则:worker_processes = CPU核心数(或auto让Nginx自动检测)。对于CPU密集型场景(大量SSL/TLS),可考虑设为核心数的1.5-2倍以更好地利用CPU缓存。
三、请求处理链路优化
从客户端发起请求到收到响应,Nginx的处理链路中每个环节都有优化空间:
3.1 keepalive连接复用
http {
# 客户端keepalive
keepalive_timeout 75s;
keepalive_requests 1000; # 单连接最大请求数
keepalive_disable none;
# 上游keepalive(极其重要!)
upstream backend {
server 10.0.1.10:8080;
server 10.0.1.11:8080;
keepalive 64; # 每个worker到上游的空闲连接池
}
server {
location /api/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
}
上游keepalive连接池是最容易被忽视的性能杀手。没有它,每个请求都要重新TCP三次握手建立到后端的连接,在高QPS下后端会大量处于TIME_WAIT状态。实测开启keepalive后,99分位延迟可降低40-60%。
3.2 请求体与响应体缓冲
http {
# 请求体缓冲(避免写入临时文件)
client_body_buffer_size 128k;
client_max_body_size 50m;
# 响应体缓冲
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 8 128k;
proxy_busy_buffers_size 256k;
# 临时文件存放路径
proxy_temp_path /dev/shm/proxy_temp;
四、多级缓存架构设计
缓存是提升Web性能最有效的手段。Nginx支持三级缓存体系:
4.1 浏览器缓存 — 静态资源
location ~* \.(css|js|png|jpg|jpeg|gif|ico|woff2|svg)$ {
expires 365d;
add_header Cache-Control "public, immutable";
add_header Vary "Accept-Encoding";
etag on;
if_modified_since exact;
}
4.2 Nginx代理缓存 — API与动态内容
http {
proxy_cache_path /data/nginx/cache
levels=1:2
keys_zone=api:100m
max_size=50g
inactive=60m
use_temp_path=off;
server {
location /api/v2/ {
proxy_cache api;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 5s;
# stale-while-revalidate策略
proxy_cache_use_stale updating timeout error;
proxy_cache_background_update on;
# 防止缓存击穿
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
add_header X-Cache-Status $upstream_cache_status;
}
}
}
proxy_cache_lock是一个关键配置——当缓存过期时,只允许一个请求穿透到后端,其余请求等待缓存填充。这有效防止了缓存击穿(Cache Stampede),在高并发场景下可将后端压力降低90%以上。
4.3 FastCGI缓存 — PHP应用专用
http {
fastcgi_cache_path /data/nginx/fcgi_cache
levels=1:2
keys_zone=fcgi:50m
max_size=20g
inactive=30m;
location ~ \.php$ {
fastcgi_cache fcgi;
fastcgi_cache_key "$scheme$host$request_uri$request_body";
fastcgi_cache_valid 200 15m;
fastcgi_cache_use_stale updating timeout;
fastcgi_pass unix:/run/php-fpm.sock;
include fastcgi_params;
}
}
五、高可用部署方案
单机Nginx无论如何优化都是单点故障,生产环境必须实现高可用:
5.1 Keepalived主备切换
# /etc/keepalived/keepalived.conf — 主节点
vrrp_script chk_nginx {
script "curl -sf http://127.0.0.1/health && pgrep nginx"
interval 2
weight -20
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass YourSecretPass
}
virtual_ipaddress {
10.0.0.100/24
}
track_script {
chk_nginx
}
}
Keepalived通过VRRP协议实现VIP漂移,当主节点Nginx不可用时,备节点在1-3秒内接管VIP。
5.2 多活负载均衡架构
对于更高可用性要求,可采用DNS轮询 + 多组Nginx + 各自Keepalived的多活架构。每组内部依然是主备,组之间流量由DNS或Anycast分担,任一组整体故障其余组仍可服务。
六、监控与可观测性
优化的前提是可观测。Nginx的监控方案:
http {
server {
listen 127.0.0.1:9100;
location /nginx_status {
stub_status on;
access_log off;
}
}
log_format detailed "$remote_addr - $remote_user [$time_local] "
"\"$request\" $status $body_bytes_sent "
"\"$http_referer\" \"$http_user_agent\" "
"rt=$request_time uct=$upstream_connect_time "
"uht=$upstream_header_time urt=$upstream_response_time";
access_log /var/log/nginx/access.log detailed;
}
配合Prometheus + nginx-prometheus-exporter可实现全维度指标采集。关键告警指标包括:
- upstream_response_time_p99 — 上游响应99分位延迟
- requests_total rate — QPS异常波动
- upstream_5xx_rate — 上游错误率
- connections_waiting — 等待连接数(排队严重度)
总结
Nginx性能优化是系统工程,需要从OS内核参数、Nginx事件模型、连接复用、缓存策略到高可用部署逐层调优。其中上游keepalive连接池和proxy_cache_lock防击穿是投入产出比最高的两项优化。记住:没有监控的优化是盲目的——先建立可观测性基线,再逐项对比调优效果,用数据驱动每一项配置变更。