![通配符 DNS、托管 DNS 或 DNS 服务器](https://linux22.com/image/564641/%E9%80%9A%E9%85%8D%E7%AC%A6%20DNS%E3%80%81%E6%89%98%E7%AE%A1%20DNS%20%E6%88%96%20DNS%20%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我正在建立一个网站,用户可以在其中建立自己的网站。用户输入一个网站名称(例如 site1),然后使用子域名 site1.example.com 创建网站。目前,我已将通配符 DNS 设置为创建网站的单个服务器。这很好用,但对于将来的使用来说,可扩展性不够。
我希望能够控制在哪个服务器上创建网站。例如,site1 在 server1 上创建,site2 在 server2 上创建。我一直在寻找一些解决方案。
- 在创建站点之前设置我自己的 DNS 服务器并创建子域。
- 使用某种具有 API 的托管 DNS 服务器来创建域。
- 以某种方式使用 IIS,以便我可以将通配符 DNS 重定向到服务器上托管的子域。
我更喜欢 IIS 解决方案,但没有找到任何有关设置它或是否可行的示例。
也许有一些开源或付费的解决方案可用。
答案1
有很多方法可以解决这个问题,但最好的解决方案取决于您的限制、环境、站点类型等。例如:
- 单个服务器是否因为每个站点的内容大小或产生的负载/流量而无法处理所有站点?
- 内容是存储为文件还是存储在数据库中?
- 网站是否正在运行需要共享状态的应用程序?共享状态是否保存在内存中或另一台服务器或服务器集群中?
- 每个站点是否都需要自己部署应用程序,或者应用程序是否支持多租户(基本上,它是否可以查看所请求的主机名,并将其用作其站点 - 这是大多数多客户端托管 CMS/电子商务应用程序的工作方式)
- 单个站点是否会变得太大以致于无法由单个服务器处理?
我假设您有一个“典型”的 Web 应用程序,该应用程序托管在 Web 服务器中,会话状态本地存储在内存中(许多平台的默认设置),并且有一个数据库。我假设存储在数据库中,并且您的应用程序支持多租户。
建立此设置的“典型”方式是采用多个层级:
- 数据库层(非常强大的故障转移对、主/从系统或集群,取决于您的数据库平台)
- 会话状态层(可能存储在数据库层、单独的数据库、IIS 会话状态服务器、memcached 或类似的东西中)
- 应用程序层(您的应用服务器 - IIS)
- 负载平衡层(专用硬件、nginx、HAproxy 等)
这其中有几个关键点:
- 任何应用服务器都能够处理任何“站点”的请求(因为它们都是同一个应用程序,并且都连接到同一个数据库)
- 您的会话状态必须共享并可供所有应用服务器使用
- 您的数据库层必须能够处理来自所有应用服务器的同时访问负载。大多数人在不同点使用大量缓存来实现这一点。
- 如果您追求高可用性,则需要具有 N+1 容量:例如,如果您的峰值负载需要 10 台应用服务器,那么您应该至少拥有 11 台。
- 在大型网站中,人们很多时候会将其静态内容(图像、CSS 等)卸载到另一台服务器,甚至是 Akami 或 Amazon CloudFront 等 CDN。
设置非常灵活。您可以添加大量应用服务器。您可以独立更改任何层的设置。您没有单点故障(例如,您可以容忍一两台服务器丢失而不会被任何人注意到)。
即使你的应用不支持多租户,你也有几个选择:
- 将每个站点部署到每台服务器(注意:这要求您有一种方法可以使所有文件保持同步以进行安装/更新,并且您不会在本地存储任何内容)
- 将每个站点部署到每台服务器上,但将内容存储在集中式(和冗余)NAS 或 SAN 上
- 有选择地部署站点,然后使用负载均衡器根据主机名将流量引导到适当的服务器。
看一眼StackExchange 的设置,这实际上与我刚才描述的非常接近:
答案2
对此有多种解决方案。那么根据域静态地决定服务器目的地怎么样?例如,在创建“site12”后,如果“site12”的哈希值为偶数,则转到服务器1,否则转到服务器2。
答案3
您的问题是通过编程方式创建 DNS 记录吗?
如果是的话,您可以使用 NicTool。它具有用于管理 DNS 的广泛 API,并且可以与许多名称服务器配合使用。
免责声明:我在工作中使用 NicTool,并且设置了自动化系统,这为我们节省了大量成本。