构建“多站点”应用程序

时间:2009-12-07 23:28:41

标签: php mysql architecture codeigniter

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

我希望用户能够为其网站添加注册域名,而不是使用标准子域名。有关此的任何提示/方法吗?

此外,在开发具有此设计的东西时,我应该寻找哪些陷阱和问题?我最担心的是在数据库设计糟糕的情况下支持自己,并创建应用程序的噩梦来维护或更新。

谢谢你的时间!

4 个答案:

答案 0 :(得分:2)

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

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

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

更好的计划是开发一个独立的解决方案(针对单个网站) - 然后可以从它自己的目录运行,使用它自己的数据库和它自己的帐户集。它将显着缩小(在代码和数据库方面),因此可能表现更好。日常维护会更容易(从备份恢复网站),但软件更新(添加新功能)会有点棘手,虽然因为它只是文件上传和SQL补丁,所以你可以自动化这个轻松。

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

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

答案 1 :(得分:1)

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

这就是说...不要这样做。这通常不是一个好主意。甚至37Signals,这种使这种帐户管理着名的人正在放弃,并转向集中帐户。查看http://37signals.com/accounts

答案 2 :(得分:1)

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

我刚用Googled,“通配符dns mod_rewrite帐户”(没有引号)并找到了一些带有说明的示例,例如:

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

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

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

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

答案 3 :(得分:0)

首先,您必须设置您的Apache(或您正在使用的任何网络服务器),以便为每个子域提供相同的DNS设置(通配符匹配)。然后,您必须使用CodeIgniter的路由功能来解析请求URL中的子域,将其设置为param(或者在CodeIgniter中调用的任何内容),并在控制器中获得一些乐趣。

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