在阿里云 ECS(云服务器)上实现多个网站共用一个 IP,本质上不是阿里云特有的功能,而是基于 Web 服务器软件(如 Nginx、Apache)的虚拟主机(Virtual Host)或服务器块(Server Block)技术。
简单来说,就是让一台服务器监听同一个 IP 和端口(通常是 80 或 443),然后根据访问请求中的 Host 头信息(即域名),将流量分发到不同的项目目录。
以下是以目前最主流、性能最好的 Nginx 为例,手把手教你实现的完整流程。如果你用的是 Apache,原理类似,只是配置文件语法不同。
核心逻辑图解
用户访问 www.site1.com -> DNS解析到 ECS公网IP -> Nginx收到请求
|
+---> 检查 Host: www.site1.com -> 转发到 /var/www/site1
|
用户访问 www.site2.com -> DNS解析到 ECS公网IP -> Nginx收到请求
|
+---> 检查 Host: www.site2.com -> 转发到 /var/www/site2
第一步:环境准备
- 购买/使用 ECS 实例:确保你的阿里云 ECS 已经安装了操作系统(推荐 CentOS 7/8, Ubuntu 20.04/22.04)。
- 安装 Nginx:
- CentOS:
yum install nginx -y - Ubuntu:
apt install nginx -y
- CentOS:
- 配置安全组:这是新手最容易踩坑的地方。登录阿里云控制台,找到你的 ECS 实例,进入“安全组”规则,确保入方向放通了 TCP 80 (HTTP) 和 TCP 443 (HTTPS) 端口。如果不通,先查这个。
- 域名解析:确保你要绑定的多个域名(例如
a.com,b.com)都已经通过阿里云 DNS 或其他服务商解析到了这台 ECS 的公网 IP 地址。
第二步:创建网站目录结构
为了管理方便,我们在服务器上为每个网站创建独立的目录。假设我们要部署两个网站:site1.com 和 site2.com。
# 创建目录
mkdir -p /var/www/site1/public_html
mkdir -p /var/www/site2/public_html
# 放入测试页面(可选,用于验证)
echo "<h1>Welcome to Site 1</h1>" > /var/www/site1/public_html/index.html
echo "<h1>Welcome to Site 2</h1>" > /var/www/site2/public_html/index.html
# 设置权限(重要!否则 Nginx 可能无法读取文件)
chown -R nginx:nginx /var/www/site1
chown -R nginx:nginx /var/www/site2
(注:如果是 Ubuntu,Nginx 默认用户可能是 www-data,请根据实际调整)
第三步:编写 Nginx 配置文件
Nginx 的主配置文件通常在 /etc/nginx/nginx.conf,但最佳实践是将每个网站的配置拆分成独立文件,放在 /etc/nginx/conf.d/ 或 /etc/nginx/sites-available/ 目录下。
1. 创建 site1 的配置
新建文件 /etc/nginx/conf.d/site1.conf:
server {
listen 80;
server_name site1.com www.site1.com; # 替换为你实际的域名
root /var/www/site1/public_html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
2. 创建 site2 的配置
新建文件 /etc/nginx/conf.d/site2.conf:
server {
listen 80;
server_name site2.com www.site2.com; # 替换为你实际的域名
root /var/www/site2/public_html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
关键点解释:
listen 80;:所有网站都监听 80 端口,这是共用 IP 的关键。server_name:这是区分不同网站的依据。当浏览器请求时,会带上Host头,Nginx 匹配到这个字段后,就会执行对应的root目录下的内容。- 注意:不要在一个
server块里写多个server_name除非它们指向同一个根目录,否则建议每个域名单独一个server块,清晰且不易出错。
第四步:重启服务并验证
保存配置后,必须重载 Nginx 使配置生效:
# 检查配置文件语法是否有误(强烈建议先做这一步)
nginx -t
# 如果显示 "syntax is ok" 和 "test is successful",则重启
systemctl restart nginx
现在,打开浏览器,分别访问 site1.com 和 site2.com,你应该能看到各自的内容了。它们在服务器端使用的是同一个 IP 地址。
进阶:如何开启 HTTPS (SSL)?
共用 IP 的情况下,HTTPS 需要用到 SNI (Server Name Indication) 技术。现代浏览器和服务端都支持 SNI,所以完全可以实现多域名共用一个 IP 且都启用 HTTPS。
你需要获取每个域名的 SSL 证书(可以使用阿里云免费的 SSL 证书服务,或者 Let’s Encrypt 的 certbot)。
修改上面的配置文件示例(以 site1 为例):
server {
listen 443 ssl;
server_name site1.com www.site1.com;
# 指定证书路径
ssl_certificate /etc/nginx/ssl/site1.pem;
ssl_certificate_key /etc/nginx/ssl/site1.key;
root /var/www/site1/public_html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
# 同时保留 HTTP 跳转 HTTPS 的配置(可选但推荐)
server {
listen 80;
server_name site1.com www.site1.com;
return 301 https://$host$request_uri;
}
对 site2 做同样的操作,只需更换证书路径和域名即可。重启 Nginx 后,两个网站都可以用 https:// 访问,且共用同一个公网 IP。
常见问题与避坑指南
-
为什么我配好了还是访问不到?
- DNS 问题:确认域名是否真的解析到了这台 ECS 的 IP?可以用
ping 域名看返回的 IP 是否正确。 - 防火墙/安全组:再次检查阿里云控制台的安全组规则,以及服务器内部的
firewalld或iptables是否放行了 80/443。 - 文件权限:Nginx 进程的用户(通常是
nginx或www-data)必须有权限读取网站目录及其父目录。
- DNS 问题:确认域名是否真的解析到了这台 ECS 的 IP?可以用
-
默认站点怎么办?
- 如果有人直接输入 IP 访问你的服务器,Nginx 会有一个默认的
default_server。建议在主配置文件中明确指定一个默认行为,比如返回 403 Forbidden 或重定向到一个欢迎页面,防止未绑定域名的访问泄露信息。
- 如果有人直接输入 IP 访问你的服务器,Nginx 会有一个默认的
-
动态网站(PHP/Node.js/Java)怎么处理?
- 上述例子是静态 HTML。如果是 PHP,需要在
location块中添加 FastCGI 配置;如果是 Java (.war) 或 Node.js,需要使用proxy_pass反向XX到本地端口(如localhost:3000)。逻辑依然是靠server_name区分不同的后端服务。
- 上述例子是静态 HTML。如果是 PHP,需要在
-
SEO 友好性
- 共用 IP 对 SEO 没有负面影响。搜索引擎识别的是域名和内容,而不是 IP。只要每个域名能正常访问,权重积累互不影响。
通过以上步骤,你就可以在阿里云 ECS 上轻松托管无数个网站,无需为每个网站单独购买服务器,极大降低了成本。
云技术博客