术语表

反向代理 (Reverse Proxy)

最后核实

定义

反向代理是代表后端服务器接收客户端连接、再把请求转发给后端的服务器,通常同时承担 TLS 终止。

反向代理代表一台或多台后端服务器接收客户端连接,再把每个请求转发到合适的后端。客户端只看得到代理的地址和证书。Nginx、HAProxy、Apache、Caddy、Envoy、CDN 和云负载均衡都经常扮演这个角色,宝塔面板里的“反向代理”功能本质上也是生成 Nginx 配置。它与正向代理相反,正向代理是替客户端去访问外部服务器。

为什么重要

大多数 HTTPS 部署都在反向代理上做 TLS 终止:证书集中放在一处,统一控制协议版本和 HSTS,把 HTTP 跳转到 HTTPS,后端在内网里只跑明文 HTTP。代理还要把后端看不到的信息转交过去:原始 Host、客户端 IP 和原始协议。缺少 X-Forwarded-Proto 时,很多框架会以为请求走的是 HTTP,于是生成 http:// 链接或陷入重定向循环。代理上常见的证书错误有两个:只配了叶子证书而不是完整证书链,以及证书和私钥不配对。

例子

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    http2 on;
    server_name example.com;
    ssl_certificate     /etc/ssl/example.com/fullchain.pem;
    ssl_certificate_key /etc/ssl/example.com/privkey.pem;

    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 $scheme;
    }
}

常见误区

  • 后端应用也要装证书。 只有终止 TLS 的组件需要证书,除非代理到后端还要重新加密。
  • 后端能看到访客的真实 IP。 后端看到的是代理的地址,除非代理转交了客户端 IP,且后端只信任来自代理的这个请求头。
  • 反向代理和正向代理是一回事。 正向代理服务于向外访问的客户端,反向代理服务于访问网站的访客。

延伸阅读