Nginx反代入门:一个域名管多个服务
一台 VPS 跑博客、面板、API 好几个服务,端口不够分怎么办?小够教你用 Nginx 反向代理,一个域名按路径分发,附完整配置示例。
我是小够,只推够用的 VPS。
买了台 VPS,博客搭起来了,又想跑个监控面板,还想跑个 API 服务——问题来了:一个域名、一个 80 端口,怎么分给好几个服务?答案就是今天的主角:Nginx 反向代理(简称反代),VPS 玩家几乎人人都要学的一招。
反代是什么,一句话讲懂
正常情况:用户访问域名 → 直接打到你的服务。
反代的情况:用户访问域名 → 先打到 Nginx → Nginx 看域名/路径,把请求转发给背后真正的服务,再把结果返回给用户。
Nginx 就是个前台:所有请求先到它这,它按规则分发。好处是:一个 80/443 端口管所有服务,背后跑十个服务也只需要这一个入口,还能顺手把 HTTPS、缓存、防刷都做了。
场景:一个域名,三个服务
假设你的 VPS 上跑着:
- 博客:本机 8080 端口
- 监控面板:本机 3000 端口
- API 服务:本机 5000 端口
目标:blog.你的域名 → 博客,panel.你的域名 → 面板,api.你的域名 → API。或者用路径分:你的域名/blog、你的域名/panel。下面用子域名的方式演示,最常用。
实操:四步配好反代
第一步:装 Nginx
# Debian / Ubuntu
apt update && apt install -y nginx
# 装完先确认跑起来了
systemctl status nginx
第二步:写配置文件
在 /etc/nginx/conf.d/ 下新建一个文件,比如 myproxy.conf:
# 博客
server {
listen 80;
server_name blog.你的域名;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 监控面板
server {
listen 80;
server_name panel.你的域名;
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;
}
}
API 的照葫芦画瓢,把 server_name 和 proxy_pass 的端口换掉就行。
第三步:检查配置并重载
nginx -t # 检查语法,没问题会显示 successful
systemctl reload nginx
第四步:DNS 解析指过来
去域名 DNS 那,把 blog、panel、api 三个子域名都解析到这台 VPS 的 IP。等解析生效,访问 http://blog.你的域名,应该就能看到博客了。
HTTPS:顺手一起做了
明文 HTTP 又慢(浏览器会标"不安全")又不体面,用 Certbot 一键上免费证书:
apt install -y certbot python3-certbot-nginx
certbot --nginx -d blog.你的域名 -d panel.你的域名 -d api.你的域名
Certbot 会自动改 Nginx 配置、自动续期。一条命令,三个域名全上 HTTPS。这也是反代的好处之一:证书只需要在 Nginx 这一层配,背后的服务完全不用管 HTTPS。
三个常见坑
坑一:后端拿不到访客真实 IP
反代之后,后端服务看到的访问 IP 全是 127.0.0.1,因为请求是 Nginx 转发的。解决办法就是配置里那三行 proxy_set_header,把真实 IP 透传过去。面板的访问日志、API 的限流都靠这个,别漏了。
坑二:WebSocket 服务要加两行
有些面板、实时应用用 WebSocket,默认配置下会连不上。在对应的 location 里加两行:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
坑三:防火墙只开 80 和 443
上了反代之后,8080、3000、5000 这些后端端口不需要对外开放了。用防火墙(ufw 或云防火墙)把它们关掉,只留 80/443 和 SSH 端口。少暴露一个端口,就少一分被扫的风险。SSH 安全加固见《SSH 密钥登录》。
进阶:按路径分发
如果子域名不够用(或者懒得解析),也可以按路径分:
server {
listen 80;
server_name 你的域名;
location /blog/ {
proxy_pass http://127.0.0.1:8080/;
}
location /panel/ {
proxy_pass http://127.0.0.1:3000/;
}
}
注意 proxy_pass 末尾的 / 很关键,有和没有是两种行为,照抄上面的写法就行。
反代 vs 端口直接暴露:为什么非要多这一层
有人问:我直接让用户访问 IP:8080 不行吗?行,但有三个代价:
- 难记难看:
http://1.2.3.4:8080这种地址,发给别人都嫌丢人,更别说做业务。 - 没法上 HTTPS:证书是跟域名绑的,IP 加端口玩不转 HTTPS。
- 端口全暴露:每个服务一个端口,每个端口都是一扇门。门越多,被扫到的概率越大。
反代就是把十扇门收成一扇,Nginx 在门口当保安:检查证件(HTTPS)、登记来访(日志)、按预约分流(按域名转发)。多这一层,省的是后面无数的麻烦。
性能优化:两个顺手打开的开关
反代配好之后,顺手开两个优化,访问速度立竿见影:
1. Gzip 压缩
在 http 块里加上:
gzip on;
gzip_types text/css application/javascript application/json;
gzip_min_length 1024;
文本类资源压缩后体积能小 70%,博客这种文字为主的站,首屏速度提升明显。
2. 静态文件缓存
location ~* \.(jpg|jpeg|png|css|js)$ {
expires 7d;
}
图片、样式、脚本让浏览器缓存 7 天,用户第二次打开基本秒开。注意:文件名不变内容变了的场景(比如直接覆盖图片)会踩缓存坑,更新静态文件时改个文件名最稳。
这两个都是"一次配置、长期受益",配完就不用管了,堪称性价比最高的优化。
小够总结
Nginx 反代是 VPS 玩家的必备技能,核心就三句:Nginx 当前台、按域名分发、后端端口不对公网开放。学会这一招,一台 1 核 2G 的小机器能跑五六个服务,这才是"够用主义"——一台机器用到极致,而不是有需求就加机器。搭好之后如果访问变慢,按《网站变慢排查》的流程查,大概率是后端服务本身的问题,不是反代的锅。