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 日志。