Nginx 中 location 指令用于匹配请求 URI,配合 proxy_pass 实现反向代理;支持前缀、精确、正则匹配,需注意 proxy_pass 末尾斜杠影响路径重写,并须设置 Host、X-Real-IP 等关键代理头。

Nginx 中的 location 指令本身不直接“实现”反向代理,而是用来匹配请求 URI,再配合 proxy_pass 指令完成反向代理转发。关键在于:先用 location 精准匹配路径,再在匹配块内用 proxy_pass 把请求转给后端服务。
location 匹配规则决定转发范围
location 支持多种匹配方式,影响代理行为是否生效:
-
前缀匹配(最常用):
location /api/ { proxy_pass http://127.0.0.1:3000/; }—— 匹配以/api/开头的所有请求 -
精确匹配:
location = /health { proxy_pass http://backend; }—— 只匹配根路径下的/health,不带子路径 -
正则匹配:
location ~* \.(jpg|png|gif)$ { proxy_pass http://static-server; }—— 可用于静态资源分离 - 注意末尾斜杠:
proxy_pass http://127.0.0.1:3000/(带/)会自动剥离location的前缀;proxy_pass http://127.0.0.1:3000(不带/)则保留原路径
常见转发场景与配置写法
实际中几个高频用法:
-
API 接口统一代理:
location /api/ {<br> proxy_pass http://127.0.0.1:8000/;<br> proxy_set_header Host $host;<br> proxy_set_header X-Real-IP $remote_addr;<br>}
→ 请求/api/users被转为http://127.0.0.1:8000/users -
WebSocket 支持(需额外头):
location /ws/ {<br> proxy_pass http://127.0.0.1:9000/;<br> proxy_http_version 1.1;<br> proxy_set_header Upgrade $http_upgrade;<br> proxy_set_header Connection "upgrade";<br>} -
多后端按路径分流:
location /admin/ { proxy_pass http://admin-srv/; }<br>location /user/ { proxy_pass http://user-srv/; }
必须设置的代理头(避免后端取错信息)
仅靠 proxy_pass 不够,后端常依赖以下头获取真实客户端信息:
-
proxy_set_header Host $host;—— 传递原始 Host,否则后端看到的是代理地址 -
proxy_set_header X-Real-IP $remote_addr;—— 获取真实 IP(非 Nginx 本机 IP) -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;—— 追加 IP 链,支持多层代理 -
proxy_set_header X-Forwarded-Proto $scheme;—— 告知后端是 http 还是 https
调试与验证要点
配置完别急着 reload,先检查逻辑是否符合预期:
- 用
nginx -t检查语法是否正确 - 查看 Nginx error 日志(
/var/log/nginx/error.log),常见报错如 “no resolver defined”,多因proxy_pass写了域名但没配resolver - 用
curl -v http://your-domain/api/test观察响应头中的Server、X-Proxy-By等字段,确认是否经过 Nginx 并成功转发 - 后端日志中检查
X-Real-IP是否为真实用户 IP,而非 Nginx 服务器 IP


















