我在一台服务器上使用 apache2+fastcgi+suexec+php5 托管多个(~30)个不同的站点。站点具有不同的脚本负载和不同的执行时间(其中一些处理请求 5-7 秒,一些 <1sek)。
有时,当单个站点接收到非常高的负载时(该站点的所有 php 实例都已创建和使用)-整个 apache 服务器挂起。Apache (worker mpm) 创建新进程达到上限。看起来它开始对每个站点的所有新请求进行排队,不仅是具有高负载并快速达到进程限制的站点......重新启动 apache 解决了问题......
配置: 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,但它没有改变任何东西......)
有什么建议么?
另一个问题 - 这个监听队列是如何实现的?它是整个 apache 的一个队列,还是每个定义的 php 应用程序(suexec 站点)的唯一队列?
我想实现这样的目标:当一个站点接收到高负载并且它的队列已满时 - 服务器反弹下一个请求,但仅针对这个站点..其他站点应该正常工作......
Apache 2.4 提供了一个新的 fastcgi 代理模块 (mod_proxy_fcgi),可以将请求代理到 php-fpm。使用 mod_proxy 作为中介意味着您可以访问所有 mod_proxy 选项,包括与主服务器分开的排队和耗尽参数。
我建议您使用 apache 2.4 事件 MPM 和 php-fpm 在测试服务器上设置它;您也可以针对不同的应用程序调整每个 php 池。
您是否尝试过 mod_fcgid ?在处理服务器的高负载方面要好得多。
如果 fastcgi 将 php 脚本作为用户进程启动,那么 /etc/security/limits.conf 定义(特别是 nproc)应该由操作系统强制执行。
即:apache 将尝试以该用户身份启动该进程,并且操作系统将终止该进程,因为它超出了进程限制。
不过,这有点杂乱无章;如果机器处于空闲状态,您仍然会终止连接。
你为什么不把你的大客户分叉到一台专用机器上呢?或者启动一个辅助apache,监听一个高端口,设置占用空间/运行时余量?您可以使用 mod_proxy 透明地传递它的请求。
也就是说,我对fastcgi不太熟悉,所以可能已经有一些配额系统可用;不过,快速阅读文档并没有带来任何好处。
您可以在此处查看一系列网络教程: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/
如果它正在使用这么多资源,我会建议诚实地将高流量站点移动到它自己的机器上。