在搬瓦工 VPS 上配置 Nginx 反向代理多个域名的核心方法是为每个域名编写独立的 server 配置块,并通过 server_name 指令区分流量。适用场景为同一台 VPS 需要托管多个网站或将不同域名指向不同本地服务,风险边界在于需确保所有域名的 DNS 均已解析至 VPS IP 且 80/443 端口在防火墙开放。
先说结论:通过 Nginx 的 server_name 机制可以在同一 IP 上区分不同域名,无需额外端口,但必须正确配置 DNS 和 SSL 证书。
- 适合:同一台 VPS 需要管理多个网站域名或不同域名指向不同内部端口服务。
- 先准备:确认域名 DNS A 记录已指向 VPS 公网 IP,且 VPS 安全组放行 80 和 443 端口。
- 验收:使用 curl 命令检查 HTTP Host 头响应,以及浏览器 HTTPS 访问无证书报错。
命令速用版
以下命令基于 Ubuntu/Debian 系统,CentOS 用户需将 apt 替换为 yum 或 dnf。
# 安装 Nginx
sudo apt update
sudo apt install nginx -y
# 测试配置文件语法
sudo nginx -t
# 重载配置使生效
sudo nginx -s reload为什么会这样
Nginx 区分多个域名的原理是读取 HTTP 请求头中的 Host 字段。当用户访问域名时,浏览器会将域名放入 Host 头发送给服务器,Nginx 根据配置文件中 server_name 的值匹配对应的 server 块,从而将流量转发到不同的后端服务或网站目录。只要 DNS 解析正确,同一 IP 可以承载无限个域名,限制主要在于 VPS 的 CPU 和内存性能。
分步处理
第一步:解析域名。在域名注册商后台将每个域名的 A 记录指向搬瓦工 VPS 的公网 IP 地址,等待生效。
第二步:创建配置文件。在/etc/nginx/sites-available/目录下为每个域名创建独立文件,例如 example.com。
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}第三步:配置 SSL 证书。建议使用 Certbot 自动申请 Let's Encrypt 证书,确保 HTTPS 加密。
sudo apt install certbot python3-certbot-nginx -y
sudo certbot `--nginx` -d example.com -d www.example.com第四步:启用配置并重载。创建软链接到 sites-enabled 目录,检查语法后重载 Nginx。
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx怎么验证是否生效
使用 curl 命令模拟请求,检查返回的 Server 头或内容是否符合预期。
curl -I http://example.com
curl -I https://example.com观察 HTTP 状态码是否为 200 或 301,检查 SSL 证书是否为当前域名颁发。查看 Nginx 错误日志/var/log/nginx/error.log 确认无权限或连接拒绝错误。
常见坑
第一,防火墙拦截。搬瓦工 VPS 默认可能开放端口,但系统内部防火墙(如 ufw 或 firewalld)可能阻止 80/443 端口,需手动放行。
第二,证书路径错误。手动配置 SSL 时,cert 和 key 文件路径必须准确,否则 Nginx 无法启动。
第三,proxy_pass 后端不通。反向代理的目标服务必须在 VPS 内部可访问,建议先用 curl 测试本地端口是否响应。
常见问题
多个域名可以共用同一个 IP 吗?
可以,Nginx 通过 server_name 区分域名,不需要每个域名分配独立 IP。
配置修改后 Nginx 启动失败怎么办?
立即运行 sudo nginx -t 检查语法错误,根据提示行号修改配置文件,确认无误后再 reload。
不同域名需要不同的 SSL 证书吗?
是的,每个域名或泛域名需要独立的证书文件,Certbot 会自动管理多域名证书更新。
参考来源
- Nginx 官方文档 - Setting up server names https://nginx.org/en/docs/http/ngx_http_core_module.html#server_name
- Certbot 官方文档 - Nginx plugin https://certbot.eff.org/instructions