一台搬瓦工 VPS 完全可以同时跑多个网站,只需为每个域名写独立的 Nginx server 块、规划好目录结构、各自申请 SSL 证书即可。相比每个网站一台服务器,这样大幅降低成本。本文从目录规划到多站点 SSL,完整演示在一台 VPS 上部署多个网站的全流程。

本文要点

  • 合理的多站点目录结构规划
  • 为每个域名写独立的 Nginx 配置文件
  • 各站点分别申请 Let's Encrypt 证书
  • 独立的访问日志与错误日志
  • 新增或删除站点的操作流程

目录结构规划

清晰的目录结构是多站点管理的基础。推荐以域名为单位组织:

/var/www/
├── site-a.com/          # 站点 A 的网站文件
│   └── index.html
├── site-b.com/          # 站点 B 的网站文件
│   └── index.html
└── site-c.com/          # 站点 C
    └── index.html

/etc/nginx/
├── sites-available/
│   ├── site-a.com.conf
│   ├── site-b.com.conf
│   └── site-c.com.conf
└── sites-enabled/
    ├── site-a.com.conf -> ../sites-available/site-a.com.conf
    └── site-b.com.conf -> ../sites-available/site-b.com.conf

CentOS 用 conf.d 目录

CentOS/AlmaLinux/Rocky 通常没有 sites-available/enabled 目录,直接把每个站点的 .conf 文件放到 /etc/nginx/conf.d/ 下,Nginx 主配置会自动 include 该目录下所有 .conf 文件。

创建第一个站点

# 创建网站目录并设置权限
mkdir -p /var/www/site-a.com
chown -R www-data:www-data /var/www/site-a.com
chmod -R 755 /var/www/site-a.com

# 放入测试首页
echo '

Site A

' > /var/www/site-a.com/index.html

编写 /etc/nginx/sites-available/site-a.com.conf

server {
    listen 80;
    listen [::]:80;
    server_name site-a.com www.site-a.com;

    root /var/www/site-a.com;
    index index.html index.htm;

    access_log /var/log/nginx/site-a.access.log;
    error_log  /var/log/nginx/site-a.error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}
# 启用并测试
ln -s /etc/nginx/sites-available/site-a.com.conf /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

创建第二个站点(同样步骤)

mkdir -p /var/www/site-b.com
chown -R www-data:www-data /var/www/site-b.com
echo '

Site B

' > /var/www/site-b.com/index.html cp /etc/nginx/sites-available/site-a.com.conf /etc/nginx/sites-available/site-b.com.conf # 编辑 site-b.com.conf,修改 server_name、root、log 路径 nano /etc/nginx/sites-available/site-b.com.conf ln -s /etc/nginx/sites-available/site-b.com.conf /etc/nginx/sites-enabled/ nginx -t && systemctl reload nginx

各站点申请独立 SSL 证书

确认每个域名的 A 记录都已解析到本机,然后分别签发:

# 为第一个域名签发
certbot --nginx -d site-a.com -d www.site-a.com

# 为第二个域名签发
certbot --nginx -d site-b.com -d www.site-b.com

多域名批量操作

也可以在一条命令里同时为多个域名签发(最多 100 个),但多个无关域名建议分开签发,方便后续独立续期与管理:certbot --nginx -d site-a.com -d site-b.com

多站点对比一览

站点域名网站根目录配置文件证书路径
站点 Asite-a.com/var/www/site-a.comsite-a.com.conf/etc/letsencrypt/live/site-a.com/
站点 Bsite-b.com/var/www/site-b.comsite-b.com.conf/etc/letsencrypt/live/site-b.com/

禁用或删除某个站点

  1. 删除 sites-enabled 下的软链接(rm /etc/nginx/sites-enabled/site-b.com.conf
  2. 执行 nginx -t && systemctl reload nginx
  3. 如需彻底清除,删除 sites-available 里的配置文件和 /var/www/ 下的网站目录

权限常见问题

若网站返回 403 Forbidden,通常是目录权限不正确。确认 root 指向的目录存在,且 Nginx 用户(通常 www-data)有读取权限:chmod -R 755 /var/www/你的站点

小结

  • 每个域名一个独立配置文件,便于开关和维护
  • 目录以域名命名,日志也各自独立
  • 各域名分别用 certbot 签发 SSL 证书
  • 禁用站点只需删除 sites-enabled 软链接

常见问题

一台 VPS 能跑多少个网站?

理论上无上限,实际受 CPU、内存和带宽限制。静态小站几十个没问题,资源密集型站点(如 WordPress)需要预留足够内存,每个约需 128–256 MB。

各站点能用不同的 PHP 版本吗?

可以,通过 PHP-FPM 的多个 pool 分别监听不同 socket,每个 server 块的 fastcgi_pass 指向不同 pool 即可实现 PHP 版本隔离。

删除站点配置后需要 restart 还是 reload?

reload 即可(systemctl reload nginx),Nginx 会平滑重载配置,不中断在线连接。只有在 Nginx 进程本身出问题时才需要 restart。