Nginx 反向代理 + 负载均衡 + 跨域 详解
一、基础概念区分
- 反向代理(Reverse Proxy) 客户端访问 Nginx,Nginx 向后端真实服务器拿数据再返回客户端;客户端只知道 Nginx 地址,不知道后端服务。正向代理:代理客户端;反向代理:代理服务端。
- 负载均衡(Load Balance) 多台后端应用服务器集群,Nginx 按照策略分发客户端请求,分摊压力、高可用,一台宕机不影响整体。
- 跨域(CORS) 浏览器同源策略:协议、域名、端口任一不同即跨域报错;Nginx 统一代理后前端只访问 Nginx 域名,天然解决跨域,也可 Nginx 配置 CORS 响应头。
三层逻辑:前端→Nginx (反向代理 + 跨域处理)→多台后端 (负载均衡分发)
二、1. 反向代理配置详解
- 核心指令
- proxy_pass http://后端地址;:核心,转发请求
- proxy_set_header:透传客户端真实 IP、Host、请求头(后端拿真实客户端 IP 必备)
最简配置示例
server {
listen 80;
server_name api.xxx.com;
//反向代理所有请求到单个后端
location / {
proxy_pass http://127.0.0.1:8080;
//透传参数,后端获取真实客户端信息
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
参数说明
- $host:请求域名
- $remote_addr:客户端 IP
- $proxy_add_x_forwarded_for:经过所有代理 IP 链
场景:动静分离反向代理
静态资源 (html/js/css) Nginx 本地读取,接口反向代理 Java 后端
server {
listen 80;
server_name www.xxx.com;
# 静态资源不走后端,本地返回
location ~* .(jpg|png|css|js|html)$ {
root /data/static;
}
# 接口全部代理后端
location /api/ {
proxy_pass http://127.0.0.1:8080;
}
}
三、2. 负载均衡配置详解
- 核心模块:upstream(定义后端服务器组,写在 http 块内)
五种负载均衡调度策略
①默认:轮询(round_robin)
请求依次分发到各个后端,默认不加配置就是轮询
http {
upstream backend_server {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend_server; # 引用upstream组名
}
}
}
②加权轮询(weight),权重越高分配请求越多
upstream backend_server {
server 192.168.1.10:8080 weight=3; # 3份流量
server 192.168.1.11:8080 weight=1; # 1份流量
}
③ip_hash:同一个客户端 IP 固定访问同一台后端(解决 session 共享问题)
upstream backend_server {
ip_hash; # 开启ip绑定
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
④least_conn:最少连接优先,请求分给当前连接数最少的服务
upstream backend_server {
least_conn;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
⑤url_hash(第三方模块,缓存场景):相同 URL 固定一台机器
后端服务器状态参数(server 指令附加)
|backup|备份服务器,所有主服务器宕机才启用|
|down|永久下线,不参与负载|
|max_fails=3|连续失败 3 次标记宕机|
|fail_timeout=30s|宕机后 30s 不再转发|
示例:
upstream backend {
server 192.168.1.10:8080 max_fails=2 fail_timeout=20s;
server 192.168.1.11:8080 max_fails=2 fail_timeout=20s;
server 192.168.1.12:8080 backup; # 备用机
}
四、3.Nginx 处理跨域两种方案
方案 1:反向代理规避跨域
前端页面域名:http://front.xxx.com
后端接口:http://127.0.0.1:8080
Nginx 统一绑定front.xxx.com,前端请求/api/*由 Nginx 转发后端,浏览器只访问同一个域名,不存在跨域
server {
listen 80;
server_name front.xxx.com;
# 前端静态页面
location / {
root /data/front;
index index.html;
}
# 接口代理
location /api/ {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
}
}
方案 2:Nginx 配置 CORS 响应头(后端和前端域名分离场景)
浏览器预检 OPTIONS 请求放行,添加跨域 header
location /api/ {
proxy_pass http://127.0.0.1:8080;
//允许跨域
add_header Access-Control-Allow-Origin * always;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS,PUT,DELETE always;
add_header Access-Control-Allow-Headers * always;
//处理预检OPTIONS
if ($request_method = 'OPTIONS') {
return 204;
}
}
always:无论返回码多少都携带跨域头,不加异常状态码 (404/500) 不会返回跨域头。这里的*,最好替换指定域名:https://xxx.com
五、常用调试命令
//校验配置
nginx -t# 重载配置
nginx -s reload
//查看Nginx状态(需开启stub_status模块)
补充常见坑
- proxy_pass 末尾斜杠问题导致接口 404
- 跨域 OPTIONS 请求被拦截,前端预检失败
- upstream 服务宕机没配置 max_fails 导致请求卡死
- 不加 proxy_set_header Host,后端域名解析异常

浙公网安备 33010602011771号