> Apache mod_PHP(你如何保护它?除了safe_mode,因为它不会在PHP6中)
> Apache CGI suexec
> Lighttpd并为每个用户生成一个FastCGI
LE:我对使用已经制作的控制面板不感兴趣,因为我正在尝试编写自己的控制面板,所以我想知道自己设置这个的最佳方法是什么.
我正在考虑使用Lighttpd并为每个托管用户生成一个fastcgi,使得fcgi进程在他的凭据下运行(在lighttpd wiki上有一个教程).
这有点安全,但这会影响性能(每个fcgi所需的大量用户/内存),以至于它不是一个可行的解决方案吗?
但是,这不是你问的.从本质上讲,我会说你列出的三个选项中存在一系列安全性/可扩展性与速度权衡,你只需要决定你想要的位置.如果您是一个共享托管服务提供商,不安全的用户安装上帝知道什么程序,您将更倾向于安全性,如果这是在更受信任的用户之间共享,您可能倾向于性能.以下是我的想法:
CGI suexec:就共享托管环境中的用户/站点数量而言,这是迄今为止最安全,最高效/可扩展的.生成进程并仅在请求进入时使用内存.当然,CGI生成使得这对于单个脚本的执行时间来说是最慢的.慢多少?那么你必须进行基准测试,但一般来说,如果人们正在运行长时间运行的应用程序(例如wordpress需要0.25-0.5秒来加载它的库并在每个请求上初始化),那么CGI产生的惩罚开始看起来很漂亮在上下文中可忽略不计.
FastCGI:这里的问题(如果您的网络服务器是Apache,Lighttpd或Nginx并不重要)正在计算每个用户运行多少个FCGI子进程,因为每个进程占用的内存等于PHP解释器的大小(在Linux中并不是所有的都是有线的,但我离题了).并且,与mod_PHP不同,这些进程不会在用户之间共享,因此您必须限制每个用户.例如,Dreamhost为他们的客户限制为3 – 现在,对于运行网站的客户来说,每秒超过2-5次页面浏览的爆发,这实际上非常糟糕,因为这些请求只是堆叠而网站挂起.现在,当我在专用服务器/集群上运行应用程序时,我喜欢使用轻量级网络服务器的FastCGI,当我可以为应用程序提供数百个FCGI子项时(当然,所有这些都有webserver privs,例如Apache / prefork mod_PHP).但是,我不认为共享主机是有意义的,你需要为每个用户分配/限制FCGI子项.
Apache mod_PHP:由于所有内容都使用webserver privs,所以最不安全,但是你的实时PHP进程池是共享的,因此它在性能方面是最好的.从开发人员的角度来看,我无法容忍PHP_safe模式,从系统管理员的角度来看,它实际上只是一种安全幻觉(它可以减轻愚蠢的用户但不能防止实际攻击)所以我真的宁愿拥有CGI,如果我的话其他选项必须包括safe_mode.
Dreamhost确实是一种混合体,它们默认使用Apache CGI suexec,但是如果他们想要的话,让更多精明的用户中的(小)百分比选择做FCGI,受限于他们自己的内存使用量监控.这样可以节省大量内存资源,而不是默认为每个人启用FCGI.
另一个问题是,如果你谈论的是标准的商业共享托管,Apache是功能齐全的,几乎可以有任何模块(包括你可能想要的mod_security之类的东西),你的用户会喜欢它,因为他们的所有.htaccess配置都能正常工作等等 – 当他们去安装Drupal或wordpress或其他什么时,你会遇到其他任何事情的支持头痛(如果我们谈论内部用户,那么问题就少了很多).
就个人而言,我建议保持简单的开始和使用CGI suexec以获得最佳安全性和可扩展性.如果你的用户想要FCGI或mod_PHP并且你有一个很好的渠道可以与他们建议/沟通,他们会要求它,但是对你来说这些都是一个更大的问题,只有他们的性能改善,所以我的建议最初不会做他们中的任何一个,但如果他们吵着要响应.
我同样喜欢做一些像Lighttpd FCGI那样“有趣”的东西而不是标准的Apache CGI suexec,但我内心深处我真的不能推荐它.
如果您正在运行多个服务器,您最终可能会将CGI放在某些服务器上以及其他服务器上的高级用户.并且一定要有cron grep所有的www dirs用于像旧版本的PHPBB这样的东西!