【问题标题】:Building a 'multi-site' application构建“多站点”应用程序
【发布时间】:2010-12-24 05:35:21
【问题描述】:

我正在计划一个允许用户创建特定类型网站的应用程序。我想将帐户名称链接到“account.myapp.com”。转到“account.myapp.com”将提供一个网站。我不知道如何映射这个。我将使用 Code Igniter 作为我的开发工具。

我想让用户能够为其网站添加注册域名,而不是使用标准子域。有什么提示/方法吗?

另外,在使用这种设计进行开发时,我应该寻找哪些陷阱和问题?我最大的担忧是让自己陷入糟糕的数据库设计的困境,并创建一个需要维护或更新的应用程序的噩梦。

感谢您的宝贵时间!

【问题讨论】:

标签: php mysql architecture codeigniter


【解决方案1】:

您拥有一个为所有网站提供服务的应用程序的计划将是一项艰巨的任务和大量的工作。这并不是说不可能(包括 Sharepoint 在内的大量企业 CMS 允许您从一次安装中运行“虚拟站点”等)。

您将需要进行大量规划和设计,特别是在安全方面,以确保各个站点独立运行。我假设每个站点都有自己的帐户 - 您将不得不做很多工作以确保用户不会意外(或恶意)开始编辑另一个站点。

您考虑维护是正确的 - 如果您让所有站点在单个应用程序下运行,因此在单个数据库下运行,那么该数据库将很快变得庞大而混乱。然后它也会成为单点故障。

更好的计划是开发一个独立的解决方案(针对单个网站) - 然后可以从它自己的目录运行它,它有自己的数据库和它自己的一组帐户。它会小得多(就代码和数据库而言),因此性能可能会好得多。日常维护会更容易(从备份中恢复网站),但软件更新(添加新功能)会有点棘手,虽然它是 PHP,它只是文件上传和 SQL 补丁,因此你可以自动化这个轻松。

在域方面:如果您使用单个应用程序(每个网站一个)方法,您可以使用 Apache 的 Dynamic Virtual Hosts 功能,它有效地将 URL 映射到文件系统,(因此 website.mydomain.com 可以翻译自动与 /home/vhosts/com/mydomain/website 分离):因此部署新网站只需将文件复制到正确的目录,创建数据库并更新配置文件,所有这些都可以轻松实现自动化。

如果用户想使用他们自己的 URL,那么他们必须首先更新他们的 DNS 以指向您的服务器,其次您需要为该域配置一个 Apache 虚拟主机,这可能涉及重新启动 apache 并因此影响所有其他用户。

【讨论】:

  • 很好的回应!感谢您深思熟虑的答案。这是我在考虑您的帖子后的想法。设计应用程序,就好像它是为单个站点设计的一样。不过,身份验证可能会链接到一个单独的数据库。正如您所提到的,这将有助于隔离问题。注册成功后,我的脚本将使用新用户 ID 的名称创建一个新数据库,从我的仓库复制最新代码,最后设置数据库连接和身份验证。这听起来像一个合理的设计吗?再次感谢你的帮助!非常感谢。
【解决方案2】:

这在 codeigniter 中很容易做到,可以使用routes.php 和预控制器挂钩来完成。

据说...不要这样做。这通常不是一个好主意。就连以这种账户管理方式闻名的 37Signals 也在放弃,转向中心化账户。检查http://37signals.com/accounts

【讨论】:

    【解决方案3】:

    如果我正确理解您的问题,您需要设置通配符 DNS,并使用 Apache mod_rewrite 在内部将(示例)myaccount.myapp.com 重定向到 myapp.com/?account=myaccount。您的应用逻辑可以从那里获取它。

    我刚刚在 Google 上搜索了“wildcard dns mod_rewrite account”(不带引号),并找到了一些带有说明的示例,例如:

    http://www.reconn.us/content/view/46/67/

    这是构建某些网络应用程序 IMO 的有效且理想的方式。我不知道有严重的缺点。

    我真的不知道允许用户指定自己的个人域名的好方法(自动/可扩展),但如果您让他们修改其域的 DNS 以指向您的网站,您也许可以做到这一点服务器,然后将 ServerAlias 指令添加到您的“myapp”Apache 配置中。您仍然面临 myapp 运行时实例的问题,即通过客户域发出的请求是特定于客户帐户的。所以(示例)customeraccount.com 真的等同于 myapp.com/?account=customeraccount。一些更多的 mod_rewrite 规则可能会解决这个问题,但它不是自动化的(也许它可能是使用包含文件等)。

    抱歉,您说您使用的是 CodeIgniter ... 代替 myapp.com/account/myaccount 我写了 myapp.com/?account=myaccount。

    【讨论】:

    • +1,我建议使用通配符和 apache 设置将 myaccount.myapp.com 重定向到 myapp.com/accounts/myaccount/
    【解决方案4】:

    首先,您必须设置您的 Apache(或您使用的任何网络服务器)为每个子域提供相同的 DNS 设置(通配符匹配)。然后,您必须使用 CodeIgniter 的路由功能从请求 URL 解析子域,将其设置为参数(或 CodeIgniter 中调用的任何内容)并在您的控制器中使用它。

    关于陷阱和问题:这取决于你想做什么。 ;)

    【讨论】:

      猜你喜欢
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 2017-12-07
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多