cacti搞运维的人不会陌生,可能是现在使用最多的监控工具了。跟互联网相关的公司可能多少都会用到cacti来监控服务器运行状态和一些软件的负载情况。

现在网站用的最多的后端技术可能就是php了,无论nginx还是lighttpd,如今的负载能力都非常强,在很多牛人的努力下,负载几万到十万并发的都屡见不鲜。但是,这是在完全静态的情况下,加上php就会效率大减。所以其实一个动态网站的负载能力的瓶颈往往都在php上面。

网上很多文章介绍cacti是如何监控nginx并发数的,不过目前还没有介绍如何监控php的工作状态的文章,我在谷歌百度搜了一圈,也没找到一个中文的监控php的介绍文章,所以不才闲着没事,简单改造了一个模板,用来监控php-fpm的工作情况。我相信国内很多人可能早就用上了,只是没工夫说而已。

所谓改造,即不是我原创的。原作者地址在
我将这个模板下载下来后尝试了一下,发现不是那么简单易用,需要perl中的FCGI::Client和LWP::UserAgent等模块的支持,这对于不熟悉perl和cpan的人来说,会很头疼。perl语言的这个脚本同时具有安全隐患,因为他使用FCGI::Client.pm模块来直接访问php-fpm的9000端口,这就需要你的php-fpm监听在一个除127.0.0.1的其他IP上,这样,如果你需要跨机房监控,就势必要把php-fpm监听在一个外网IP上,除非你指定php-fpm的访问IP或者做***。不过我想大多数公司一来不具备这个技术实力,二来如果跨机房多了,改造配置也是个极麻烦的事情,改错了就会给人家留一个9000端口的漏洞出来,人家直接架一个nginx指向php过来就可以干坏事了。

所以花了5分钟将模板稍作修改,并用shell重写了获取脚本。将php-fpm的状态监控跳转到nginx上,从网页获取,既支持跨机房访问,无需暴露9000端口在任何IP地址上,对php-fpm.conf文件的改动最小,唯一一个是需要改造一下nginx,加一个类似于监控nginx的配置项。并需要cacti服务器上有curl支持,不过用yum或者apt-get安装curl似乎比用cpan安装模块要简单多了。原理和用cacti监控nginx是一样的。所以,如果你做过nginx的监控,用这个模板就非常简单了。

不过这个脚本也存在一个问题,就是如果你用一台nginx用upstream后端挂多个php-fpm负载均衡,可能会产生数据不准确问题。这样的话,你可以访问上面的连接,采用原版直接访问9000端口的方式。

讲一下使用这个脚本需要操作的几个步骤:

1. 你需要改变php-fpm.conf文件中的一行
找到pm.status_path = /status,将前面的注释分号去掉。保存退出

2. 打开nginx.conf文件
在server{}段中加入下面这段话,注意不要和你的nginx状态监控的重定向路径冲突,如果冲突,请同时修改php-fpm中的设置和nginx中的设置
location ~ ^/(status)$ {
                                                include fastcgi_params;
                                                fastcgi_pass 127.0.0.1:9000;
                                                fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
}

保存退出

3. 重启php-fpm,重启nginx
尝试访问http://yourserver/status看是否能获取到php-fpm信息,正常的话,应该显示如下

pool:                                 www
process manager:            dynamic
start time:                     16/Jun/2012:01:28:33 +0800
start since:                    67269
accepted conn:                4526202
listen queue:                 0
max listen queue:         0
listen queue len:         0
idle processes:             174
active processes:         1
total processes:            175
max active processes: 23
max children reached: 0


4. 将附件中解压缩出来的的shell脚本上传至cacti服务器的cacti/scripts文件夹下。并赋予可执行权限。执行测试一下看是否能获取到php-fpm的状态。
./cacti_check_php-fpm.sh 114.xxx.xxx.xxx 80 /status

5. 将附件中的xml模板导入到cacti中,然后在设备那里创建新图的时候,你会看到一个php-fpm fastcgi status的模板,使用它创建,并填上服务器IP端口和路径就可以了,参照测试命令行写就可以。

在实际测试中,支持php 5.3.8及以上版本,5.3.8之前的php版本未测试,如有问题可修改脚本中的grep部分,一共不超过15行的脚本,简单的很,一看就明白。

监控效果如图所示。