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