手把手配置 Nginx 反向代理

手把手配置 Nginx 反向代理引言 Nginx 是生产环境里最常见的反向代理。它轻量、稳定，既能做入口网关，又能做负载均衡与缓存。本文从最小可用配置讲起，逐步加上 WebSocket、超时、缓存、SSL、限流与常见排障，给你一份能直接落地的参考。一、最小可用配置 server { listen 80; server_name app.example.com; location / { proxy_pass http://127.0.0.1:3000; 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_pass 指向后端地址。几个 proxy_set_header 把真实客户端信息带给后端——否则后端日志里看到的连接来源全是 Nginx 自己，出问题时无法定位用户。二、多后端 + 负载均衡 upstream app_pool { least_conn; # 最少连接优先 server 10.0.0.11:3000 max_fails=3 fail_timeout=30s; server 10.0.0.12:3000 max_fails=3 fail_timeout=30s; keepalive 32; # 复用后端连接，降延迟 } server { location / { proxy_pass http://app_pool; ... } } max_fails/fail_timeout 实现简单的被动健康检查：某后端连续失败达到阈值就临时摘掉。keepalive 复用连接能显著降低长尾延迟。三、支持 WebSocket 长连接必须透传 Upgrade 头： location /ws/ { proxy_pass http://app_pool; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } 四、超时与缓冲 proxy_connect_timeout 5s; # 连后端超时 proxy_read_timeout 60s; # 读后端超时（长任务要调大） proxy_send_timeout 60s; proxy_buffering on; # 开启缓冲，后端快、客户端慢时不阻塞 proxy_buffer_size 16k; proxy_buffers 8 32k; 读超时过短会导致长请求被掐断；过大又会拖住 worker。按业务 P99 响应时间权衡。五、缓存静态与加速 proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=webcache:10m max_size=1g inactive=60m; server { location ~* \.(js|css|png|jpg)$ { proxy_cache webcache; proxy_cache_valid 200 10m; add_header X-Cache-Status $upstream_cache_status; } } 用 X-Cache-Status 头可以快速判断命中与否，方便排障。六、SSL 终止在 Nginx 统一做 HTTPS，后端只跑 HTTP： server { listen 443 ssl; ssl_certificate /etc/nginx/certs/fullchain.pem; ssl_certificate_key /etc/nginx/certs/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; location / { proxy_pass http://app_pool; ... } } 七、限流与安全头 limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; server { location /api/ { limit_req zone=api burst=20 nodelay; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header Strict-Transport-Security "max-age=31536000"; proxy_pass http://app_pool; } } 八、日志与排障 log_format proxy '$remote_addr - $upstream_addr - $request - $upstream_response_time'; access_log /var/log/nginx/proxy.log proxy; 常见 502 成因：后端没起来：先 curl http://127.0.0.1:3000 直连验证。 Host 头不对：后端按域名路由时 proxy_set_header Host 必须正确。 UNIX socket 权限：用 proxy_pass http://unix:/run/app.sock; 时注意权限。后端响应超时：调大 proxy_read_timeout。小结反向代理的坑大多集中在“头信息、超时、缓存”三处。把上面这套配齐，90% 的场景都能稳。下一篇我们换 HAProxy，看专业负载均衡器怎么做健康检查与高可用。延伸 Nginx《Admin Guide: HTTP Load Balancing》下一篇：《用 HAProxy 做负载均衡与高可用》