基于Angular4+Golang的AWS EC2多租户SaaS自定义域名实现咨询
嘿,我之前也做过类似的多租户SaaS域名配置,给你分享下我的经验和可行方案:
自定义域名支持方案:DNS配置 + Apache/应用层实现
一、客户需要做的DNS配置(重点!别让客户改域名服务器)
首先明确:不需要让客户修改域名服务器(NS记录),那样太复杂且失控。推荐两种简单的配置方式:
- 根域名(如mydomain.com):让客户在域名注册商后台添加一条A记录,将
mydomain.com指向你的AWS EC2实例的公网IP地址。 - 子域名(如app.mydomain.com):可以添加CNAME记录,指向你的主域名(比如
mystore.com),或者直接用A记录指向EC2公网IP。
验证方式:让客户执行nslookup mydomain.com或dig mydomain.com,确认返回的IP是你的EC2实例IP。
二、Apache配置方案对比
你提到的几个方案各有优劣,结合你的场景(多租户SaaS),给你拆解:
1. 为每个商户创建独立虚拟主机文件
适合租户数量较少的场景,优点是配置清晰,方便单独设置SSL、缓存等规则。
- 操作步骤:
- 当后台保存新的自定义域名时,自动生成虚拟主机配置文件(比如
/etc/apache2/sites-available/[domain].conf):<VirtualHost *:80> ServerName mydomain.com DocumentRoot /var/www/html/apps <Directory "/var/www/html/apps"> AllowOverride All Require all Granted </Directory> </VirtualHost> - 执行
sudo a2ensite [domain].conf启用站点,然后sudo systemctl reload apache2生效。
- 当后台保存新的自定义域名时,自动生成虚拟主机配置文件(比如
- 注意:如果需要HTTPS,推荐用Certbot自动生成Let's Encrypt证书,命令类似
sudo certbot --apache -d mydomain.com,它会自动修改虚拟主机配置。
2. .htaccess + mod_rewrite统一处理
适合不想维护大量虚拟主机的场景,基于你现有的通配符配置扩展即可。
- 前提:确保已经启用
mod_rewrite(执行sudo a2enmod rewrite后重启Apache),且AllowOverride All已开启(你的现有配置里已经有了)。 - 在
/var/www/html/apps/.htaccess中添加规则:RewriteEngine On # 排除你的子域名,只处理自定义域名 RewriteCond %{HTTP_HOST} !^.*\.mystore\.com$ [NC] # 将请求域名传递给应用(可选,方便Angular/Golang识别租户) RewriteRule ^(.*)$ /$1?tenant_domain=%{HTTP_HOST} [QSA,L] - 应用层处理:Angular可以读取
tenant_domain参数,Golang API可以直接读取请求的Host头,去数据库查询对应的商户信息。
3. 应用层识别域名(类似Shopify的思路)
这是最适合多租户SaaS的方案,Shopify本质上就是所有域名指向同一组服务器,然后通过Host头在应用层识别租户。
- Apache配置:保持你现有的通配符虚拟主机即可,不需要额外修改。
- 核心逻辑:
- 客户添加自定义域名后,后台保存
域名<->商户ID的映射关系,最好加上域名所有权验证(比如让客户添加一条TXT记录,后台校验通过后才生效)。 - 每次请求到达Golang API时,读取
Host头,查询数据库得到对应的商户ID,然后返回该商户的专属数据。 - Angular应用也可以通过
Host头或API返回的租户信息,加载对应的仪表盘内容。
- 客户添加自定义域名后,后台保存
- 优点:无需维护大量虚拟主机,扩展性强,租户数量再多也能轻松应对;缺点:需要在应用层完善租户隔离逻辑,避免数据越权。
三、关键注意事项
- SSL证书:如果自定义域名需要HTTPS,推荐用Let's Encrypt的通配符证书覆盖你的子域名,自定义域名则单独用Certbot生成证书,或者用ACME协议自动续签。
- 租户隔离:无论用哪种方案,必须确保应用层能准确识别请求对应的商户,Golang API要严格校验
Host头与商户的绑定关系,防止数据泄露。 - 自动化:如果选择虚拟主机方案,一定要实现自动化配置(比如后台触发脚本生成配置、启用站点),否则租户多了会累死;应用层方案则要确保域名验证逻辑完善,避免恶意绑定。
内容的提问来源于stack exchange,提问作者Vikram
相关产品推荐
相关产品推荐

