Nginx 高性能网关实战:从反向代理到负载均衡的完整指南
Nginx 凭借高并发、低内存占用的特性,几乎统治了现代 Web 架构的入口层。无论是静态资源服务、反向代理、负载均衡还是网关安全,Nginx 都是第一选择。本文从核心配置出发,给出生产可用的实战方案。
一、Nginx 的进程模型与性能本质
Nginx 采用 master-worker 多进程模型:master 负责管理与热加载配置,worker 负责处理请求。每个 worker 基于事件驱动(epoll)异步处理海量连接,因此:
- worker 数量通常设为 CPU 核数(
worker_processes auto;); - 每个 worker 的连接数上限由
worker_connections控制,默认 1024 可调至 4096; - 总并发上限 ≈
worker_processes × worker_connections。
worker_processes auto;
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 4096;
}
二、静态资源服务与缓存加速
2.1 基本静态服务
server {
listen 80;
server_name static.example.com;
root /data/www;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# 带指纹的文件长缓存
location ~* \.(css|js|png|jpg|webp|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
2.2 Gzip 压缩
gzip on;
gzip_comp_level 6;
gzip_min_length 1k;
gzip_types text/plain text/css application/json application/javascript image/svg+xml;
三、反向代理与负载均衡
3.1 负载均衡的四种策略
| 策略 | 指令 | 适用场景 |
|------|------|----------|
| 轮询 | 默认 | 后端无状态且能力均等 |
| 权重 | weight=3 | 机器性能不均 |
| IP 哈希 | ip_hash | 需要会话粘滞 |
| 最小连接 | least_conn | 请求耗时差异大 |
upstream api_servers {
least_conn;
server 10.0.1.11:8080 weight=2;
server 10.0.1.12:8080;
server 10.0.1.13:8080 backup; # 备份节点,平时不参与
keepalive 32; # 与上游保持长连接
}
server {
listen 443 ssl;
server_name api.example.com;
location /api/ {
proxy_pass http://api_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 5s;
proxy_read_timeout 30s;
}
}
注意:proxy_pass http://api_servers;(不带 URI)会保留原始路径,带 URI 则会替换匹配前缀——这是最常见的配置误区。
四、HTTPS 与 HTTP/2
4.1 TLS 配置基线
server {
listen 443 ssl http2;
server_name www.example.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
# HSTS:强制浏览器走 HTTPS
add_header Strict-Transport-Security "max-age=31536000" always;
}
4.2 HTTP 跳转 HTTPS
server {
listen 80;
server_name www.example.com;
return 301 https://$host$request_uri;
}
五、限流与访问控制
5.1 漏桶限流
# 定义限流区域:按 IP 限 20 req/s(burst 允许 40)
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=20r/s;
server {
location /api/ {
limit_req zone=api_limit burst=40 nodelay;
proxy_pass http://api_servers;
}
}
5.2 并发连接限制
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
location /download/ {
limit_conn conn_limit 4; # 单 IP 最多 4 并发
limit_rate 1m; # 单连接限速 1MB/s
proxy_pass http://file_servers;
}
}
5.3 IP 黑白名单
location /admin/ {
allow 10.0.0.0/8;
deny all;
proxy_pass http://admin_servers;
}
六、日志管理与排查
6.1 结构化访问日志
log_format json_escape escape=json
'{"time":"$time_iso8601","remote":"$remote_addr","method":"$request_method",'
'"uri":"$request_uri","status":$status,"bytes":$body_bytes_sent,'
'"rt":$request_time,"ua":"$http_user_agent"}';
access_log /var/log/nginx/access.log json_escape;
结构化 JSON 日志可直接接入 ELK / Loki 做可视化监控。
6.2 常用排查命令
nginx -t # 校验配置语法
nginx -s reload # 平滑重载配置(不中断连接)
tail -f /var/log/nginx/error.log
nginx -T | grep -A5 "upstream" # 导出完整配置检查
七、高可用:keepalived + 双机热备
单台 Nginx 依然是单点。生产环境通常用 keepalived 实现 VIP 漂移:
# keepalived.conf(主节点)
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
virtual_ipaddress { 10.0.0.100 } # 虚拟 IP,故障自动漂移
}
主节点宕机后,备用节点自动接管 VIP,对客户端无感知。
结语
Nginx 的配置语法看似简单,真正的功力在于理解每个指令的性能影响与排错方法。从 worker 调优、静态缓存、负载均衡到限流防护,把本文的配置基线沉淀为团队的模板,入口层的稳定性就有了保障。记住:每次改动配置都先 nginx -t,再平滑 reload——稳定压倒一切。
评论(0)
登录 后参与评论。