教程
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 带不带斜杠,差很多
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
- Nginx 官方文档:ngx_http_proxy_module(proxy_pass / proxy_set_header / upstream):https://nginx.org/en/docs/http/ngx_http_proxy_module.html
- Nginx 官方文档:ngx_http_gzip_module(gzip_types / gzip_comp_level / gzip_vary):https://nginx.org/en/docs/http/ngx_http_gzip_module.html
最近一周热门文章
按近 7 天访问热度排序,热度积累前优先展示新文章。
当前栏目最新文章
教程 · 继续阅读同栏目的新内容
一起交流
0 条留言LEAVE A NOTE
你的经验,也很重要。
无需注册或登录。请勿公开邮箱密码、证件、银行卡号或其他敏感信息。
















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