面向Saas产品客户的自定义域功能

Vik*_*ram 4 apache .htaccess mod-rewrite amazon-ec2 amazon-web-services

我已经构建了一个与golang rest api集成的angular 4的saas产品,并在AWS ec2实例上上传了该构建。我的项目是一个基于多租户的应用程序,该程序将客户仪表板加载到商人名称.mystore.com子域上,但是一些要求自定义域功能的客户应该能够将其加载到mydomain.com上。

我已经在apache2.conf文件中使用以下代码完成了子域部分,因此所有子域都从角度应用文件所在的apps文件夹中加载

<VirtualHost *:80>
    ServerAlias *.mystore.com
   DocumentRoot /var/www/html/apps
    <Directory "/var/www/html/apps">
        AllowOverride All
        Require all Granted
    </Directory>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

对于自定义域功能,我在admin中有一节保存自定义域,但不确定如何实现。

我想到的可能方法是

  1. 创建虚拟主机文件,并在每个商户注册时使用其自定义域对其进行更新
  2. 用htaccess文件和mod_rewrite以某种方式执行

Shopify会这样做,但不确定他们如何加载特定于商家的商店。另一个让我忙于思考的问题是我应该要求更新哪些值

  1. 域名注册商的IP地址
  2. 命名服务器(不知道它将对我的AWS造成什么影响)
  3. 如某些文章所述,要求创建CNAME或A记录

Rod*_*o M 8

在我开发和管理的许多SaaS平台上,我都有类似的设置。正如您的客户建议的那样,这种设置当然是理想的。您应该从一开始就计划在其自己的域中为每个客户站点提供服务,可能还使用* SSL。我认为,对于当今架构良好的Saas服务而言,这是最佳实践。

在阅读您的问题时,我认为您已经过度设计了它。

对于同一服务器上的自定义域Saas应用,您只需打开端口80即可访问所有流量而无需考虑域名。将所有客户域指向app.mystore.com,这是您应用端点的CNAME。

然后,该应用读取HTTP请求标头,并以此方式确定所请求的主机名。

最后,应用程序在其客户端数据库中查找主机名,并找到给定客户域的客户端记录。

例如,在Nxinx中,您需要做的是:

server {
    listen       80 default_server;
    server_name  _;
    root         /var/www/myservice/htdocs;
}
Run Code Online (Sandbox Code Playgroud)

此服务器配置可为指向此端点的任何域提供全部捕获。

这就是Web服务器应允许其回答任何客户域的所有条件。该应用程序必须完成其余的工作。

*在此域上的应用程序上提供自定义域时,应计划为该域提供SSL端点,例如https://www.mycustomdomain.com。在您的体系结构设计中考虑这一点。如果您的应用程序故障转移到新IP,也请考虑DNS问题。

  • 如何为服务器上不受您控制的域安装第 3 方 SSL 证书。我的一切都与 CNAME 一起使用,即 vanity.mycompany.com 映射到 app.mysaas.com 。mysaas.com 有一个通配符证书 *.mysaas.com 并且 vanity.mycompany.com 有它自己的证书,但我不知道如何停止安全警告 (3认同)