【问题标题】:mod_fcgid + PHP + apache lockupmod_fcgid + PHP + apache 锁定
【发布时间】:2011-04-04 14:46:16
【问题描述】:

我正在运行一个相当典型的 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 还设置了 MaxProcessCount=15

有没有其他人遇到过这个错误,如果有,如何解决?

【问题讨论】:

    标签: php linux apache fastcgi


    【解决方案1】:

    我自己解决了这个问题。

    为了解决这个问题,在 FastCGI 配置中添加更严格的进程挂起检查,并减少 PHP 实例的生命周期:

    IPCConnectTimeout 20
    ProcessLifeTime 120
    IdleTimeout 60
    IdleScanInterval 30
    MaxRequestsPerProcess 499
    MaxProcessCount 100
    

    根据您的要求,这可以满足每小时点击次数超过 50k 的配置良好的服务器。

    您会发现记录的失效/“僵尸”PHP 进程的数量显着增加。但是,这很好,因为以前进程会变得没有响应,FastCGI 管理器会继续向它们发送请求!

    我还建议从您的 php.fcgi 脚本中删除所有覆盖指令,因为这可能会导致您的系统出现问题。尽量从 Apache 中的主要 FastCGI 配置进行管理。

    【讨论】:

      【解决方案2】:

      我们使用 Nginx + http://php-fpm.org/

      试试“strace -p”。

      我还看到一些 PHP 软件尝试从运行它的同一台服务器请求文件时发生锁定 (get_file_contents('http://localhost...'))

      【讨论】:

      • 自从问了这个问题,我也跳到了nginx和php-fpm,没有再出现这种问题。
      猜你喜欢
      • 1970-01-01
      • 2012-02-05
      • 2017-07-23
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      相关资源
      最近更新 更多