在阿里云 ECS 上部署多个网站,核心思路其实就一句话:一个公网 IP,通过 Nginx(或 Apache)做反向XX,根据域名把流量分发到不同的后端服务。
别被“云服务器”、“负载均衡”这些词吓到。对于大多数中小规模站点,你不需要买 SLB(Server Load Balancer),直接用一台 ECS 配合 Nginx 就能搞定,成本低且运维简单。
下面我以目前最主流、最稳定的 Nginx + PHP-FPM 架构为例,手把手讲怎么配置。假设你的 ECS 是 CentOS 7/8 或 Ubuntu 系统。
第一步:基础环境准备
-
购买 ECS 并绑定弹性公网 IP (EIP)
- 确保你的 ECS 已经分配了公网 IP。
- 安全组配置:这是新手最容易踩坑的地方。去阿里云控制台 -> 实例 -> 安全组 -> 配置规则。必须放行 80 (HTTP) 和 443 (HTTPS) 端口,方向选“入方向”,授权对象写
0.0.0.0/0。否则网络根本访问不了你的网站。
-
安装必要软件
- 推荐直接装宝塔面板(BT Panel)或者 LNMP 一键包,适合个人开发者和小团队,图形化界面省心。
- 如果你是追求极致控制的专业人士,建议手动编译安装 Nginx 和 PHP。这里我按手动配置 Nginx 的逻辑来讲,因为原理通用,不管你是用宝塔还是手动改配置文件,底层逻辑一样。
# CentOS 示例 yum install nginx php-fpm mysql-server -y systemctl start nginx systemctl enable nginx
第二步:解析域名
你有两个网站,比如 site-a.com 和 site-b.com。
- 登录阿里云 云解析 DNS。
- 添加两条 A 记录:
- 主机记录:
@(代表主域名) 或www - 记录值:你的 ECS 公网 IP
- TTL:默认即可
- 主机记录:
- 等待几分钟生效(可以用
ping site-a.com测试是否指向你的 IP)。
第三步:创建网站目录结构
不要把所有文件都扔在 /var/www/html 里,这样管理起来会乱。建议按项目隔离:
/var/www/
├── site-a/
│ ├── index.html
│ └── ...
└── site-b/
├── index.php
└── ...
确保 Nginx 运行用户(通常是 nginx 或 www-data)有权限读取这些目录。
第四步:配置 Nginx Server Block(关键步骤)
Nginx 的核心能力就是虚拟主机。你需要为每个网站创建一个独立的配置文件。
1. 为 site-a.com 配置
找到 Nginx 的配置文件目录,通常在 /etc/nginx/conf.d/ 或 /etc/nginx/sites-available/。新建一个文件 site-a.conf:
server {
listen 80;
server_name site-a.com www.site-a.com;
# 日志路径,方便排查问题
access_log /var/log/nginx/site-a.access.log;
error_log /var/log/nginx/site-a.error.log;
root /var/www/site-a;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
# 如果后续要加 HTTPS,可以在这里配置 SSL
}
2. 为 site-b.com 配置
同样新建 site-b.conf:
server {
listen 80;
server_name site-b.com www.site-b.com;
access_log /var/log/nginx/site-b.access.log;
error_log /var/log/nginx/site-b.error.log;
root /var/www/site-b;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# 处理 PHP 请求
location ~ .php$ {
fastcgi_pass unix:/run/php/php-fpm.sock; # 注意路径,不同系统可能不同
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
3. 加载配置
修改完成后,检查语法是否正确:
nginx -t
如果显示 syntax is ok,则重载 Nginx 使配置生效:
systemctl reload nginx
第五步:验证与优化
-
浏览器访问测试
- 打开浏览器,输入
http://site-a.com和http://site-b.com。 - 你应该能看到各自对应的网页内容。
- 如果打不开,先检查防火墙(
firewalld或iptables)是否放行了 80 端口,再检查 Nginx 错误日志。
- 打开浏览器,输入
-
开启 HTTPS(强烈推荐)
- 现在没有 HTTPS 的网站会被浏览器标记为“不安全”。
- 在阿里云控制台搜索 SSL 证书服务,可以申请免费的单域名证书(DV 证书)。
- 下载证书后,上传到服务器,然后在 Nginx 配置中启用 SSL:
server { listen 443 ssl; server_name site-a.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/cert.key; # 其他配置同上... } # 强制跳转 HTTPS server { listen 80; server_name site-a.com; return 301 https://$host$request_uri; }
进阶场景:如果网站越来越多怎么办?
当你的站点超过 5-10 个,或者并发量变大时,单机 Nginx 可能会成为瓶颈。这时候可以考虑以下方案:
-
使用 Docker 容器化部署
- 每个网站跑在一个独立的 Docker 容器里,通过 Docker Compose 管理。
- Nginx 作为入口,通过 Docker 内部网络转发请求。
- 优点:环境隔离,迁移方便,不会互相污染。
-
升级架构:SLB + 多台 ECS
- 如果预算允许,购买阿里云 SLB (应用负载均衡)。
- 将 SLB 的监听端口指向多台后端 ECS 的 80 端口。
- 这样即使某台 ECS 挂了,流量会自动切换到另一台,实现高可用。
- 此时,每台 ECS 上依然可以配置多个虚拟主机,但整体负载由 SLB 分摊。
-
使用云原生托管(ACK / FC)
- 如果是微服务架构,直接上阿里云 ACK(容器服务 Kubernetes 版)或函数计算 FC,彻底告别手动维护服务器操作系统。但这属于 DevOps 范畴,初期学习成本较高。
常见坑点提醒
- SELinux 阻止访问:如果你用了 SELinux(CentOS 默认开启),Nginx 可能无法读取自定义目录下的文件。临时解决:
setsebool -P httpd_read_content 1,或者更干脆地设置 SELinux 为 Permissive 模式(生产环境建议正确配置策略而非关闭)。 - 权限问题:确保 Web 目录的所有者是
nginx:nginx(或对应用户),权限设为755。不要用chmod 777,那是安全隐患。 - PHP 版本冲突:如果不同网站需要不同 PHP 版本(如一个 7.4,一个 8.0),建议使用 PHP-FPM 的多版本共存,或者用 Docker 隔离。
- 阿里云监控:别忘了在 ECS 控制台开启“云监控”,设置 CPU、内存、带宽告警。很多站长直到网站崩了才知道服务器资源耗尽。
总结来说,Nginx 反向XX + 独立域名解析 是最经典、最稳定、成本最低的多网站部署方案。先跑通这个流程,后续再根据业务增长逐步引入容器化或负载均衡。
云技术博客