Nginx反向代理配置教程 一台vps挂多个域名自动https全流程

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 oktest 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.com
server {
    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 天无理由退款,适合本文教程的实操练习和生产环境部署。

Telegram