在一台云服务器上托管多个网站(即“虚拟主机”)是常见且成熟的实践,核心原理是通过 Web 服务器的虚拟主机(Virtual Host)机制,结合域名解析、反向X_X或容器化等技术实现。以下是清晰、安全、可扩展的完整方案(以主流 Linux + Nginx/Apache 为例):
✅ 一、基础前提准备
-
云服务器环境
- 操作系统:Ubuntu 22.04 / CentOS Stream 9(推荐 LTS 版本)
- 已配置好防火墙(
ufw或firewalld),开放端口80(HTTP)、443(HTTPS) - 已绑定弹性公网 IP,并完成域名解析(A 记录指向服务器 IP)
-
域名准备
- 例如:
site1.com、site2.net、blog.yourname.dev(每个网站对应一个独立域名或子域名)
- 例如:
✅ 二、核心方案(推荐 Nginx + HTTPS + 自动证书)
▶ 方案 A:Nginx 基于 Server Name 的虚拟主机(最常用)
# 1. 安装 Nginx
sudo apt update && sudo apt install nginx -y
sudo systemctl enable nginx && sudo systemctl start nginx
# 2. 为每个网站创建独立配置文件(推荐方式)
sudo mkdir -p /var/www/site1.com/{html,logs}
sudo mkdir -p /var/www/site2.net/{html,logs}
# 3. 编写 site1.com 配置(/etc/nginx/sites-available/site1.com)
server {
listen 80;
server_name site1.com www.site1.com;
root /var/www/site1.com/html;
index index.html index.php;
access_log /var/www/site1.com/logs/access.log;
error_log /var/www/site1.com/logs/error.log;
location / {
try_files $uri $uri/ =404;
}
# PHP 支持(如需)
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
}
# 4. 启用站点(软链接到 sites-enabled)
sudo ln -sf /etc/nginx/sites-available/site1.com /etc/nginx/sites-enabled/
sudo ln -sf /etc/nginx/sites-available/site2.net /etc/nginx/sites-enabled/
# 5. 测试并重载
sudo nginx -t && sudo systemctl reload nginx
✅ 关键点:Nginx 根据
server_name字段匹配请求的Host头,自动路由到对应站点。
▶ 方案 B:自动 HTTPS(强烈推荐!使用 Certbot + Let’s Encrypt)
# 安装 Certbot
sudo apt install certbot python3-certbot-nginx -y
# 为 site1.com 自动申请并配置 HTTPS(自动修改 Nginx 配置)
sudo certbot --nginx -d site1.com -d www.site1.com
# 同样为 site2.net 配置
sudo certbot --nginx -d site2.net
# ✅ Certbot 会:
# • 自动申请免费 SSL 证书(90 天有效期)
# • 修改 Nginx 配置启用 HTTPS(443 端口 + HTTP → HTTPS 重定向)
# • 设置自动续期(systemd timer,默认已启用)
🔐 安全提示:所有生产网站必须启用 HTTPS(现代浏览器对 HTTP 页面有警告,SEO 也降权)。
✅ 三、进阶优化与隔离(提升安全性 & 可维护性)
| 场景 | 推荐方案 | 说明 |
|---|---|---|
| 不同技术栈(PHP/Node.js/Python) | ✅ 反向X_X | 用 Nginx X_X到本地不同端口:location / { proxy_pass http://127.0.0.1:3000; }(Node.js)location /api { proxy_pass http://127.0.0.1:8000; }(Django) |
| 强隔离需求(防互相影响) | ✅ Docker 容器化 | 每个网站运行在独立容器中:docker run -d -p 8081:80 --name site1 nginx:alpineNginx 主配置中 proxy_pass http://localhost:8081; |
| 多用户/客户托管 | ✅ 使用控制面板(谨慎选择) | 如 宝塔面板(bt.cn)(国内易用)、CyberPanel(开源,LiteSpeed) ⚠️ 注意:生产环境慎用非专业面板(安全审计风险) |
| 静态网站托管 | ✅ 直接放 /var/www/ + Nginx 静态服务 |
零后端依赖,最快最安全(如 Hugo/Jekyll 生成的博客) |
✅ 四、必备运维实践(避免踩坑)
| 项目 | 正确做法 | ❌ 常见错误 |
|---|---|---|
| 文件权限 | sudo chown -R $USER:www-data /var/www/site1.comsudo chmod -R 755 /var/www/site1.com/html |
不要 chmod 777!导致任意文件写入风险 |
| 日志管理 | 使用 logrotate 自动轮转:配置 /etc/logrotate.d/nginx-site1 |
忽略日志 → 磁盘爆满宕机 |
| 备份策略 | 定期备份: • 网站文件( /var/www/)• Nginx 配置( /etc/nginx/)• SSL 证书( /etc/letsencrypt/) |
无备份 → 数据丢失无法恢复 |
| 监控告警 | 用 netdata 或 Uptime Kuma 监控 CPU/内存/端口/HTTPS 证书到期 |
证书过期才发现 → 网站白屏 |
✅ 五、快速验证是否成功?
- 在本地 hosts 文件临时添加测试解析(Windows:
C:WindowsSystem32driversetchosts;Mac/Linux:/etc/hosts)your-server-ip site1.com site2.net - 浏览器访问
http://site1.com→ 应显示对应首页 - 访问
https://site1.com→ 应自动跳转且地址栏显示锁图标 - 使用
curl -I http://site2.net检查返回HTTP/2 200和正确Server头
💡 总结:最佳实践清单
- ✅ 一个域名 = 一个 Nginx
server块(清晰、易维护) - ✅ 强制 HTTPS + 自动续期(Certbot 一行命令搞定)
- ✅ 网站根目录权限严格(
www-data组读取,禁止写入) - ✅ 日志分离 + 定期备份 + 证书监控
- ✅ 避免在生产环境直接用 root 运行 Web 服务(Nginx 默认已降权)
需要我为你生成:
- 📥 一键部署脚本(自动配置多个网站 + HTTPS)?
- 🐳 Docker Compose 示例(多站点容器化)?
- 📜 详细权限/备份/监控配置模板?
欢迎随时告诉我你的具体环境(如:Ubuntu 版本、是否已有网站、技术栈),我可以定制化输出 👇
ECLOUD博客