7.3.1 反向代理原理与应用场景
反向代理是由代理服务器代替后端服务接收客户端请求,再将请求转发给内部的应用或服务集群,并将响应返回给客户端。客户端只感知到代理的存在,后端拓扑与真实地址被隐藏。与正向代理不同,反向代理面向服务端,强调入口统一、流量控制与安全隔离。
工作流程通常包括:客户端请求到达 Nginx;依据 server/location 规则匹配;选择上游 upstream 节点并转发;处理响应头与内容(如缓存、压缩、重写);返回给客户端。Nginx 通过事件驱动模型与高并发连接处理能力,实现高吞吐低延迟的代理转发。
安装与最小可用示例#
以下示例以单台 Nginx 反向代理两台后端应用为例,包含安装、配置、验证。
# Ubuntu/Debian
sudo apt update
sudo apt install -y nginx
# CentOS/RHEL
sudo yum install -y epel-release
sudo yum install -y nginx
# 启动并设置开机自启
sudo systemctl enable --now nginx
编辑配置文件 /etc/nginx/conf.d/reverse_proxy.conf:
upstream backend_app {
server 10.0.0.11:8080 max_fails=3 fail_timeout=10s;
server 10.0.0.12:8080 max_fails=3 fail_timeout=10s;
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend_app;
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_connect_timeout 3s;
proxy_read_timeout 30s;
}
}
检查与加载配置:
sudo nginx -t
sudo systemctl reload nginx
验证请求分发:
# 预期效果:多次请求返回来自不同后端的响应标识
curl -H "Host: app.example.com" http://127.0.0.1/
后端示例(在 10.0.0.11/10.0.0.12 上):
# 简单起一个 HTTP 服务用于观察来源
python3 -m http.server 8080
关键命令与参数解释#
proxy_pass http://backend_app;:将请求转发至上游集群。proxy_set_header:传递真实 Host 与客户端 IP,便于应用层记录来源。proxy_connect_timeout:与上游建立连接的超时时间。proxy_read_timeout:读取上游响应的超时时间。max_fails/fail_timeout:基本的失败计数与临时摘除机制。
常见应用场景(带示例)#
1) 统一入口与域名聚合(多服务路径路由)
server {
listen 80;
server_name api.example.com;
location /user/ { proxy_pass http://user_svc; }
location /order/ { proxy_pass http://order_svc; }
}
2) 动静分离
location /static/ {
root /var/www/html;
expires 7d;
}
location /api/ {
proxy_pass http://backend_app;
}
3) HTTPS 终止(只示例终止部分)
server {
listen 443 ssl;
server_name app.example.com;
ssl_certificate /etc/nginx/ssl/app.crt;
ssl_certificate_key /etc/nginx/ssl/app.key;
location / { proxy_pass http://backend_app; }
}
排错与验证清单#
# 1. 配置语法检查
sudo nginx -t
# 2. 查看运行状态
sudo systemctl status nginx
# 3. 查看错误日志(确认上游连接失败/超时)
sudo tail -f /var/log/nginx/error.log
# 4. 查看访问日志(确认请求是否到达)
sudo tail -f /var/log/nginx/access.log
# 5. 端口与连通性检测
sudo ss -lntp | grep nginx
curl -v http://10.0.0.11:8080/
curl -v http://10.0.0.12:8080/
常见问题定位:
- 返回 502:上游不可达或连接被拒绝,检查后端服务端口与防火墙。
- 返回 504:上游响应超时,调整 proxy_read_timeout 或后端性能。
- 静态文件 404:检查 root 路径与 location 匹配优先级。
练习#
1) 在本机启动两个不同端口的 python3 -m http.server,配置 Nginx 反向代理并验证轮询分发。
2) 添加 proxy_set_header X-Forwarded-Proto $scheme;,在后端打印该头验证是否正确传递。
3) 将 proxy_read_timeout 设置为 1s,模拟慢响应并观察 504 日志。