在阿里云服务器上通过 Docker 部署多个网站是完全可行的,而且是目前非常主流且高效的方案。核心思路是利用 Docker Compose 进行容器编排,配合 Nginx 作为反向X_X服务器,将不同的域名请求转发到对应的后端应用容器中。
以下是完整的实施逻辑和步骤指南:
1. 架构设计
为了实现多站点隔离与统一入口,通常采用以下架构:
- 前端入口:一个 Nginx 容器,负责监听 80/443 端口,根据
Host头(域名)将流量分发到不同容器。 - 业务容器:每个网站独立运行在自己的 Docker 容器中(可以是 Node.js, PHP, Python, Go 等),互不干扰。
- 网络层:使用自定义的 Docker 网络,让 Nginx 和业务容器互相通信。
- 数据持久化:利用 Docker Volume 挂载数据卷,防止容器重启后数据丢失。
2. 准备工作
确保你的阿里云 ECS 已安装 Docker 和 Docker Compose,并开放了安全组中的 80 (HTTP) 和 443 (HTTPS) 端口。
# 检查安装
docker --version
docker compose version
3. 具体实施步骤
第一步:创建项目目录结构
假设我们要部署两个网站:site-a.com 和 site-b.com。
mkdir -p /opt/docker-multi-site/{nginx,site-a,site-b}
cd /opt/docker-multi-site
第二步:编写 Nginx 配置文件
在 nginx/conf.d/default.conf 中定义虚拟主机规则。这是实现多站点的核心。
# /opt/docker-multi-site/nginx/conf.d/default.conf
# 网站 A
server {
listen 80;
server_name site-a.com www.site-a.com;
location / {
proxy_pass http://site-a:80; # 这里的 site-a 是容器名称
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# 网站 B
server {
listen 80;
server_name site-b.com www.site-b.com;
location / {
proxy_pass http://site-b:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
注意:proxy_pass 中的 site-a 和 site-b 必须与 docker-compose.yml 中定义的 service 名称一致。
第三步:编写 docker-compose.yml
在这个文件中定义所有服务、网络和存储卷。
version: '3.8'
services:
# 1. Nginx 反向X_X
nginx:
image: nginx:alpine
container_name: multi-site-nginx
ports:
- "80:80"
- "443:443" # 如果配置了 HTTPS
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/logs:/var/log/nginx
depends_on:
- site-a
- site-b
networks:
- app-network
# 2. 网站 A (示例:Node.js)
site-a:
image: node:18-alpine
container_name: site-a-app
working_dir: /app
volumes:
- ./site-a:/app
command: npm start
networks:
- app-network
# 3. 网站 B (示例:Python Flask)
site-b:
image: python:3.9-slim
container_name: site-b-app
working_dir: /app
volumes:
- ./site-b:/app
command: python app.py
networks:
- app-network
networks:
app-network:
driver: bridge
第四步:启动服务
在项目根目录下执行:
docker compose up -d
此时,Nginx 会启动并监听 80 端口,同时根据你的域名配置将请求转发给对应的业务容器。
4. 关键注意事项
-
域名解析 (DNS):
在阿里云控制台或 DNS 服务商处,将site-a.com和site-b.com的 A 记录都指向你的 阿里云服务器公网 IP。 -
阿里云安全组:
务必登录阿里云 ECS 控制台 -> 安全组 -> 配置规则,确保入方向允许 TCP 80 和 TCP 443 端口。否则外部无法访问。 -
HTTPS 证书管理:
生产环境强烈建议使用 HTTPS。可以在 Nginx 容器中集成 Let’s Encrypt (Certbot) 自动申请证书,或者在宿主机生成证书后挂载进 Nginx 容器。
简单做法:使用nginx-proxy-acme镜像可以自动化处理证书续期,无需手动干预。 -
资源隔离:
如果某个网站(如 site-a)内存占用过高导致 OOM,可以通过deploy.resources.limits限制单个容器的 CPU 和内存,避免影响其他网站。 -
日志查看:
如果遇到问题,可以使用以下命令查看特定容器日志:docker logs multi-site-nginx docker logs site-a-app
通过以上步骤,你就可以在一个阿里云服务器上低成本、高可用地运行多个独立的网站了。如果需要更复杂的负载均衡或微服务架构,还可以进一步引入 Kubernetes (ACK)。
CLOUD技术博