Nginx反向代理
代理类型对比
一句话区分:正向代理是“用户找代理帮自己做事”,反向代理是“服务器找代理帮自己接待访客”。
反向代理核心原理(流程图解)
客户端 → 发起请求 → 反向代理服务器(Nginx)
代理服务器 → 接收请求,并转发 → 后端业务服务器(真实Web服务器)
后端服务器 → 处理请求,生成响应 → 代理服务器
代理服务器 → 接收响应,返回给 → 客户端
关键作用:隐藏后端真实服务器,增强安全性,并可实现负载均衡、缓存等。
【步骤详解版 - Nginx反向代理流程】
客户端 (Client)
│
│ ① 发起HTTP请求 (例如: http://www.example.com/)
▼
┌───────────────────┐
│ Nginx反向代理服务器 │ (监听公网80/443端口,对外表现为目标服务器)
│ - 接收客户端请求 │
│ - 识别请求域名/路径 │
│ - 应用负载均衡策略 │
└───────────────────┘
│
│ ② 根据配置(proxy_pass) 转发请求到内部服务器
▼
┌───────────────────┐
│ 后端真实服务器 │ (内网地址,如: http://192.168.8.100:8080)
│ - 处理业务逻辑 │
│ - 访问数据库等 │
└───────────────────┘
│
│ ③ 生成HTTP响应,返回给Nginx
▼
┌───────────────────┐
│ Nginx反向代理服务器 │
│ - 可缓存响应内容 │
│ - 可选压缩或修改响应│
└───────────────────┘
│
│ ④ 将响应返回给客户端
▼
客户端 (Client)核心配置指令
反向代理实现
location / {
index index.php index.html index.htm; #定义首页索引文件的名称
proxy_pass http://后端服务器IP或域名; # 请求转向后台服务器
# proxy_pass http://mysvr ; #请求转向mysvr 定义的服务器列表
}基本反向代理
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:8080; # 后端地址
proxy_set_header Host $host; # 传递原始 Host
proxy_set_header X-Real-IP $remote_addr; # 客户端真实 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; # 传递协议
}
}反向代理优化
请求头转发
location /api/ {
proxy_pass http://backend:3000;
proxy_set_header Host $host; # 传递原始域名给后端
proxy_set_header X-Real-IP $remote_addr; # 传递真实客户端IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链IP列表
proxy_set_header X-Forwarded-Proto $scheme; # 传递原始协议(http/https)
}超时配置
location / {
proxy_pass http://backend;
proxy_connect_timeout 5; # 连接后端超时时间(秒)
proxy_send_timeout 10; # 发送请求超时时间(秒)
proxy_read_timeout 30; # 等待响应超时时间(秒)
}代理缓存
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g;
location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 60m; # 200/302 缓存 60 分钟
proxy_cache_valid 404 1m; # 404 缓存 1 分钟
proxy_cache_use_stale error timeout; # 后端出错时用缓存
add_header X-Cache-Status $upstream_cache_status; # 查看缓存命中状态
}URL转发
# 转发 /api/xxx → http://backend/api/xxx
location /api/ {
proxy_pass http://backend/;
}
# 转发 /api/xxx → http://backend/xxx(去掉 /api 前缀)
location /api/ {
proxy_pass http://backend/;
rewrite ^/api/(.*)$ /$1 break;
}客户端请求体限制
client_max_body_size 10m; # 允许客户端请求的最大单文件大小
client_body_buffer_size 128k; # 缓冲客户端请求体的内存缓冲区大小响应缓冲与性能优化
proxy_buffer_size 4k; # 存储响应头的缓冲区大小
proxy_buffers 4 32k; # 响应内容缓冲区(块数 × 每块大小)
proxy_busy_buffers_size 64k; # 高负荷下允许的最大缓冲区大小(通常为 proxy_buffers 单块 × 2)
proxy_temp_file_write_size 64k; # 响应超出缓冲区时,临时文件单次写入大小
目标服务器地址
proxy_pass http://192.168.8.100; # 请求转发目标
}进阶应用:负载均衡
通过 upstream 定义服务器组,实现请求分发。
配置案例模板:
http {
# 1. 定义后端服务器组
upstream 组名 {
server 后端IP1:端口; # 例如:192.168.8.100:8080
server 后端IP2:端口; # 例如:192.168.8.101:8080
# 可添加负载均衡策略,如 least_conn; (最少连接)
}
server {
listen 80;
server_name 你的域名.com;
location / {
proxy_pass http://组名; # 转发到定义的服务器组
# 此处可加入上述所有 proxy_set_header 和优化参数
}
}
}负载均衡默认策略:轮询(平均分配)。
三大应用场景速记
堡垒机/安全网关:代理暴露在外,保护内部业务服务器安全。
业务统一发布:将多个后端服务通过虚拟主机+反向代理整合到统一入口。
缓存加速(CDN):Nginx可缓存后端响应,直接返回给用户,加速访问。
记忆口诀与易错点
核心区别口诀:“正向代理帮用户,反向代理护后端。”
配置关键指令:“
proxy_pass定去向,upstream组集群,proxy_set_header传真身。”易错提醒:
proxy_pass后的URL是否带斜杠/会影响请求路径的传递方式,需注意。配置修改后,务必执行
nginx -t测试语法,再nginx -s reload平滑重启。
原创
Nginx反向代理
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法