发布作者: 大鱼
百度收录: 正在检测是否收录...
作品采用: 《 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 》许可协议授权
反向代理是nginx最常用的功能之一:用户只访问nginx,由它把请求转发给后端的应用,再把结果原样返回浏览器。后端因此不必直接暴露在公网,换端口、换机器、迁移服务都只需要改一处配置。本文给出一份可以直接复制的反向代理配置,并逐行解释每条指令实际起什么作用,重点讲清proxy_pass结尾有没有斜杠造成的路径差异,以及四个proxy_set_header为什么必须写、漏写会出现什么症状。最后附一个Typecho跑在8091端口、通过80端口对外提供服务的完整实例。全文只讲一件事,看完就能把自己机器上的后端服务安全地挂到nginx后面。
# 这段配置写进 `nginx.conf` 的 `http` 块内,或者放进 `conf.d/` 目录下任意一个 `.conf` 文件里。
server {
listen 80;
server_name blog.example.com;
location / {
proxy_pass http://127.0.0.1:8091;
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 30s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
} 是必写项,不是可选优化。少写 X-Forwarded-Proto 的表现最隐蔽:页面能打开、登录也正常,但后台生成的链接全是 http://,HTTPS` 站点会一直往明文跳。| 行 | 作用 |
|---|---|
listen 80 | 对外监听端口,用户访问的是这个 |
server_name | 匹配哪个域名,可写多个,用空格隔开 |
location / | 匹配所有路径;也可写 /api/ 只代理某个前缀 |
proxy_pass | 后端地址,结尾有无斜杠语义不同,见下文专题 |
Host $host | 把用户访问的域名传给后端。不写,后端会以为自己是被人用 127.0.0.1:8091 访问的,生成的绝对链接和跳转地址都会错 |
X-Real-IP | 真实客户端 IP。不写,后端日志里全是 127.0.0.1 |
X-Forwarded-For | 代理链上的 IP 列表,$proxy_add_x_forwarded_for 会在已有值后追加 |
X-Forwarded-Proto | 原始协议是 http 还是 https,后端据此生成链接。漏了会让 HTTPS 站点跳回明文 |
proxy_connect_timeout | 与后端建立连接的超时 |
proxy_read_timeout | 等待后端响应的超时,后端慢查询、大文件导出要调大 |
proxy_send_timeout | 向后端发送请求的超时 |
proxy_pass 后面带了 URI,哪怕只是一个 /,nginx 就会用这个 URI 替换掉 location 匹配到的部分;不带 URI 则原样转发,所以后端接口本身没有 /api 前缀时,也就是大部分情况,应该写成 proxy_pass http://127.0.0.1:8091;,不带斜杠。加了斜杠往往变成 404,而 nginx -t 依然通过,属于难查的一类配置错误。| 写法 | 请求 /api/user 实际转发到 |
|---|---|
proxy_pass http://127.0.0.1:8091; | http://127.0.0.1:8091/api/user,原样保留 |
proxy_pass http://127.0.0.1:8091/; | http://127.0.0.1:8091/user,/api/ 前缀被替换掉 |
nginx -t 报错会直接指出文件和行号sudo nginx -t
sudo systemctl reload nginx502 说明 nginx 连不上后端,先用第二条确认后端进程和端口是否正常curl -I http://127.0.0.1 -H "Host: blog.example.com"
curl -I http://127.0.0.1:8091NAS 上的 Typecho 跑在 10.0.0.2:8091,让它通过 80 端口对外,注意 proxy_pass 结尾没有斜杠。把 blog.example.com 和 10.0.0.2:8091 换成你自己的域名与后端地址即可server {
listen 80;
server_name blog.example.com;
location / {
proxy_pass http://10.0.0.2:8091;
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_read_timeout 60s;
}
}
—— 评论区 ——