为出海而探索,为选择多想一步。CROSSBORDER GEEK / K8N.COM
K8N跨境极客CrossBorder Geek

教程

Nginx 反向代理与网站加速配置入门

为什么要用反向代理

Nginx 反代浏览器到后端流向示意 AI 操作示意图·以官网实际界面为准

新手常把 Nginx 当成"只能放静态网页的服务器"。其实一台机器上你同时跑着一个 Node 应用(3000 端口)、一个 Python 应用(8000 端口)、还想让两个域名都从 80/443 端口进来——靠的就是 Nginx 反向代理:浏览器只跟 Nginx 对话,Nginx 再按规则把请求转发给背后的应用。这样端口不用对外暴露、多站点共用一个入口,还能顺手做压缩和缓存。

1. 最基本的反代写法

核心就两个指令:location 匹配路径,proxy_pass 指定转发到哪。把 Node 应用代理出去:

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

    location / {
        proxy_pass http://127.0.0.1:3000;
        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;
    }
}

这里有个官方文档里反复强调的坑:Nginx 默认不把原始请求的 Host 和 Connection 头传给后端。所以你不显式写 proxy_set_header Host $host;,后端应用拿到的 Host 就是 127.0.0.1:3000,很多靠 Host 判断域名的框架(比如生成跳转链接)立刻就错乱。上面那几行 proxy_set_header 基本是反代标配,照抄即可。

2. proxy_pass 带不带斜杠,差很多

多后端分流与 upstream 示意 AI 操作示意图·以官网实际界面为准

官方文档讲得很细:proxy_pass 后面带不带 URI(斜杠),路径转发行为完全不同:

写法 转发结果
proxy_pass http://127.0.0.1:3000;(不带斜杠) 把原始请求 URI 原样传给后端
location /api/ + proxy_pass http://127.0.0.1:8000/;(带斜杠) 匹配到的 /api/ 部分被替换成 /,即 /api/users → /users

带斜杠是"路径替换",不带是"原样透传"。新手最常见的 404 就是这俩搞反了。

3. 多个后端用 upstream

后端不止一个时,用 upstream 定义一组,Nginx 自动轮询:

upstream node_app {
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
}

server {
    listen 80;
    location / {
        proxy_pass http://node_app;
    }
}

官方文档说,域名解析到多个地址时本来就会轮询;显式写 upstream 的好处是能加 max_fails、backup 这类参数,后面排障也清晰。

4. 顺手做加速:gzip 与静态缓存

反代入口顺便把压缩开了,页面体积能小一半以上(官方原话):

# http 块或 server 块
gzip on;
gzip_min_length 1000;
gzip_comp_level 5;
gzip_types text/plain text/css application/json application/javascript text/xml;
gzip_vary on;

几个要点(以官方文档为准):

  • gzip_types 里不用写 text/html——它默认永远压缩。
  • gzip_comp_level 范围是 1 到 9,数字越大压得越狠越吃 CPU,日常 4-5 足够,别一上来拉满。
  • gzip_vary on 会自动补 Vary: Accept-Encoding,让中间缓存正确区分压缩版。

静态资源单独甩缓存头:

location ~* \.(js|css|png|jpg|webp|woff2)$ {
    expires 7d;
    add_header Cache-Control "public";
}

5. http 跳 https

配好 SSL 之后,把 80 端口的请求统统 301 到 https:

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

改完配置记得校验:

sudo nginx -t          # 语法检查
sudo systemctl reload nginx   # 平滑重载,不中断连接

数据中心网络机柜实拍

反代后应用里拿不到访客真实 IP 怎么办?

那是因为你没传 X-Forwarded-For。在 location 里加上 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;,后端再信任这个头即可。注意只在反代到本机可信后端时才信任它,别让任意访客伪造。

官方资料

资料核对日期:2026-10-25

最近一周热门文章

按近 7 天访问热度排序,热度积累前优先展示新文章。

当前栏目最新文章

教程 · 继续阅读同栏目的新内容

一起交流

0 条留言

还没有留言,来分享你的想法吧。

LEAVE A NOTE

你的经验,也很重要。

无需注册或登录。请勿公开邮箱密码、证件、银行卡号或其他敏感信息。

更多阅读
K8N · CrossBorder Geek

给出海玩家、独立开发者、跨境博主与外贸人的选型笔记。

关于这个博客 ↗