侧边栏壁纸

Nginx反向代理配置

2026年11月01日 6阅读 0评论 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;
    }
}

逐行说明

  • 后四个proxy_set_header 是必写项,不是可选优化。少写 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 结尾的斜杠

  • 规则是:只要 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 nginx

验证

  • 第一条返回后端的状态码,说明代理通了;返回 502 说明 nginx 连不上后端,先用第二条确认后端进程和端口是否正常
curl -I http://127.0.0.1 -H "Host: blog.example.com"
curl -I http://127.0.0.1:8091

一个具体例子

  • NAS 上的 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;
    }
}
0赞

—— 评论区 ——

博主关闭了所有页面的评论