全书目录

第十七篇:Nginx 完全指南 —— 城市总闸口宇宙

第六章:反向代理 —— 总闸口不办业务,但它把车送到正确的后台城区

1 分钟 440 字 第 326 / 962 个阅读单元

Nginx 最经典的角色,就是反向代理。

也就是:客户端只知道城市总闸口,不知道后面真实业务区在哪;总闸口负责接人、转发、回传。

nginx
upstream api_backend {
    server 127.0.0.1:3001;
}

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://api_backend;

        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;

        proxy_connect_timeout 5s;
        proxy_send_timeout 30s;
        proxy_read_timeout 30s;
    }
}

这几行头部转发非常关键:

  • Host:告诉后端“用户原本访问的是哪个域名”
  • X-Real-IP:告诉后端“真实来访者 IP 是谁”
  • X-Forwarded-For:保留代理链路
  • X-Forwarded-Proto:告诉后端原始请求是 http 还是 https

如果不传这些,后端常见问题会立刻出现:

  • 日志里全是代理机 IP
  • 生成回调地址时协议错了
  • 多域名站点判断错 Host
  • 安全审计失真

请求流大概是这样:

text
浏览器
  |
  v
Nginx 城市总闸口
  |
  v
后端服务 127.0.0.1:3001
  |
  v
业务处理后返回
  |
  v
Nginx 再回给浏览器

这里还有一个很常见的坑:proxy_pass 结尾的斜杠。

nginx
location /api/ {
    proxy_pass http://api_backend;
}

通常会把原始 URI 继续带给后端,比如 /api/users 仍然带着 /api/users

nginx
location /api/ {
    proxy_pass http://api_backend/;
}

这类写法则常用于“把匹配前缀替换掉”,例如把 /api/users 转成后端看到的 /users

初学时一定别凭感觉写。
你要先想清楚:后端想收到的是原路径,还是去掉前缀后的路径。