在 IDC 运维日常中,Nginx 绝对是最核心的组件之一。它不仅能做静态资源服务,更强大的功能是反向代理和负载均衡。无论是隐藏后端服务、统一入口管理,还是横向扩展应对流量高峰,Nginx 的反代能力都是运维的必修课。本文从零开始,带你搭建一个生产级的 Nginx 反向代理架构。
一、反向代理是什么?
简单来说:客户端访问的是 Nginx,Nginx 帮它去后端服务器拿数据再返回给客户端。客户端不知道后端服务器的存在——这就是"反向代理"。
几个典型场景:
- 隐藏后端服务:后端是内网 IP,不暴露给公网
- 统一 SSL 终端:Nginx 处理 HTTPS,后端走 HTTP
- 静态资源缓存:Nginx 直接返回静态文件,不用惊动后端
- 负载均衡:多台后端分担请求
二、基础反代配置
最简单的反向代理只需要三行:
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}但这还不够。生产环境必须加上超时、缓冲和头信息传递:
location /api/ {
proxy_pass http://backend_server;
proxy_connect_timeout 10s;
proxy_read_timeout 30s;
proxy_send_timeout 30s;
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_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 16k;
}这里的关键配置解释:
- proxy_connect_timeout:连接后端超时,默认 60s 太长,10s 足够
- proxy_read_timeout:读后端响应超时,长连接 API 可适当调大
- X-Forwarded-For:传递真实客户端 IP,后端日志必须依赖这个
- proxy_buffering:开启缓冲可减少后端连接占用
三、负载均衡配置
当单台后端扛不住时,用 upstream 定义一组后端服务器:
upstream backend_cluster {
least_conn;
server 10.0.1.10:8080 weight=3 max_fails=2 fail_timeout=30s;
server 10.0.1.11:8080 weight=1 max_fails=2 fail_timeout=30s;
server 10.0.1.12:8080 backup;
keepalive 32;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend_cluster;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}Nginx 支持多种负载均衡算法:
- 轮询(默认):逐个分配请求
- least_conn:分配给连接数最少的服务器,适合长连接场景
- ip_hash:按客户端 IP 哈希,保证同一客户端始终访问同一台后端(session 粘滞)
- weight:权重,性能好的机器分更多请求
关键参数说明:
- max_fails + fail_timeout:健康检查。30s 内失败 2 次就暂时摘除该节点
- backup:备用节点,所有主节点挂了才启用
- keepalive:到后端的空闲长连接数,减少 TCP 握手开销
四、WebSocket 代理
很多实时应用(在线终端、聊天、监控面板)需要 WebSocket 支持,配置稍有不同:
location /ws/ {
proxy_pass http://backend_ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 3600s;
}注意三个关键点:HTTP 版本必须是 1.1、Upgrade 头必须传递、read_timeout 要足够长(不然 WebSocket 会被断)。
五、常见问题与调优
1. 502 Bad Gateway
最经典的反代报错。原因:后端没启动、端口错了、防火墙拦截、超时。排查步骤:先 curl 后端端口确认通不通,再看 Nginx error_log。
2. 客户端 IP 获取不到
检查 X-Forwarded-For 是否正确传递,后端应用(PHP/Java/Python)要从这个头获取真实 IP,不能取 remote_addr。
3. 大文件上传失败
加 client_max_body_size 100m;,默认只有 1M。
4. 性能调优
worker_processes auto;
worker_connections 4096;
worker_rlimit_nofile 65535;
sendfile on;
tcp_nopush on;
tcp_nodelay on;六、生产环境建议
- 日志分离:每个站点独立 access_log 和 error_log,方便排查
- 限流保护:用
limit_req和limit_conn防止后端被打垮 - 健康检查端点:后端暴露 /health 接口,Nginx 配合做主动健康检测
- 监控告警:监控 Nginx 的 5xx 状态码比例,异常时第一时间通知
- 灰度发布:利用 upstream 的 weight=0 和 backup 实现流量切换
总结
Nginx 反向代理是 IDC 运维的必备技能。从简单的端口转发到复杂的多集群负载均衡,掌握这些配置能让你轻松应对绝大多数场景。记住:配置写好后用 nginx -t 先检查语法,确认无误再 nginx -s reload,这是运维的基本素养。
评论