努力
加油

使用阿里轻量服务器如何配置多个网站共存?

在阿里云轻量应用服务器(Simple Application Server,简称 SAS)上配置多个网站共存,核心思路是“一个入口,分发请求”。

由于轻量服务器通常只有一个公网 IP 和有限的带宽/端口资源,我们不需要像传统 ECS 那样去折腾复杂的底层网络路由,而是利用 Web 服务器软件(Nginx/Apache) 的反向XX功能或虚拟主机机制来实现多域名/多端口的区分。

以下是目前最主流、稳定且易于维护的两种方案:基于域名的 Nginx 反向XX(推荐,适合有域名场景)和 基于端口的 Apache/Nginx 监听(适合无域名或简单测试场景)。


前置准备

  1. 服务器环境:确保你的轻量服务器已安装 Web 服务套件。阿里云官方镜像通常预装了 lamp(Linux + Apache + MySQL + PHP)或 lnmp(Linux + Nginx + MySQL + PHP)镜像。
  2. 域名解析:如果你有多个域名,需要在域名控制台将 A 记录指向该轻量服务器的公网 IP。
  3. 防火墙设置:在阿里云控制台 -> 防火墙规则中,确保放行了 HTTP (80) 和 HTTPS (443) 端口。如果使用非标准端口,还需放行对应端口。

方案一:基于域名的 Nginx 反向XX(最佳实践)

这是生产环境最常用的方式。无论你有几个域名,只要它们都指向同一个 IP,Nginx 就可以根据 Host 头字段将请求转发给不同的后端服务或直接提供静态文件。

步骤 1:确认 Nginx 配置目录

通常位于 /etc/nginx/conf.d/ 或 /usr/local/nginx/conf/vhost/(取决于安装方式)。假设你使用的是阿里云官方 LNMP 镜像,路径可能在 /usr/local/nginx/conf/conf.d/。

步骤 2:为每个网站创建独立的配置文件

不要把所有配置写在一个文件里。为每个网站创建一个 .conf 文件。

例如,第一个网站 site1.com 的配置 site1.conf:

server {
    listen 80;
    server_name site1.com www.site1.com; # 替换为你的域名

    root /var/www/site1/public; # 网站根目录,需提前创建并上传代码
    index index.html index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # PHP 处理
    location ~ .php$ {
        fastcgi_pass unix:/run/php-fpm/www.sock; # 路径视具体安装而定
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

第二个网站 site2.com 的配置 site2.conf:

server {
    listen 80;
    server_name site2.com www.site2.com;

    root /var/www/site2/public;
    index index.html index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        fastcgi_pass unix:/run/php-fpm/www.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

步骤 3:引入配置文件

在主配置文件 nginx.conf 中的 http 块内,确保包含上述子配置:

http {
    # ... 其他全局配置 ...

    include /usr/local/nginx/conf/conf.d/*.conf; # 确保这行存在,通配符加载所有 .conf
}

步骤 4:重载 Nginx

nginx -t          # 检查语法是否有误
nginx -s reload   # 平滑重启

优点:SEO 友好,URL 美观,支持 SSL 证书配置方便,符合行业标准。
缺点:需要域名解析配合。


方案二:基于端口的访问(无需域名或简单测试)

如果你没有域名,或者只是想快速跑通多个项目,可以通过监听不同端口来实现。但注意,HTTP 默认端口是 80,浏览器直接访问时只能带端口号。

步骤 1:修改 Nginx 配置

在 nginx.conf 或单独的 vhost 文件中,定义多个 server 块,分别监听不同端口。

# 网站 1 - 默认端口 80
server {
    listen 80;
    server_name localhost; # 或你的 IP
    root /var/www/site1;
}

# 网站 2 - 监听 8080 端口
server {
    listen 8080;
    server_name localhost;
    root /var/www/site2;
}

# 网站 3 - 监听 8081 端口
server {
    listen 8081;
    server_name localhost;
    root /var/www/site3;
}

步骤 2:开放防火墙端口

登录阿里云控制台,找到轻量服务器的“防火墙”页面,添加规则:

  • 协议:TCP
  • 端口范围:8080, 8081
  • 授权对象:0.0.0.0/0

步骤 3:访问方式

  • 网站 1: http://<公网IP>
  • 网站 2: http://<公网IP>:8080
  • 网站 3: http://<公网IP>:8081

优点:配置极简,无需域名。
缺点:用户体验差(需记端口),不利于 SEO,移动端某些网络可能拦截非常用端口。


方案三:使用 Apache 虚拟主机(如果你用的是 LAMP 镜像)

阿里云也提供 LAMP 镜像,Apache 的配置逻辑与 Nginx 类似,但语法不同。

步骤 1:启用虚拟主机模块

确保 mod_vhost_alias 等模块已加载(默认通常已开启)。

步骤 2:创建虚拟主机配置文件

在 /etc/httpd/conf.d/ 下创建 site1.conf:

<VirtualHost *:80>
    ServerName site1.com
    DocumentRoot /var/www/site1/public

    <Directory "/var/www/site1/public">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

同样为 site2.com 创建 site2.conf。

步骤 3:重启 Apache

systemctl restart httpd

关键注意事项与避坑指南

  1. SELinux 问题:
    如果使用的是 CentOS 7/8 系统,可能会遇到权限拒绝错误。临时关闭 SELinux 测试:setenforce 0。生产环境建议正确设置文件上下文而非永久关闭。

  2. PHP-FPM 池隔离:
    如果多个网站使用 PHP,建议为每个网站配置独立的 PHP-FPM pool(用户/组不同),避免一个网站被攻破后影响其他网站。在 LNMP 一键包中,通常可以在管理脚本中添加新站点时自动创建独立用户。

  3. SSL 证书配置:

    • 免费证书:推荐使用 Let’s Encrypt 的 Certbot 工具自动化续期。
    • 阿里云证书:可在控制台申请免费 DV 证书,下载后放入 /etc/nginx/ssl/ 目录,并在 server 块中配置 listen 443 ssl。
    • 强制 HTTPS:在每个 server 块中加入 return 301 https://$server_name$request_uri; 实现 HTTP 跳转 HTTPS。
  4. 资源限制:
    轻量服务器 CPU 和内存有限。如果多个网站流量较大,务必配置缓存(如 Nginx 的 proxy_cache 或 OPcache),避免频繁读取磁盘导致负载过高。

  5. 备份策略:
    定期备份数据库和网站文件。阿里云轻量服务器支持“快照”功能,建议在重大变更前手动创建快照。


总结建议

  • 有域名、追求专业度 → 选择 方案一(Nginx 多 Server 块)。
  • 无域名、内部测试 → 选择 方案二(多端口监听)。
  • 习惯 Apache 生态 → 选择 方案三(Apache VirtualHost)。

对于大多数个人开发者和小微企业,Nginx + 多域名虚拟主机 是最平衡性能、安全性和易用性的选择。配置完成后,记得通过 curl -I http://domain 验证响应头是否正常返回 200 OK。