努力
加油

使用阿里云服务器如何实现多个网站共用一个IP?

在阿里云 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

第一步:环境准备

  1. 购买/使用 ECS 实例:确保你的阿里云 ECS 已经安装了操作系统(推荐 CentOS 7/8, Ubuntu 20.04/22.04)。
  2. 安装 Nginx:
    • CentOS: yum install nginx -y
    • Ubuntu: apt install nginx -y
  3. 配置安全组:这是新手最容易踩坑的地方。登录阿里云控制台,找到你的 ECS 实例,进入“安全组”规则,确保入方向放通了 TCP 80 (HTTP) 和 TCP 443 (HTTPS) 端口。如果不通,先查这个。
  4. 域名解析:确保你要绑定的多个域名(例如 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。


常见问题与避坑指南

  1. 为什么我配好了还是访问不到?

    • DNS 问题:确认域名是否真的解析到了这台 ECS 的 IP?可以用 ping 域名 看返回的 IP 是否正确。
    • 防火墙/安全组:再次检查阿里云控制台的安全组规则,以及服务器内部的 firewalld 或 iptables 是否放行了 80/443。
    • 文件权限:Nginx 进程的用户(通常是 nginx 或 www-data)必须有权限读取网站目录及其父目录。
  2. 默认站点怎么办?

    • 如果有人直接输入 IP 访问你的服务器,Nginx 会有一个默认的 default_server。建议在主配置文件中明确指定一个默认行为,比如返回 403 Forbidden 或重定向到一个欢迎页面,防止未绑定域名的访问泄露信息。
  3. 动态网站(PHP/Node.js/Java)怎么处理?

    • 上述例子是静态 HTML。如果是 PHP,需要在 location 块中添加 FastCGI 配置;如果是 Java (.war) 或 Node.js,需要使用 proxy_pass 反向XX到本地端口(如 localhost:3000)。逻辑依然是靠 server_name 区分不同的后端服务。
  4. SEO 友好性

    • 共用 IP 对 SEO 没有负面影响。搜索引擎识别的是域名和内容,而不是 IP。只要每个域名能正常访问,权重积累互不影响。

通过以上步骤,你就可以在阿里云 ECS 上轻松托管无数个网站,无需为每个网站单独购买服务器,极大降低了成本。