Nginx反向代理配置教程 一台vps挂多个域名自动https全流程
一台服务器,跑多个网站——Nginx 反向代理能做到
很多人买了 VPS 之后只跑了一个网站,其实一台服务器完全可以同时托管多个域名和应用。实现这个目标的核心工具就是 Nginx 反向代理。
反向代理的作用是:用户访问不同的域名,Nginx 根据域名将请求转发给后端对应的应用(Node.js、Python、PHP、WordPress 等),对外只暴露 80/443 端口,内部各应用跑在不同端口互不干扰。
本文以 Ubuntu 22.04 为例,完整演示如何配置 Nginx 反向代理,实现一台 VPS 挂多个域名并自动开启 HTTPS,所有命令可直接复制执行。
一、环境准备
开始前确认以下条件:
- 已完成服务器初始化配置(防火墙已放行 80 和 443 端口)
- 域名已解析到服务器 IP(A 记录,DNS 生效需等待几分钟到数小时)
- 后端应用已在某个端口运行(本文以 Node.js 应用跑在 3000 端口为例)
安装 Nginx:
sudo apt update
sudo apt install nginx -y启动并设置开机自启:
sudo systemctl start nginx
sudo systemctl enable nginx验证安装:浏览器访问服务器 IP,看到 “Welcome to nginx!” 页面说明安装成功。
二、理解 Nginx 配置文件结构
Nginx 的配置文件主要涉及两个目录:
/etc/nginx/sites-available/:存放所有站点配置文件(未激活)/etc/nginx/sites-enabled/:存放已激活的站点配置(通常是 sites-available 的软链接)
推荐做法:在 sites-available 中为每个域名创建独立配置文件,激活时在 sites-enabled 中创建软链接。这样可以随时通过删除软链接来禁用某个站点,不影响配置文件本身。
三、配置第一个反向代理站点
假设你有一个 Node.js 应用跑在 3000 端口,域名为 app1.example.com,配置步骤如下:
创建配置文件:
sudo nano /etc/nginx/sites-available/app1.example.com写入以下内容:
server {
listen 80;
server_name app1.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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_cache_bypass $http_upgrade;
}
}激活该站点(创建软链接):
sudo ln -s /etc/nginx/sites-available/app1.example.com /etc/nginx/sites-enabled/测试配置文件语法是否正确:
sudo nginx -t看到 syntax is ok 和 test is successful 后重载 Nginx:
sudo systemctl reload nginx此时访问 http://app1.example.com,应该可以看到你的 Node.js 应用。
四、添加第二个站点(多域名配置)
同样的步骤,为第二个域名 app2.example.com(假设后端跑在 4000 端口)创建配置:
sudo nano /etc/nginx/sites-available/app2.example.comserver {
listen 80;
server_name app2.example.com;
location / {
proxy_pass http://127.0.0.1:4000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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_cache_bypass $http_upgrade;
}
}激活并重载:
sudo ln -s /etc/nginx/sites-available/app2.example.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx此时两个域名可以同时正常访问,Nginx 根据 server_name 自动区分并转发请求。
五、申请 Let’s Encrypt 免费 SSL 证书并开启 HTTPS
使用 Certbot 工具可以一键申请 Let’s Encrypt 免费证书,并自动修改 Nginx 配置加入 HTTPS 支持。
安装 Certbot:
sudo apt install certbot python3-certbot-nginx -y为第一个域名申请证书(Certbot 会自动修改 Nginx 配置):
sudo certbot --nginx -d app1.example.com按提示输入邮箱,同意服务条款,选择是否强制跳转 HTTPS(建议选择强制跳转,输入 2)。
为第二个域名申请证书:
sudo certbot --nginx -d app2.example.com申请完成后,Certbot 会自动修改对应的 Nginx 配置文件,加入 SSL 证书路径和 HTTPS 监听配置。
六、验证 HTTPS 配置结果
Certbot 执行完成后,查看自动修改后的配置文件内容:
cat /etc/nginx/sites-available/app1.example.com正确配置后应包含类似以下内容:
server {
server_name app1.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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_cache_bypass $http_upgrade;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/app1.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app1.example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
if ($host = app1.example.com) {
return 301 https://$host$request_uri;
}
listen 80;
server_name app1.example.com;
return 404;
}浏览器访问 https://app1.example.com,地址栏出现绿色锁图标,说明 HTTPS 配置成功。
七、配置证书自动续期
Let’s Encrypt 证书有效期为 90 天,Certbot 安装时会自动创建一个定时任务处理续期,通常不需要手动操作。
验证自动续期是否正常配置:
sudo certbot renew --dry-run看到 Congratulations, all simulated renewals succeeded 说明自动续期配置正常。
也可以查看 systemd 定时器状态:
sudo systemctl status certbot.timer八、常见问题排查
问题一:nginx -t 报错 “conflicting server name”
原因是多个配置文件中的 server_name 重复。检查 /etc/nginx/sites-enabled/ 下是否有重复的域名配置,删除多余的软链接即可。
问题二:Certbot 申请证书失败,提示无法验证域名
最常见原因是域名 DNS 还未生效,或防火墙未放行 80 端口。确认域名已正确解析到服务器 IP(可用 ping app1.example.com 验证),防火墙已放行 80/443 端口后重试。
问题三:访问域名返回 502 Bad Gateway
说明 Nginx 可以接收请求,但后端应用未正常运行。检查后端应用是否在对应端口启动:
curl http://127.0.0.1:3000如果无响应,重启后端应用即可。
问题四:HTTP 未自动跳转到 HTTPS
检查配置文件中是否有 80 端口的 server block 包含 return 301 https://... 重定向规则。如果没有,手动添加后重载 Nginx。
总结
本文完整演示了 Nginx 反向代理的核心配置流程:
- 安装 Nginx 并理解配置文件结构
- 为每个域名创建独立的 server block 配置
- 通过软链接激活站点,方便管理
- 使用 Certbot 一键申请 Let’s Encrypt 免费证书
- 自动开启 HTTPS 并强制跳转
- 配置证书自动续期
掌握这套流程后,一台服务器托管 5–10 个站点完全没有问题,只需为每个域名重复第三、四、五步即可。
如果你正在寻找适合部署多站点的香港 VPS,IDC.Net 香港云服务器首月 10 元起,CN2 GIA 直连大陆,支持 Ubuntu 22.04 系统,自助面板随时重装,支付宝 / USDT 付款,3 天无理由退款,适合本文教程的实操练习和生产环境部署。