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

基于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、缓存等规则。

  • 操作步骤:
    1. 当后台保存新的自定义域名时,自动生成虚拟主机配置文件(比如/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>
      
    2. 执行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配置:保持你现有的通配符虚拟主机即可,不需要额外修改。
  • 核心逻辑:
    1. 客户添加自定义域名后,后台保存域名<->商户ID的映射关系,最好加上域名所有权验证(比如让客户添加一条TXT记录,后台校验通过后才生效)。
    2. 每次请求到达Golang API时,读取Host头,查询数据库得到对应的商户ID,然后返回该商户的专属数据。
    3. Angular应用也可以通过Host头或API返回的租户信息,加载对应的仪表盘内容。
  • 优点:无需维护大量虚拟主机,扩展性强,租户数量再多也能轻松应对;缺点:需要在应用层完善租户隔离逻辑,避免数据越权。

三、关键注意事项

  • SSL证书:如果自定义域名需要HTTPS,推荐用Let's Encrypt的通配符证书覆盖你的子域名,自定义域名则单独用Certbot生成证书,或者用ACME协议自动续签。
  • 租户隔离:无论用哪种方案,必须确保应用层能准确识别请求对应的商户,Golang API要严格校验Host头与商户的绑定关系,防止数据泄露。
  • 自动化:如果选择虚拟主机方案,一定要实现自动化配置(比如后台触发脚本生成配置、启用站点),否则租户多了会累死;应用层方案则要确保域名验证逻辑完善,避免恶意绑定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:59:32