如何在一台云服务器上托管多个网站?

在一台云服务器上托管多个网站(即“虚拟主机”)是常见且成熟的实践,核心原理是通过 Web 服务器的虚拟主机(Virtual Host)机制,结合域名解析、反向X_X或容器化等技术实现。以下是清晰、安全、可扩展的完整方案(以主流 Linux + Nginx/Apache 为例):


✅ 一、基础前提准备

  1. 云服务器环境

    • 操作系统:Ubuntu 22.04 / CentOS Stream 9(推荐 LTS 版本)
    • 已配置好防火墙(ufwfirewalld),开放端口 80(HTTP)、443(HTTPS)
    • 已绑定弹性公网 IP,并完成域名解析(A 记录指向服务器 IP)
  2. 域名准备

    • 例如:site1.comsite2.netblog.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:alpine
Nginx 主配置中 proxy_pass http://localhost:8081;
多用户/客户托管 使用控制面板(谨慎选择) 宝塔面板(bt.cn)(国内易用)、CyberPanel(开源,LiteSpeed)
⚠️ 注意:生产环境慎用非专业面板(安全审计风险)
静态网站托管 ✅ 直接放 /var/www/ + Nginx 静态服务 零后端依赖,最快最安全(如 Hugo/Jekyll 生成的博客)

✅ 四、必备运维实践(避免踩坑)

项目 正确做法 ❌ 常见错误
文件权限 sudo chown -R $USER:www-data /var/www/site1.com
sudo chmod -R 755 /var/www/site1.com/html
不要 chmod 777!导致任意文件写入风险
日志管理 使用 logrotate 自动轮转:
配置 /etc/logrotate.d/nginx-site1
忽略日志 → 磁盘爆满宕机
备份策略 定期备份:
• 网站文件(/var/www/
• Nginx 配置(/etc/nginx/
• SSL 证书(/etc/letsencrypt/
无备份 → 数据丢失无法恢复
监控告警 netdataUptime Kuma 监控 CPU/内存/端口/HTTPS 证书到期 证书过期才发现 → 网站白屏

✅ 五、快速验证是否成功?

  1. 在本地 hosts 文件临时添加测试解析(Windows: C:WindowsSystem32driversetchosts;Mac/Linux: /etc/hosts
    your-server-ip site1.com site2.net
  2. 浏览器访问 http://site1.com → 应显示对应首页
  3. 访问 https://site1.com → 应自动跳转且地址栏显示锁图标
  4. 使用 curl -I http://site2.net 检查返回 HTTP/2 200 和正确 Server

💡 总结:最佳实践清单

  • ✅ 一个域名 = 一个 Nginx server 块(清晰、易维护)
  • ✅ 强制 HTTPS + 自动续期(Certbot 一行命令搞定)
  • ✅ 网站根目录权限严格(www-data 组读取,禁止写入)
  • ✅ 日志分离 + 定期备份 + 证书监控
  • ✅ 避免在生产环境直接用 root 运行 Web 服务(Nginx 默认已降权)

需要我为你生成:

  • 📥 一键部署脚本(自动配置多个网站 + HTTPS)?
  • 🐳 Docker Compose 示例(多站点容器化)?
  • 📜 详细权限/备份/监控配置模板
    欢迎随时告诉我你的具体环境(如:Ubuntu 版本、是否已有网站、技术栈),我可以定制化输出 👇
未经允许不得转载:ECLOUD博客 » 如何在一台云服务器上托管多个网站?