我使用apache2 + fastcgi + suexec + php5在一台服务器上托pipe几个(〜30个)不同的站点。 站点有不同的负载和不同的脚本执行时间(其中一些处理请求5-7秒,一些<1sek)。
有时当单个站点收到很高的负载(本站点的所有php实例都被创build和使用)时,整个apache服务器都会挂起。 Apache(worker mpm)创build了新的进程,达到了上限。 它看起来像开始排队所有新的请求,每个站点,不仅是一个具有高负载,并迅速实现进程限制…重新启动Apache解决问题…
config:FastCgiConfig -singleThreshold 1 -multiThreshold 10 -listen-queue-depth 30 -maxProcesses 80 -maxClassProcesses 12 -idle-timeout 30 -pass-header HTTP_AUTHORIZATION -pass-header If-Modified-Since -pass-header If-None-Match
(之前有默认-listen-queue-depth = 100,但是没有改变任何东西…)
有什么build议么?
另一个问题 – 如何实施这个监听队列? 是整个Apache的一个队列,或每个定义的PHP应用(suexec站点)的唯一队列?
我想实现这样的事情:当一个网站收到高负荷,队列满 – 服务器反弹下一个请求,但只为这一个网站..其他网站应该正常工作…
Apache 2.4提供了一个新的fastcgi代理模块(mod_proxy_fcgi),可以将请求代理到php-fpm。 使用mod_proxy作为中介意味着您可以访问所有的mod_proxy选项,包括与主服务器分开的排队和耗尽参数。
我build议你在apache 2.4中使用MPM和php-fpm来设置testing服务器; 你也可以调整每个php池的不同应用程序。
你尝试过mod_fcgid吗? 处理服务器的高负载要好得多。
如果fastcgi以用户进程的forms运行php脚本,则应该由OS强制执行/etc/security/limits.conf定义(特别是nproc)。
即:apache将尝试以该用户的身份启动进程,并且操作系统将因为超出进程限制而终止该进程。
尽pipe如此,这也是一种混乱。 如果机器处于空闲状态,则仍然会连接。
你为什么不把你的大客户分到专用的机器上? 或者启动一个辅助apache,在一个高端口上监听,并设置足迹/运行时间津贴? 你可以使用mod_proxy透明地传递它的请求。
那就是说,我对fastcgi不太熟悉,所以可能已经有一些可用的配额系统了。 快速阅读文档没有任何networking,但。
您可以在这里查看一系列networking教程: http : //blog.stuartherbert.com/php/category/the-web-platform/
我个人觉得非常有见地! 本教程可能会有所帮助: http : //blog.stuartherbert.com/php/2008/10/07/can-you-secure-a-shared-server-with-php-fastcgi/
如果使用这么多的资源,我会build议老老实实地把高stream量网站移到自己的机器上。