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
- 安全审计失真
请求流大概是这样:
浏览器
|
v
Nginx 城市总闸口
|
v
后端服务 127.0.0.1:3001
|
v
业务处理后返回
|
v
Nginx 再回给浏览器这里还有一个很常见的坑:proxy_pass 结尾的斜杠。
location /api/ {
proxy_pass http://api_backend;
}通常会把原始 URI 继续带给后端,比如 /api/users 仍然带着 /api/users。
location /api/ {
proxy_pass http://api_backend/;
}这类写法则常用于“把匹配前缀替换掉”,例如把 /api/users 转成后端看到的 /users。
初学时一定别凭感觉写。
你要先想清楚:后端想收到的是原路径,还是去掉前缀后的路径。