我正在运行一个相当典型的 LAMP 堆栈,其中 PHP 通过 mod_fcgid 运行。考虑到服务器收到的流量,我认为服务器处于“高负载”状态。
存在一个间歇性问题,当访问依赖 PHP 的站点时,Apache 报告所有连接都处于“正在发送内容”状态(监视器上的“W”)。
没有 PHP 错误可言,就好像 PHP 在这些“锁定”期间实际上没有被调用。但是,在 apache 站点日志中我看到以下内容:
(103)Software caused connection abort: mod_fcgid: ap_pass_brigade failed in handle_request function
[warn] mod_fcgid: can't apply process slot for /var/www/cgi-bin/php.fcgi
在此期间,我仍然可以访问不依赖于 PHP 的站点,例如 apache 状态和纯 HTML 虚拟主机(不包含 PHP 处理程序)。
php.fcgi 脚本有PHP_FCGI_MAX_REQUESTS=500设置,因为我读到 PHP 在 CGI 模式下运行存在竞争条件问题。 fcgid.conf 还具有最大进程数=15 set.
有其他人遇到过这个错误吗?如果有,如何解决?
我自己设法解决了这个问题。
要解决此问题,请在 FastCGI 配置中添加更严格的进程挂起检查,并缩短 PHP 实例的生命周期:
IPCConnectTimeout 20
ProcessLifeTime 120
IdleTimeout 60
IdleScanInterval 30
MaxRequestsPerProcess 499
MaxProcessCount 100
根据您的要求,这可以满足每小时超过 50k 次点击的配置良好的服务器。
您会发现记录的失效/“僵尸”PHP 进程的数量显着增加。不过,这很好,因为以前进程会变得无响应,而 FastCGI 管理器会继续向它们传送请求!
我还建议从 php.fcgi 脚本中删除所有覆盖指令,因为这可能会导致您的系统出现问题。尝试尽可能从 Apache 中的主要 FastCGI 配置进行管理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)