用NGINX放大器监控PHP应用程序


PHP一直是网络五大编程语言之一,许多网站都是基于像WordPress、Drupal或Joomla这样的PHP应用程序构建的。每天,数百万开发人员使用PHP创建新的应用程序或现有应用程序的扩展。

监控一个PHP应用程序可能是一项艰巨的任务。应该检查日志,应该实施专门的设置,并且应该收集和很好地理解相关的度量。在这个过程中很容易迷失,尤其是如果你刚刚开始使用像WordPress这样的东西,并且你还在学习如何建立你的网站。

在PHP应用程序中部署NGINX是很常见的。在这种情况下,NGINX通常充当本地网络加速器,而PHP-FPM充当应用服务器。事实证明,这种设置对于从PHP应用程序向NGINX卸载SSL终止、内容缓存、身份验证和其他方面的超文本传输协议安全性非常有用。

意识到将PHP-FPM度量和NGINX度量一起监控是很方便的,我们最近在NGINX放大器中启用了它(如果您还没有尝试过,sign up today对于测试版)。

如果放大代理紧挨着PHP-FPM主进程运行,代理可以自动检测PHP-FPM主进程,确定其配置,并开始收集PHP-FPM度量。

如果一切都设置好了,你马上就会有一组放大版的PHP-FPM的现成图表。

显示在Graphs页面在所有自动检测池中累积。如果您需要每个池的图表,请使用Dashboards创造custom graphs

让我们更详细地检查一下。

放大中的FPM度量

下面是目前在放大器中支持的PHP-FPM度量的列表。

放大中的度量 描述 FPM状态度量
已接受php.fpm.conn。 池接受的请求数。 接受连接
php.fpm.queue.current 挂起连接队列中的请求数。 监听队列
php.fpm.queue.max 自FPM启动以来,挂起连接队列中的最大请求数。 最大监听队列
php.fpm.queue.len 挂起连接的套接字队列的大小。 监听队列透镜
php.fpm.proc.idle 空闲进程的数量。 空闲进程
php.fpm.proc.active 活动进程的数量。 活动流程
php.fpm.proc.total 空闲+活动进程的数量。 总过程
php.fpm.proc.max_active 自FPM启动以来的最大活动进程数。 最大活动进程数
php.fpm.proc.max_child 达到过程限制的次数。 触及最大儿童数
php.fpm.slow_req 超过的请求数request_slowlog_timeout价值。 慢速请求

代理应该运行在与PHP-FPM相同的进程环境中,并且能够找到PHP-FPM进程ps(1);否则,PHP-FPM度量收集将不起作用。例如,如果代理运行在主机系统上,但是PHP应用程序运行在该主机上的Docker容器中,那么您应该add the agent到码头工人集装箱。

当代理发现一个PHP-FPM主进程时,它会自动检测到PHP-FPM配置的路径。当找到PHP-FPM配置时,代理将查找池定义和相应的pm.status_path指令。

代理将找到当前配置的所有池和URIs状态。代理然后通过FastCGI查询PHP-FPM池状态。没有必要在您的NGINX配置中定义一个指向URIs的PHP-FPM状态的HTTP代理。该代理不使用超文本传输协议,因此不依赖于NGINX提供一个超文本传输协议代理到PHP-FPM状态URI。

设置PHP-FPM监控代理

要开始监控PHP-FPM,请执行以下步骤:

  1. 确保您的PHP-FPM状态至少为一个池启用。如果不是,取消注释pm.status_path指令,然后重启PHP-FPM。
  2. Update最新版本的代理。
  3. 检查/etc/amplife-agent/agent . conf中是否包含以下选项
    [extensions]
    phpfpm = True
  4. Restart特工。

代理应该能够检测到PHP-FPM主节点和工作节点,获得对PHP-FPM状态的访问,然后收集度量。

使用带套接字的PHP-FPM

如果您的PHP-FPM被配置为使用一个TCP套接字,首先确保您可以使用cgi-fcgi(1)。再次检查您的TCP套接字配置是否安全——理想情况下,PHP-FPM池在127.0.0.1上侦听,并且listen.allowed_clients也启用了。

检查您是否可以从命令行查询该池的PHP-FPM状态:

$ SCRIPT_NAME=/status SCRIPT_FILENAME=/status QUERY_STRING= REQUEST_METHOD=GET cgi-fcgi -bind -connect 127.0.0.1:9090

