听听Scott Hanselman对Stack Overflow团队的采访(第1部分和第2 部分),他坚持认为SQL服务器和应用服务器应该在不同的机器上.这只是为了确保如果一台服务器受到攻击,两个系统都无法访问?安全问题是否超过两台服务器的复杂性(额外成本,两者之间的专用网络连接,更多维护等),特别是对于小型应用程序而言,这两种服务器都没有使用过多的CPU或内存?即使有两台服务器,一台服务器受到攻击,攻击者仍可能通过删除数据库或弄乱应用程序代码而造成严重损害.
如果性能不是问题,为什么会这么大?
安全.您的Web服务器位于DMZ中,可从公共Internet访问并从匿名用户那里获取不受信任的输入.如果您的Web服务器遭到入侵,并且您在连接到数据库时遵循了最少的权限规则,那么最大的风险就是您的应用程序可以通过数据库API执行的操作.如果您之间有业务层,则攻击者和数据之间还有一个步骤.另一方面,如果您的数据库位于同一服务器上,则攻击者现在可以根据您的数据和服务器进行访问.
可扩展性.保持Web服务器无状态允许您轻松地水平扩展Web服务器.这是非常困难的横向扩展的数据库服务器.
性能.2个盒子= CPU的2倍,RAM的2倍,以及2倍的磁盘访问权限.
所有这一切,我当然可以看到合理的情况,这些点都不重要.
它并不真正的事(你可以很愉快地运行您的网站在同一台机器上的网络/数据库),它只是在缩放最简单的一步..
这正是StackOverflow所做的 - 从运行IIS/SQL Server的单机开始,然后当它开始负载很重时,购买了第二台服务器并将SQL服务器移到了它上面.
如果性能不是问题,不要浪费钱购买/维护两台服务器.
另一方面,他们发现大多数用户可以通过将数据库放在与网站相同的机器上来加速网站(使用Telligent的社区服务器),从而引用不同的博客Scott(Watermasyck,Telligent).但是,在客户的情况下,通常数据库和Web服务器是该计算机上唯一的应用程序,并且该网站不会对机器造成太大影响.然后,不必通过网络发送数据的效率更多,以弥补增加的应变.
我认为最重要的因素是性能.Web服务器/应用程序代码和SQL Server都会将通常请求的数据缓存到内存中,并且通过在相同的内存空间中运行它们来杀死缓存性能.
汤姆对此是正确的.其他一些原因是它不具有成本效益,并且存在额外的安全风险.
Web服务器具有与数据库服务器不同的硬件要求.数据库服务器具有大量内存和非常快的磁盘阵列,而Web服务器只需要足够的内存来缓存文件和频繁的数据库请求(取决于您的设置).关于成本效益,两台服务器不一定会更便宜,但性能/成本比应该更高,因为您不需要竞争资源的不同应用程序.出于这个原因,你可能不得不花费更多的时间来为一台迎合两者的服务器提供相同的性能,并提供与2个专用服务器相同的性能.
安全问题是如果单个机器受到攻击,则Web服务器和数据库都是易受攻击的.有两个服务器,你有一些喘息的空间,因为第二个服务器仍然是安全的(至少一段时间).
此外,还有一些可伸缩性优势,因为您可能只需维护一些不同Web应用程序使用的数据库服务器.这样,您可以减少应用升级或修补程序以及执行性能调整的工作量.我相信有一些服务器管理工具可以让这些任务更容易(在单机情况下).
安全是一个主要问题.理想情况下,您的数据库服务器应位于防火墙后面,只打开执行数据访问所需的端口.您的Web应用程序应该使用SQL帐户连接到数据库服务器,该帐户具有足够的权限以使应用程序正常运行,而不再需要.例如,您应该删除允许删除对象的权限,并且大多数情况下您不应该使用诸如"sa"之类的帐户进行连接.
如果您将Web服务器丢失为劫持(即完全权限升级为管理员权限),最糟糕的情况是您的应用程序的数据库可能会受到危害但不会影响整个数据库服务器(如果是数据库服务器和Web服务器是同一台机器).如果您已经加密了数据库连接字符串并且黑客不够精明来解密它们,那么您丢失的只是Web服务器.
尚未提及的一个因素是负载平衡.如果您开始将Web服务器和数据库视为单独的计算机,则可以优化更少的网络往返次数,并且随着需求的增加,可以更轻松地添加第二个Web服务器或第二个数据库引擎.
我可以从第一手经验说,将Web服务器和数据库放在不同的机器上通常是个好主意.如果您的应用程序占用大量资源,则很容易导致计算机上的CPU周期达到峰值,从而导致计算机停止运行.但是,如果您的应用程序对数据库的使用有限,那么让它们共享服务器可能没什么大不了的.
哇,没有人带来了,如果你实际购买SQL服务器在5K块钱,你可能想使用它比你的Web应用程序更多的事实.如果您使用快递,也许您不在乎.我看到SQL服务器运行20到30个应用程序的数据库,因此将它放在网络服务器上并不聪明.
其次,取决于服务器的用户.我为金融公司和政府工作.所以我们在使用sprocs并限制从webserver到SQL的端口的方法中使用了一种疯狂的痛苦.因此,如果Web应用程序被黑客入侵.黑客可以做的唯一的事情就是调用存储过程作为web服务器上的用户帐户被锁定,只看到在DB /调用存储过程.所以现在黑客必须弄清楚如何进入数据库.如果它在Web服务器上很好,它很容易到达.
我同意Daniel Earwicker的说法 - 安全问题存在很大缺陷.
如果您使用网络服务器进行单一框设置,并且只有该网络服务器的数据库,那么如果该网络服务器遭到入侵,则会丢失该网络服务器以及该特定应用程序的数据库.
这与在双服务器设置上丢失网络服务器时发生的情况完全相同.您丢失了Web服务器,只丢失了该特定应用程序的数据库.
您拥有双服务器设置的"保持数据库服务器完整性的其余部分"的论点是无关紧要的,因为在第一种情况下,与其他所有应用程序相关的每个其他数据库服务器(如果有的话)也不受影响 - 就像他们一样,在其他地方举办.
同样,对于Kev提出的问题,那么驻留在数据库服务器上的所有其他数据库呢?你丢失的只是一个数据库.
如果您在一台服务器上托管应用程序和数据库,则只能在该服务器上托管与该应用程序相关的数据库.因此,与多服务器设置相比,您不会在单个服务器设置中丢失任何其他数据库.
相比之下,在2服务器设置中,攻击者可以访问Web服务器,并通过代理,数据库服务器的有限权限(在最好的情况下),他们可以通过携带使其他应用程序的数据库处于危险之中缓慢,内存密集型查询或最大化数据库服务器上的可用存储空间.通过将应用程序分离到他们自己的关注点(非常类似于虚拟化),您还可以出于安全目的以正面方式隔离它们.