一台搬瓦工 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.confCentOS 用 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。多站点对比一览
| 站点 | 域名 | 网站根目录 | 配置文件 | 证书路径 |
|---|---|---|---|---|
| 站点 A | site-a.com | /var/www/site-a.com | site-a.com.conf | /etc/letsencrypt/live/site-a.com/ |
| 站点 B | site-b.com | /var/www/site-b.com | site-b.com.conf | /etc/letsencrypt/live/site-b.com/ |
禁用或删除某个站点
- 删除 sites-enabled 下的软链接(
rm /etc/nginx/sites-enabled/site-b.com.conf) - 执行
nginx -t && systemctl reload nginx - 如需彻底清除,删除 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。