Nginx 反向代理配置:负载均衡与静态资源
什么是 Nginx 反向代理
反向代理是位于客户端与后端服务器之间的中间层。客户端的所有请求首先到达 Nginx,由 Nginx 根据配置规则将请求转发给后端服务器处理,再将响应返回给客户端。对客户端而言,反向代理就像原始服务器一样工作。
与正向代理(代表客户端访问外部资源)不同,反向代理代表服务器接收请求,主要优势包括:
- 安全隔离:隐藏后端真实服务器信息,客户端只能看到 Nginx。
- 负载均衡:将流量分配到多台后端服务器,提高可用性与性能。
- SSL 终端:集中处理 HTTPS 加密,减轻后端压力。
- 缓存与压缩:加速静态资源响应,降低带宽消耗。
- 统一入口:多个应用通过同一域名或 IP 的不同路径对外提供服务。
本教程将带领你从零开始配置 Nginx 反向代理,并讲解负载均衡、静态资源处理等核心场景。
环境准备与 Nginx 安装
如果尚未安装 Nginx,可以根据操作系统选择以下命令快速部署。本文以 Ubuntu/Debian 和 CentOS 为例。
Ubuntu / Debian
sudo apt update
sudo apt install nginx -y
CentOS / RHEL
sudo yum install epel-release -y
sudo yum install nginx -y
安装完成后,启动并设置开机自启:
sudo systemctl start nginx
sudo systemctl enable nginx
通过浏览器访问服务器 IP 或域名,看到 Welcome to nginx! 即表示安装成功。
提示:所有配置文件均位于
/etc/nginx/下。主配置文件为nginx.conf,站点配置通常放置在/etc/nginx/conf.d/或/etc/nginx/sites-available/(配合sites-enabled)。推荐使用独立配置文件管理每个站点。
基础反向代理配置
反向代理的核心指令是 proxy_pass。它将请求转发到指定的后端服务器地址。
最小化配置示例
假设我们有一台运行在 http://localhost:3000 的 Node.js 应用,需要让外部通过域名 example.com 访问。
- 创建配置文件
/etc/nginx/conf.d/example.conf:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost: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;
}
}
- 检查配置并重载 Nginx:
sudo nginx -t
sudo systemctl reload nginx
关键指令说明
| 指令 | 作用 |
|---|---|
proxy_pass |
定义转发目标地址,支持 HTTP/HTTPS 和 Unix Socket。 |
proxy_set_header Host |
传递原始请求的 Host 头,避免后端收到 localhost。 |
X-Real-IP |
记录真实客户端 IP。 |
X-Forwarded-For |
代理链 IP 列表。 |
X-Forwarded-Proto |
原始请求协议 (http/https)。 |
这些头信息对后端日志记录、安全校验等至关重要。
负载均衡配置
Nginx 可以将请求分发到多台后端服务器,提供横向扩展能力。
定义上游服务器组
使用 upstream 模块定义一组后端服务器:
upstream backend_servers {
server 192.168.1.10:3000;
server 192.168.1.11:3000;
server 192.168.1.12:3000 backup; # 备用服务器
}
然后在 server 块中引用:
location / {
proxy_pass http://backend_servers;
}
负载均衡策略
| 策略 | 指令 | 说明 |
|---|---|---|
| 轮询(默认) | 无需额外配置 | 请求按顺序逐一分配。 |
| 加权轮询 | weight=N |
服务器性能越高,权重越大。 |
| IP 哈希 | ip_hash; |
同一客户端 IP 始终分配到同一后端(需考虑临时 IP 变化)。 |
| 最少连接 | least_conn; |
请求分配给活动连接数最少的服务器。 |
| 随机 | random; |
随机分配。 |
加权轮询示例:
upstream backend_servers {
server 192.168.1.10:3000 weight=5;
server 192.168.1.11:3000 weight=2;
}
IP 哈希示例(适合 Session 保持):
upstream backend_servers {
ip_hash;
server 192.168.1.10:3000;
server 192.168.1.11:3000;
}
注意:如果使用
ip_hash,添加或移除服务器可能导致部分客户端分配变化。可考虑使用sticky cookie等更灵活的会话保持方式。
静态资源代理与缓存优化
反向代理经常需要处理静态资源(图片、CSS、JS 等)。我们可以让 Nginx 直接提供这些文件,或从后端代理后缓存下来。
方案一:直接由 Nginx 提供静态文件
如果后端应用没有直接提供静态文件的需求,可以让 Nginx 处理来自特定目录的文件。
location /static/ {
alias /var/www/example/static/;
expires 30d;
add_header Cache-Control "public, immutable";
}
方案二:代理后缓存
当静态资源需要经过后端处理(如权限检查)或后端生成时,我们可以让 Nginx 缓存后端响应。
首先定义缓存路径和参数:
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:10m max_size=1g inactive=60m use_temp_path=off;
}
然后在 location 中启用缓存:
location /images/ {
proxy_pass http://backend_servers;
proxy_cache static_cache;
proxy_cache_valid 200 302 24h;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
add_header X-Cache-Status $upstream_cache_status;
}
proxy_cache_path:定义缓存存储位置、缓存区名称、大小及过期时间。proxy_cache_valid:对不同响应状态码设置缓存有效期。add_header X-Cache-Status:调试用,可查看命中情况(HIT / MISS / EXPIRED)。
常见场景与高级配置
多站点反向代理(基于域名或路径)
一个 Nginx 实例可以为多个域名或路径代理不同后端。
按域名区分:
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://api_backend;
}
}
server {
listen 80;
server_name admin.example.com;
location / {
proxy_pass http://admin_backend;
}
}
按路径区分:
server {
listen 80;
server_name example.com;
location /api/ {
proxy_pass http://api_backend/;
}
location /admin/ {
proxy_pass http://admin_backend/;
}
}
注意
proxy_pass末尾的/:带/会将匹配的路径部分替换掉,不带/则保留原始 URI。
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;
}
限制请求速率与连接数
保护后端不被突发流量压垮:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
location / {
limit_req zone=mylimit burst=20 nodelay;
proxy_pass http://backend_servers;
}
}
超时设置
合理的超时配置能避免资源占用:
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 20s;
故障排查与测试
配置完成后,务必验证并观察日志:
检查语法
sudo nginx -t
重载配置
sudo systemctl reload nginx
查看错误日志
tail -f /var/log/nginx/error.log
测试代理是否生效
使用 curl 查看响应头:
curl -I http://yourdomain.com
若返回后端应用的响应头,说明代理成功。
总结
Nginx 反向代理是构建高扩展性、高可用性 Web 架构的基石。通过 proxy_pass 实现请求转发,配合 upstream 与负载均衡策略分发流量,再结合静态资源缓存大幅提升性能。掌握这些内容后,你能够:
- 将单体应用平滑扩展至多台服务器。
- 保护后端服务并统一访问入口。
- 高效地调度静态和动态内容。
建议在生产环境中结合 SSL 证书、防火墙规则以及监控告警,形成完整的服务接入层。下一步可以深入探索 Nginx 的 微服务网关模式、动态健康检查及与容器化平台的集成。