一、反向代理基础概念与工作原理
1. 正向代理 vs 反向代理(核心区分)
2. 反向代理完整工作流程
用户请求:浏览器访问域名
api.xxx.com,DNS 解析到 Nginx 服务器公网 IP;Nginx 接收请求:监听 80/443 端口,根据域名、路径匹配对应后端服务;
请求转发:Nginx 作为中间人,重新封装 HTTP 请求,转发给内网后端服务(Tomcat/SpringBoot/Node 等);
后端处理响应:后端程序执行业务逻辑,返回数据给 Nginx;
Nginx 回包给客户端:Nginx 接收后端返回结果,再转发给浏览器;
全程隐藏后端:客户端始终只和 Nginx 交互,无法直接访问内网后端服务。
3. 反向代理核心作用
隐藏后端真实服务:内网业务服务器不暴露公网,提升安全;
负载均衡:多台后端服务器分发流量,提高并发与容灾;
动静分离:静态资源(图片 /js/css)Nginx 直接返回,动态接口转发后端;
SSL 统一证书:Nginx 统一处理 HTTPS 证书,后端不用配置 SSL;
限流、缓存、跨域、请求过滤:统一在代理层做网关管控。
二、Nginx 反向代理核心指令说明
核心模块:ngx_http_proxy_module
proxy_pass http://127.0.0.1:8080;核心指令,指定后端服务地址,末尾 / 有无路径差异:
proxy_pass http://127.0.0.1:8080:保留原请求路径转发;例:访问
/user→ 转发http://127.0.0.1:8080/userproxy_pass http://127.0.0.1:8080/:拼接根路径;例:访问
/user→ 转发http://127.0.0.1:8080//user
proxy_set_header:透传客户端真实信息给后端(必备)Host $host:透传访问域名X-Real-IP $remote_addr:客户端真实 IPX-Forwarded-For $proxy_add_x_forwarded_for:链路所有代理 IP
超时控制(防止卡死)
proxy_connect_timeout 60s; # 连接后端超时 proxy_read_timeout 120s; # 读取后端响应超时 proxy_send_timeout 120s; # 向后端发送数据超时缓冲区(优化大响应)
proxy_buffer_size 4k; proxy_buffers 8 4k;
三、Nginx 反向代理实战配置(3 种常用场景)
前置环境
Nginx 安装完成,后端服务:SpringBoot 127.0.0.1:8080
场景 1:基础单后端反向代理(最简单)
文件路径:nginx/conf/conf.d/api.conf
server {
listen 80;
server_name api.test.com; # 对外访问域名
# 反向代理核心配置
location / {
proxy_pass http://127.0.0.1:8080;
# 透传客户端真实信息(后端获取IP必备)
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; # 透传http/https
# 超时配置
proxy_connect_timeout 60s;
proxy_read_timeout 120s;
}
}
场景 2:路径匹配反向代理(多服务共存)
需求:
api.test.com/user/*转发用户服务127.0.0.1:8081api.test.com/order/*转发订单服务127.0.0.1:8082
nginx
server {
listen 80;
server_name api.test.com;
# 用户服务
location /user/ {
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 订单服务
location /order/ {
proxy_pass http://127.0.0.1:8082;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
场景 3:反向代理 + 负载均衡(多台后端集群)
使用 upstream 模块实现多后端轮询分发流量
nginx
# 定义后端服务集群,名称自定义 backend_server
upstream backend_server {
# 轮询策略(默认),请求依次分发
server 127.0.0.1:8080;
server 127.0.0.1:8081;
# 权重策略:weight越大分配流量越多
# server 127.0.0.1:8082 weight=2;
# 备用服务,其他机器挂了才启用
# server 127.0.0.1:8083 backup;
}
server {
listen 80;
server_name api.test.com;
location / {
# 代理到上游集群
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
场景 4:HTTPS 反向代理(统一 SSL 证书)
server {
listen 80;
server_name api.test.com;
# http强制跳转https
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name api.test.com;
# SSL证书路径
ssl_certificate cert/api.test.com.pem;
ssl_certificate_key cert/api.test.com.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
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;
proxy_set_header X-Forwarded-Proto https;
}
}
四、Nginx 配置生效命令
校验配置语法(修改配置后必执行,避免启动失败)
nginx -t
平滑重载配置(不中断现有业务请求)
nginx -s reload
停止 / 启动 Nginx
nginx -s stop
nginx
五、后端服务获取客户端真实 IP(补充)
Nginx 通过X-Real-IP透传客户端 IP,SpringBoot 后端获取方式:
// 获取真实客户端IP
public String getRealIp(HttpServletRequest request) {
String ip = request.getHeader("X-Real-IP");
if(ip == null || ip.isEmpty()){
ip = request.getRemoteAddr();
}
return ip;
}
六、常见踩坑点
proxy_pass 末尾斜杠:路径转发错乱,严格区分有无
/;后端拿不到客户端 IP:缺少
X-Real-IP、X-Forwarded-For配置;接口超时 504:
proxy_read_timeout时间过短,调大时长;HTTPS 后端识别成 HTTP:缺少
X-Forwarded-Proto $scheme,后端跳转异常;负载均衡单点故障:upstream 添加
max_fails、fail_timeout自动剔除故障节点。