如何在搬瓦工 VPS 上配置 Nginx 反向代理多个域名

文章导读
在搬瓦工 VPS 上配置 Nginx 反向代理多个域名的核心方法是为每个域名编写独立的 server 配置块,并通过 server_name 指令区分流量。适用场景为同一台 VPS 需要托管多个网站或将不同域名指向不同本地服务,风险边界在于需确保所有域名的 DNS 均已解析至 VPS IP 且 80/443 端口在防火墙开放。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在搬瓦工 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 头或内容是否符合预期。

如何在搬瓦工 VPS 上配置 Nginx 反向代理多个域名
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