lighttpd + PHP-fcgi 响应缓慢

lighttpd + PHP-fcgi 响应缓慢

我们在使用 lighttpd 作为 web 服务器,使用 php5 作为后端(通过 fast-cgi)时遇到了问题。有时,在请求调用 的简单文件时,服务器的响应时间会超过 5 秒(最多 20 秒)phpinfo();。服务器日志未显示任何错误,HTTP 响应为 200。

当我请求不包含任何 PHP 内容的静态 html 文件时,没有任何问题,并且所有请求都得到快速处理。

这是 lighttpd-fcgi 配置:

fastcgi.debug = 1
fastcgi.server += ( ".php" =>
    ((
        "bin-path" => "/usr/bin/php-cgi",
        "socket" => "/tmp/php.socket",
        "max-procs" => 7,
        "bin-environment" => (
            "PHP_FCGI_CHILDREN" => "5",
            "PHP_FCGI_MAX_REQUESTS" => "5000"
        )
    ))
)

服务器运行的是 Debian 7 64 位。

答案1

检查您是否有任何孤立的 fcgi 处理程序,最简单的方法是停止 lighttpd,然后“ps auX”并查找 php-cgi。如果存在,请将其关闭,然后重新启动 lig​​hty。

在您的 lighty 配置中设置服务器状态处理程序。这将允许您刷新页面并查看当前正在处理的所有连接及其状态。 http://redmine.lighttpd.net/projects/1/wiki/Docs_ModStatus

检查 lighty 是否真的能够写入其错误日志。停止并重新启动 lig​​hty 时,它应该在 error.log 中留下一个日志。这样,如果您的 fcgi 处理程序全部被占用,并且 lighty 必须暂停请求,它就会记录此情况。

除非您有非常充分的理由,否则我不会推荐 max-procs => 7。尝试将 max-procs 降低到 1,并大幅提高 FCGI_CHILDREN。我的高流量服务器配置为使用 max-procs 1 和 FCGI_CHILDREN 120。我意识到这与 lighttpd wiki 相矛盾,但那是由用户编辑的,而我的建议是基于经验证据以及直接来自 lighty 团队的建议。

另一件需要注意的事情是,有一个单独的操作码缓存用于每个过程。因此,通过将其减少到 1,所有脚本都使用相同的操作码缓存,这意味着编译和修剪 7 个不同缓存所花费的时间更少。

答案2

每个 php 工作进程一次只能处理一个请求;每个“proc”(在您的情况下为 7)通常有一个主进程(不处理请求)和PHP_FCGI_CHILDREN(在您的情况下为 5)工作进程,总共有 35 个工作进程。

lighttpd 为每个“proc”分配一个单独的套接字,每个套接字都有自己的请求队列。因此,如果处理您的请求需要很长时间,则很可能是所选后端有很长的请求队列需要处理。

因此只需做一些简单的计算:如果一个请求需要 php 大约 2 秒来处理,那么您的设置#workercount / #timeperrequest = 17.5每秒就可以处理请求数。

为了增加每秒的请求数,您有两个选择:

  • 启动更多 php 工作进程(并确保有足够的内存/CPU 供它们运行、监视top和其他工具)
  • 提高单个请求的响应时间(留意慢速 SQL 查询、对内部服务的 http 请求等);再次检查内存和 CPU 瓶颈top- 如果您的服务器开始交换,一切都会变得非常慢。

PS:不要将套接字放入/tmp;而是将它们放入(/var)/run/lighttpd/,并确保只有您的 lighttpd 用户 ( www-data) 有访问权限,请参阅CVE-2013-1427

相关内容