Nginx 反向代理 + 负载均衡 + 跨域 详解

一、基础概念区分

  1. 反向代理(Reverse Proxy) 客户端访问 Nginx,Nginx 向后端真实服务器拿数据再返回客户端;客户端只知道 Nginx 地址,不知道后端服务。正向代理:代理客户端;反向代理:代理服务端。
  2. 负载均衡(Load Balance) 多台后端应用服务器集群,Nginx 按照策略分发客户端请求,分摊压力、高可用,一台宕机不影响整体。
  3. 跨域(CORS) 浏览器同源策略:协议、域名、端口任一不同即跨域报错;Nginx 统一代理后前端只访问 Nginx 域名,天然解决跨域,也可 Nginx 配置 CORS 响应头。
    三层逻辑:前端→Nginx (反向代理 + 跨域处理)→多台后端 (负载均衡分发)

二、1. 反向代理配置详解

  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;
}
}

参数说明

  1. $host:请求域名
  2. $remote_addr:客户端 IP
  3. $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. 负载均衡配置详解

  1. 核心模块: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模块)

补充常见坑

  1. proxy_pass 末尾斜杠问题导致接口 404
  2. 跨域 OPTIONS 请求被拦截,前端预检失败
  3. upstream 服务宕机没配置 max_fails 导致请求卡死
  4. 不加 proxy_set_header Host,后端域名解析异常
posted @ 2026-06-08 08:43  modenq  阅读(24)  评论(0)    收藏  举报