在阿里云 ECS(云服务器)上实现多个网站共用一个 IP 地址,核心原理是 虚拟主机(Virtual Hosting)。这主要依赖于 Web 服务器软件(如 Nginx、Apache)的配置,而非阿里云平台本身的特殊功能。只要你的域名解析都指向该服务器的同一个公网 IP,Web 服务器就能根据请求中的 Host 头信息将流量分发到不同的网站目录。
以下是基于主流 Web 服务器 Nginx 的具体实现步骤和逻辑推导。Nginx 因其高性能和低资源占用,是国内建站的首选。
一、 前置条件准备
- 域名解析:确保所有需要部署的网站域名(例如
a.com,b.com)都在 DNS 服务商处添加 A 记录,指向你的阿里云 ECS 公网 IP。 - 安全组配置:登录阿里云控制台,进入 ECS 实例的“安全组”设置,确保入方向规则中放行了 80 (HTTP) 和 443 (HTTPS) 端口。
- 安装 Nginx:如果尚未安装,可通过 yum/apt 安装。
- CentOS:
yum install nginx -y - Ubuntu/Debian:
apt-get install nginx -y
- CentOS:
二、 Nginx 配置文件结构
Nginx 的主配置文件通常位于 /etc/nginx/nginx.conf,但最佳实践是将每个网站的配置独立放在 /etc/nginx/conf.d/ 或 /etc/nginx/sites-available/ 目录下,最后在主配置文件中引入。
假设我们要部署两个网站:
- 网站 A:域名
www.a.com,根目录/var/www/a - 网站 B:域名
www.b.com,根目录/var/www/b
三、 具体配置步骤
1. 创建网站目录和测试文件
# 创建目录
mkdir -p /var/www/a
mkdir -p /var/www/b
# 创建测试首页
echo "This is Website A" > /var/www/a/index.html
echo "This is Website B" > /var/www/b/index.html
2. 为网站 A 创建配置文件
在 /etc/nginx/conf.d/ 目录下创建 a.com.conf:
server {
listen 80;
server_name www.a.com a.com; # 监听域名
location / {
root /var/www/a; # 网站根目录
index index.html index.htm; # 默认首页
}
# 可选:日志配置
access_log /var/log/nginx/a_access.log;
error_log /var/log/nginx/a_error.log;
}
3. 为网站 B 创建配置文件
在 /etc/nginx/conf.d/ 目录下创建 b.com.conf:
server {
listen 80;
server_name www.b.com b.com; # 监听域名
location / {
root /var/www/b; # 网站根目录
index index.html index.htm;
}
access_log /var/log/nginx/b_access.log;
error_log /var/log/nginx/b_error.log;
}
4. 验证并重启 Nginx
修改配置后,必须检查语法是否正确,然后重载服务。
# 检查配置语法
nginx -t
# 如果显示 syntax is ok,则重载
systemctl reload nginx
# 或者
service nginx reload
此时,访问 http://www.a.com 和 http://www.b.com 即可看到各自的内容。它们共享的是同一台 ECS 的同一个公网 IP。
四、 进阶:支持 HTTPS (SSL)
现代网站普遍使用 HTTPS。如果使用免费证书(如 Let’s Encrypt),可以通过 Certbot 自动管理,或者手动配置。以手动配置为例,需在上述 server 块中增加 SSL 相关指令。
注意:对于多域名共用 IP 且启用 HTTPS 的场景,推荐使用 SNI (Server Name Indication) 技术。Nginx 默认支持 SNI,无需额外复杂配置,只需确保每个 server 块正确绑定对应的证书文件即可。
示例(仅展示 HTTPS 部分关键配置):
server {
listen 443 ssl;
server_name www.a.com;
ssl_certificate /etc/nginx/ssl/a.com.pem;
ssl_certificate_key /etc/nginx/ssl/a.com.key;
location / {
root /var/www/a;
index index.html;
}
}
五、 常见坑与注意事项
-
Default Server 问题:
如果用户直接通过 IP 访问服务器,Nginx 会返回第一个被加载的server块的内容。为了防止恶意域名解析到你的 IP 后访问你的网站,建议在nginx.conf中设置一个默认的default_server,将其重定向到一个错误页面或空白页。server { listen 80 default_server; server_name _; return 444; # 直接断开连接,不返回任何内容 } -
PHP-FPM 路径映射:
如果你的网站使用 PHP(如 WordPress),需确保fastcgi_pass指向正确的 socket 或端口,并且root目录权限正确(通常为nginx:nginx或www-data:www-data)。 -
负载均衡器(SLB/ALB)替代方案:
如果你使用的是阿里云的 应用型负载均衡器(ALB) 或 传统型负载均衡器(SLB),则可以在负载均衡后端监听端口,并在负载均衡层面配置监听规则,将不同域名转发到同一台 ECS 的不同端口或路径。但对于单台 ECS 直接建站场景,上述 Nginx 反向X_X方式是最轻量、最标准的做法。 -
备案合规性:
在中国大陆地区,使用阿里云国内节点(如华东、华北等)的 ECS 服务器,所有绑定的域名必须已完成 ICP 备案。否则,阿里云会在 DNS 解析层进行拦截,导致无法访问。这是云厂商的风控要求,务必提前完成备案流程。
总结
实现多站合一的关键在于 DNS 解析统一指向 IP + Nginx/Apache 基于域名的虚拟主机配置。这种方法成本低、效率高,是个人开发者和小微企业最常用的建站架构。
CLOUD云枢