You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为托管多子域名的AWS EC2服务器配置ALB负载均衡?

AWS负载均衡配置与Apache虚拟主机问题解决方案

1. 是否支持按子域名分配实例处理流量?

可以。AWS应用负载均衡(ALB)支持基于**主机头(Host Header)**的路由规则,能够将不同子域名的流量精准转发到对应目标组(每个目标组关联处理特定子域名的EC2实例集群)。

2. 具体实现步骤

步骤1:创建子域名专属目标组

  • 为每个需要分流的子域名(如ci1.example.com、reactapp.example.com等)创建独立目标组:
    • 目标类型选实例,指定对应VPC与后端Apache监听端口(建议80或443)
    • 将负责该子域名的EC2实例注册到目标组(后续扩容时直接添加新实例即可)
    • 健康检查配置:根据应用类型设置,比如CodeIgniter/Laravel可检查根路径/,React可检查/index.html
  • 若reactapp.example.com与lv.example.com关联,可将两个子域名对应到同一目标组。

步骤2:配置应用负载均衡(ALB)

  • 创建互联网-facing类型的ALB,将已有的通配符SSL证书绑定到443端口
  • 在ALB的监听规则中添加路由规则:
    • 针对每个子域名,设置规则:主机头等于 [子域名],转发到对应目标组
    • 示例规则:
      • 规则1:主机头 = ci1.example.com → 转发到TG-ci1目标组
      • 规则2:主机头 = reactapp.example.com/lv.example.com → 转发到TG-react-lv目标组
      • 以此类推配置其他子域名规则

步骤3:更新DNS解析

将所有子域名的A记录/CNAME记录指向ALB的域名,替换原EC2实例IP。

3. Apache虚拟主机配置修改

HTTP(80端口)配置

保留原有80端口的VirtualHost,继续做HTTP到HTTPS的强制跳转,无需大幅修改:

<VirtualHost *:80>
  ServerAdmin webmaster@example.com
  DocumentRoot /var/www/html/ci1/
  ServerName ci1.example.com

  CustomLog "/var/log/httpd/ci1_access.log" combined
  ErrorLog "/var/log/httpd/ci1_error.log"
  RewriteEngine on
  RewriteCond %{SERVER_NAME} =ci1.example.com
  RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

其他子域名的80端口配置同理保留。

HTTPS(443端口)配置

为每个子域名配置独立的443 VirtualHost,绑定通配符证书,确保实例仅处理自身负责的子域名:

<VirtualHost *:443>
  ServerAdmin webmaster@example.com
  DocumentRoot /var/www/html/ci1/
  ServerName ci1.example.com

  # 通配符SSL配置
  SSLEngine on
  SSLCertificateFile "/path/to/your/wildcard.crt"
  SSLCertificateKeyFile "/path/to/your/wildcard.key"
  SSLCertificateChainFile "/path/to/your/chain.crt" # 如有证书链则添加

  CustomLog "/var/log/httpd/ci1_ssl_access.log" combined
  ErrorLog "/var/log/httpd/ci1_ssl_error.log"

  # 应用专属目录配置(以CodeIgniter为例)
  <Directory /var/www/html/ci1/>
      AllowOverride All
      Require all granted
  </Directory>
</VirtualHost>
  • 每个实例仅保留自身负责的子域名的443 VirtualHost(比如负责React应用的实例,只保留reactapp.example.com和lv.example.com的配置,删除其他子域名配置)
  • 若单个实例需处理多个子域名,可保留对应多个VirtualHost配置

额外问题解决方案

问题1:移除ServerName后页面空白无错误日志

  • 原因:Apache无法确定请求对应的VirtualHost,会匹配默认虚拟主机(或第一个配置的虚拟主机),导致文档根路径不匹配
  • 解决:必须保留ServerName指令,明确每个VirtualHost对应的子域名,确保Apache能正确路由请求到对应目录

问题2:添加ServerName后所有服务器日志均被写入

  • 原因:ALB会将请求转发到目标组内的健康实例,而你的每个实例都配置了所有子域名的VirtualHost,导致任何子域名的请求打到实例时,都会匹配对应VirtualHost并写入日志
  • 解决:
    1. 每个实例仅配置自身负责的子域名的VirtualHost,删除无关配置
    2. 确保ALB路由规则精准,仅将对应子域名的流量转发到目标组
    3. 可选:在目标组健康检查中添加主机头匹配,确保实例仅响应自身负责子域名的健康请求

内容的提问来源于stack exchange,提问作者Krishna Chebrolu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 01:39:51