你有没有过这样的时刻——
买了一台云服务器,兴致勃勃搭好了博客,过两天又想跑个私人音乐服务,再过几天又挂了个图床。然后发现这些服务各自占一个端口:http://你的域名:3000、http://你的域名:8080、http://你的域名:9000……地址栏里一串数字,既不优雅,又难记。
更麻烦的是,HTTPS 证书怎么配?3000 端口一个证书、8080 又一个?要疯。
这时候你就需要 Nginx 反向代理了。
什么是反向代理?
用大白话说:反向代理就是你网站的前台接待员。
所有访客都来到 https://你的域名,接待员根据访客想去的地方,把他们引到背后对应的服务去处理。
1 | ┌─ Blog (Hexo, 静态文件) |
访客全程只知道 https://xijun.qd.je 这一个地址。背后的端口、技术栈、内部细节全被 Nginx 遮挡了。
反向是相对于正向代理而言的。正向代理是你替客户端出头(比如翻墙),反向代理是替服务器出头。现在你到任何一个大网站,背后几乎都是用反向代理来承接流量的。
为什么要用反向代理?
不绕弯子,四个核心好处:
1. 统一入口 + 优雅路由
把 http://你的域名:3000 变成 http://你的域名/music/。一个域名走天下,端口号从此消失。
2. SSL 终结(SSL Termination)
证书只需在 Nginx 这一层配一次。Nginx 背后的服务可以继续用 HTTP 通信,加解密这种消耗 CPU 的活交给 Nginx 干。所有服务自动享受 HTTPS。
3. 负载均衡
流量大了、一台机器扛不住时,Nginx 可以把请求分发到多台后端服务器上,自带轮询、最少连接、IP 哈希等策略。
4. 安全隔离
外部无法直接访问你的后端服务。Nginx 可以过滤恶意请求、限制访问速率、屏蔽可疑 IP。后端服务甚至可以只监听 127.0.0.1,完全暴露在公网之外。
Nginx 反向代理配置实战
下面用你服务器上的真实场景来写配置。假设你的博客跑在 Nginx 的根路径下,音乐 API 跑在 localhost:3000。
最基本的反代配置
1 | server { |
注意一个细节:proxy_pass 后面的 URL 带不带末尾的 / 差别很大。
proxy_pass http://127.0.0.1:3000/;— 末尾有/,Nginx 会把匹配到的 location 部分替换掉。请求/music/api/songs会变成http://127.0.0.1:3000/api/songsproxy_pass http://127.0.0.1:3000;— 末尾无/,Nginx 会拼接。请求/music/api/songs会变成http://127.0.0.1:3000/music/api/songs
大多数情况下你想要的是第一种(带 /)。
添加 HTTPS
有了反代配置,加 HTTPS 只需要在 server block 里加几行:
1 | server { |
加上之后,所有 HTTP 请求自动跳转到 HTTPS,证书一次配完全站受益。
代理 WebSocket
如果你的后端服务跑的是 WebSocket(比如即时聊天、实时通知),常规的 proxy_pass 不够,需要额外加两个 header:
1 | location /ws/ { |
这个配置很重要,很多人配 WebSocket 反代翻车就翻在忘了 proxy_http_version 1.1。HTTP/1.0 不支持 WebSocket 升级。
大文件上传
如果你的后端涉及文件上传,Nginx 默认限制 1MB 请求体。需要调整:
1 | location /upload/ { |
超时调整
有些后端接口处理时间长(比如 AI 推理、视频转码),Nginx 默认 60 秒超时会断掉连接:
1 | location /api/ { |
进阶技巧
用 upstream 做负载均衡
如果同一个服务跑了多个实例:
1 | upstream backend_servers { |
weight 参数控制流量分配比例。不设置则等权轮询。
Nginx 还支持 ip_hash(同一 IP 始终发给同一台服务器——对有状态应用有用)、least_conn(发给当前连接数最少的服务器)等负载策略。
缓存后端响应
对于不常变化的后端响应,可以在 Nginx 层缓存,减轻后端压力:
1 | proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=my_cache:10m max_size=1g; |
速率限制
防止某个路由被疯狂刷:
1 | limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s; |
每秒最多 5 个请求,允许突发 10 个。超过的直接返回 503。
调试技巧
配置反代时如果翻车了,以下命令能帮你快速定位:
1 | # 检查配置语法 |
大部分反代翻车的原因就几个:
- proxy_pass 末尾的
/搞反了 — 这是最频繁的翻车点 - 忘记转发 Host header — 后端根据 Host 做路由时会挂
- HTTPS 证书路径配错 — Nginx 启动时检查证书存在性,路径不对直接拒绝启动
- 防火墙没放通 — 后端端口被 iptables 或云服务商安全组挡了
小总结
Nginx 反向代理的价值用一个场景就能说清楚:
假设你的服务器上跑了 5 个服务,它们分布在不同的端口上。没有反代,你要记 5 个端口号、给 5 个服务分别配 HTTPS 证书、维护 5 个访问策略。有了反代,所有东西归到一个入口、一张证书、一套规则里管理。
它像是一种编程里的「抽象」——在你和复杂的后端系统之间加了一层简洁的接口。
刚接触的人可能觉得多了一层东西,反而复杂了。但等你配好一劳永逸之后,再回头看那些端口号直接暴露的日子,你会觉得——早该这么做。
回到最初的问题:怎么让 :3000、:8080、:9000 全部消失?
答案:在它们前面站一个 Nginx。
不只是让端口消失,更是让你的基础设施有了一个统一的「大门」。小到个人博客,大到淘宝京东,入口处站的本质上都是同一类东西——反向代理。