如何为托管多子域名的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目标组 - 以此类推配置其他子域名规则
- 规则1:主机头 =
- 针对每个子域名,设置规则:
步骤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并写入日志
- 解决:
- 每个实例仅配置自身负责的子域名的VirtualHost,删除无关配置
- 确保ALB路由规则精准,仅将对应子域名的流量转发到目标组
- 可选:在目标组健康检查中添加主机头匹配,确保实例仅响应自身负责子域名的健康请求
内容的提问来源于stack exchange,提问作者Krishna Chebrolu
相关产品推荐
相关产品推荐