上面的命令(或类似命令)返回了一组正确的PHP-FPM度量:

Expires: Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate, max-age=0
Content-Type: text/plain  
  pool:                 www
process manager:      dynamic
start time:           26/Jul/2016:12:51:05 -0400
start since:          29458594
accepted conn:        757839
listen queue:         0
max listen queue:     0
listen queue len:     0
idle processes:       1
active processes:     1
total processes:      2
max active processes: 1
max children reached: 0
slow requests:        0

cgi-fcgi实用程序必须单独安装(通常与libfcgi-dev包)。代理不需要该工具来收集和报告PHP-FPM度量。然而,快速诊断PHP-FPM度量收集的可能问题是必不可少的。

用Unix域套接字使用PHP-FPM

如果您有一个单独的PHP-FPM实例,请检查NGINX、放大代理和PHP-FPM工作器是否都在同一个用户标识下运行(例如,www-data)。如果有多个池配置了不同的用户标识,请确保代理的用户标识包含在PHP-FPM工作人员的组标识中。这是代理在通过FastCGI查询度量时访问PHP-FPM池套接字所必需的。

首先,检查您要监控的PHP-FPM池的监听套接字,并为其启用pm.status_path,正确配置了listen.ownerlisten.group

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

接下来,验证池的PHP-FPM侦听套接字是否已正确创建并具有正确的权限。

$ ls -la /var/run/php5-fpm.sock
srw-rw---- 1 www-data www-data 0 Jul 26  2016 /var/run/php5-fpm.sock

最后,从命令行查询该池的PHP-FPM状态,看看它是否返回PHP-FPM度量的列表。

$ $ SCRIPT_NAME=/status SCRIPT_FILENAME=/status QUERY_STRING= REQUEST_METHOD=GET cgi-fcgi -bind -connect /var/run/php5-fpm.sock

如果一切设置正确,代理将收集PHP-FPM度量,您将在Graphs暂时传呼。

在PHP中监控什么——FPM

如果你运行的是一个基于PHP的应用程序,比如WordPress,定期检查以下内容并调整PHP-FPM设置(有时也包括NGINX和操作系统设置)以确保你的网站运行良好是非常重要的:

  • PHP-FPM工作人员的数量。放大诸如php.fpm.proc.max_child等度量PHP-FPM related metrics可能会有帮助。如果您的PHP-FPM一直缺少处理传入请求的工作人员,那么最终用户打开网站需要更多的时间(如果它真的打开了的话!(
  • 缓慢的请求。PHP-FPM有一个有用的特性,可以记录和监控花费太长时间的请求(实际上可以配置多长时间)。默认情况下,这种监控是不打开的,因此检查您的PHP-FPM池配置文件并设置是有意义的slowlogrequest_slowlog_timeout相应的变量。相应的metric放大是php.fpm.slow_req。
  • 连接队列。当传入的请求不能被立即接受时(例如,没有空闲的工作人员可以处理该请求),它将在连接队列中等待。实际的设置和行为取决于操作系统的配置,所以定期检查放大器中相关的PHP-FPM度量是值得的

故障排除

如果没有收集到PHP-FPM度量,这里有一个警告列表:

  • 没有为任何池启用状态URI。
  • 代理无法连接到TCP套接字(当使用带有TCP套接字的PHP-FPM时)。
  • 代理无法解析PHP-FPM配置——请像这样报告问题,我们将进行调查。
  • 代理和PHP-FPM工作人员使用不同的用户标识,或者缺少一个单独的组(当使用带有Unix域套接字的PHP-FPM时)。
  • 为PHP-FPM侦听套接字配置了错误的权限(当将PHP-FPM与Unix域套接字一起使用时)。
  • 代理和PHP-FPM实例不在同一个流程环境中(例如,代理安装在主机系统上,而PHP-FPM实例在Docker容器中)。

结论

我们希望您能方便地在放大器中看到PHP-FPM度量,并对应用程序行为有一个更广阔的视角。有了操作系统NGINX的度量标准,现在又有了PHP-FPM的度量标准,用放大器监控LEMP堆栈就变得更容易了。

我们计划在不久的将来监控更多的应用程序堆栈组件,所以请保持联系。如果你有什么建议,请告诉我们!