一、什么是反向代理
反向代理(Reverse Proxy)是指以代理服务器来接收客户端的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给客户端。
与正向代理不同,正向代理代理的是客户端,而反向代理代理的是服务端。客户端不需要任何配置即可访问,对客户端是透明的。
二、反向代理的典型应用场景
- 负载均衡:将请求分发到多台后端服务器,提高系统并发处理能力
- SSL 卸载:在代理层处理 HTTPS 加密解密,后端使用 HTTP
- 缓存加速:缓存静态资源,减轻后端服务器压力
- 安全隔离:隐藏后端服务器的真实 IP 地址
三、实际配置示例
以下是一个为医疗追溯系统配置 Nginx 反向代理的示例,将域名的请求转发到后端 4000 和 4001 端口的服务。
# /etc/nginx/conf.d/trace.conf
server {
listen 80;
server_name vip.example.com;
# 主应用 - 反向代理到 4000 端口
location / {
proxy_pass http://127.0.0.1:4000;
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;
}
# API 接口 - 反向代理到 4001 端口
location /api/ {
proxy_pass http://127.0.0.1:4001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 静态资源
location /static/ {
alias /opt/app/static/;
expires 30d;
}
}
四、配置要点说明
4.1 proxy_pass
proxy_pass 指令指定后端服务器的地址。注意 URL 末尾是否有斜杠会影响路径的转发行为:
proxy_pass http://127.0.0.1:4000;— 保留完整的请求路径proxy_pass http://127.0.0.1:4000/;— 会去掉 location 匹配的部分
4.2 proxy_set_header
默认情况下,Nginx 转发请求时会修改 Host 头为后端地址。为了让后端获取真实的客户端信息,需要设置以下请求头:
Host— 保留原始请求的域名X-Real-IP— 客户端真实 IPX-Forwarded-For— 代理链路 IP 记录X-Forwarded-Proto— 原始协议(http/https)
五、验证与测试
配置完成后,先测试语法是否正确:
nginx -t
确认无误后重新加载配置:
nginx -s reload
然后使用 curl 验证代理是否生效:
curl -I http://vip.example.com/
提示:生产环境建议同时配置 HTTPS(Let's Encrypt 免费证书),并通过 return 301 将 HTTP 请求重定向到 HTTPS。
六、总结
Nginx 反向代理是 Web 服务部署中非常基础且重要的能力。通过合理配置 proxy_pass 和请求头,可以灵活地将请求分发到不同的后端服务,同时保证客户端信息的正确传递。在实际项目中,建议结合负载均衡、缓存和 HTTPS 配置一起使用,以获得更好的性能和安全性。