自动检测 PHP-FPM 的错误并重启的 PHP 脚本

公司的 WEB 生产服务器使用 NGINX+PHP-FPM 构建。

近日 NGINX 频报 (110: Connection timed out) 以及 (11: Resource temporarily unavailable) 的错误,出错后后端的 PHP-FPM 几乎全部挂死,重启 PHP-FPM 后又能正常工作。

初步认定是 PHP-FPM 或系统参数配置有问题,优化了系统参数并重启服务器后,目前尚未发现问题。

但是依然比较担心意外情况发生,没人想在春节期间再来照看这些服务器,索性用 PHP 写了个脚本监控错误日志,监测到错误后自动重启 PHP-FPM。

脚本下载:
phpfpm_guarder

配置说明:
$bin_tail_path tail命令路径
$bin_cp_path cp命令路径
$log_path 错误日志文件路径
$error_logs 要检测的错误类型,可以检测多种
$restart_cmd 重启 PHP-FPM 的命令
$guide_period 检测周期,单位为秒
$max_error_cnt 在检测周期里面发现多少次错误后重启服务器

没几天就要过年了,祝各位新快乐,万事如意!

— EOF —

为 Nagios 安装性能图插件 PNP4Nagios

PNP4Nagios 是一个用于显示 Nagios 性能图表的插件,基于 RRDTool 日志分析,并以 Kohana(一个 PHP 开发框架)呈现在 Web 端,可以以 Action Url 的形式集成到 Nagios 中。

项目首页:http://www.pnp4nagios.org/

Nagios 的安装可参照此文:《Nagios 3.2 安装记录》

下载 PNP4Nagios:

wget http://prdownloads.sourceforge.net/sourceforge/pnp4nagios/pnp4nagios-0.6.2.tar.gz

PNP4Nagios 用到了 RRDTool,需要先安装:

USE=svg emerge rrdtool

编译安装 PNP4Nagios:

tar zxf pnp4nagios-0.6.2.tar.gz
cd pnp4nagios-0.6.2
./configure
make all && make install && make install-init && make install-config && make fullinstall

mv /usr/local/pnp4nagios/etc/npcd.cfg-sample /usr/local/pnp4nagios/etc/npcd.cfg

启动 NPCD(Nagios Perfdata C Daemon):

/etc/init.d/npcd start

添加启动服务:

rc-update add npcd default

2010-2-25更新:同步模块不是需要启动 NPCD。

下面使用同步模式配置 PNP4Nagios(模式说明请看:http://docs.pnp4nagios.org/pnp-0.6/modes)。

在 Nagios 配置文件 nagios.cfg 中修改以下配置:

process_performance_data=1
host_perfdata_command=process-host-perfdata
service_perfdata_command=process-service-perfdata

修改 commands.cfg 中 process-host-perfdata 和 process-service-perfdata 命令的定义:

define command {
command_name    process-host-perfdata
command_line    /usr/bin/perl /usr/local/pnp4nagios/libexec/process_perfdata.pl -d HOSTPERFDATA
}

define command {
command_name    process-service-perfdata
command_line    /usr/bin/perl /usr/local/pnp4nagios/libexec/process_perfdata.pl
}

在 /usr/local/nagios/etc/objects/templates.cfg 尾部添加:

define host {
name       host-pnp
action_url http://pnp.local/graph?host=$HOSTNAME$&srv=_HOST_
register   0
}

define service {
name       srv-pnp
action_url http://pnp.local/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
register   0
}

在要使用 PNP4Nagios 显示图表的主机或服务中链接模板,如:

define host{
use                     linux-server, host-pnp
host_name               localhost
alias                   localhost
address                 127.0.0.1
}

define service{
use                             local-service,srv-pnp
host_name                       localhost
service_description             PING
check_command                   check_ping!100.0,20%!500.0,60%
}

修改 /usr/local/pnp4nagios/etc/config.php:

$conf[‘nagios_base’] = http://nagios.local/cgi-bin;

修改 /usr/local/pnp4nagios/share/application/config/config.php:

$config[‘site_domain’] = ‘/’;

新建 Nginx 站点配置:

server {
listen       80;
server_name  pnp.local;

access_log  /work/www/logs/pnp.access.log  main;
error_log  /work/www/logs/pnp.error.log;

location / {
root   /usr/local/pnp4nagios/share;
index  index.html index.htm index.php;
if (!-e $request_filename) {
rewrite ^/(.+)$ /index.php?kohana_uri=$1 last;
break;
}
}

location ~ \.php$ {
root           /usr/local/pnp4nagios/share;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
include        fastcgi_params;
fastcgi_pass   unix:/tmp/php-fpm.sock;
}
}

重启 Nginx,查看:http://pnp.local/,检查 PHP 环境是否检测正常,正常后删除:/usr/local/pnp4nagios/share/install.php。

安装完成!

界面截图

点击主机或服务旁边的小太阳后,即可显示性能分析图表。

若图表中文字显示为方块,说明你的系统中还没有可用字体,安装一下即可:

emerge freefonts

— EOF —

Nagios 3.2 安装记录

工作比较忙,日志不能再像以前那样系统地整理了,简要记录下安装过程。

什么是 Nagios?

Nagios 是一个系统和网络监控程序,它可以监控你指定的主机或服务,并能在主机或服务出现故障时提醒你。

它有以下特性:

  • 网络服务监控(包括 SMTP, POP3, HTTP, NNTP, PING 等)
  • 服务器资源监控(CPU负载, 磁盘使用率等)
  • 可以很容易地定制开发自己需要的服务监测插件
  • 并行的服务监测
  • 支持父主机规则,支持分布式
  • 主机或服务故障时,支持使用邮件、短信等方式提醒管理员
  • 支持故障时的事件定义,可以先行解决一些问题
  • 自动的日志回滚
  • 支持冗余监控主机
  • 可以通过 Web 界面查看当前网络状态、通知和故障日志等信息

Nagios

Nagios 项目首页:http://www.nagios.org/

安装 Nagios 主要是两部分,Nagios Core 和 Nagios Plugins。Nagios Core 只是个 Daemon,负责调度,真正的检测操作还是通过 Nagios Plugins 来实现的。

安装 Nagios Core

* 下载解压

wget http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-3.2.0.tar.gz

tar zxf nagios-3.2.0.tar.gz

cd nagios-3.2.0

* 添加 nagios 用户和组

useradd -m -s /bin/bash nagios

groupadd nagios

usermod -G nagios nagios

因为要用到 CGI 的 Web 监控面板,所以这里我们还要添加一个 nagcmd 组,用于 CGI 执行相关指令。

groupadd nagcmd

usermod -a -G nagcmd nagios

usermod -a -G nagcmd www

* 配置编译安装

./configure –with-command-group=nagcmd –with-htmurl=/ –with-cgiurl=/cgi-bin

make all

make install-init

make install-commandmode

make install-config

* 添加启动服务

rc-update add nagios default

* 启动 Nagios

/etc/init.d/nagios start

安装 Nagios Plugins

wget http://prdownloads.sourceforge.net/sourceforge/nagiosplug/nagios-plugins-1.4.14.tar.gz

tar zxf nagios-plugins-1.4.14.tar.gz
cd nagios-plugins-1.4.14
./configure –with-cgiurl=/cgi-bin
make && make install

配置 Web 监控面板

我是纯 Nginx 族,要托管监控面板的 CGI 当然还是选择用 Nginx。

如何配置 Nginx 支持 CGI 呢?请看我的上一篇:《配置 Nginx 支持 CGI》

新建站点配置文件:

server {
    listen       80;
    server_name  nagios.local;

    access_log  /work/www/logs/nagios.access.log  main;
    error_log  /work/www/logs/nagios.error.log;

    location / {
        root   /usr/local/nagios/share;
        index  index.html index.htm index.php;
    }

    location ~ \.php$ {
        root           /usr/local/nagios/share;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        include        fastcgi_params;
        fastcgi_pass   unix:/tmp/php-fpm.sock;
    }

    location /cgi-bin/images {
        alias /usr/local/nagios/share/images;
    }

    location /cgi-bin/stylesheets {
        alias /usr/local/nagios/share/stylesheets;
    }

    location /cgi-bin {
        alias /usr/local/nagios/sbin;
    }

    location ~ \.cgi$ {
        root           /usr/local/nagios/sbin;
        rewrite ^/cgi-bin/(.*)\.cgi /$1.cgi break;
        fastcgi_index  index.cgi;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        include        nginx_fcgi_params;
        fastcgi_read_timeout    5m;
        fastcgi_pass   unix:/var/run/nginx-fcgi.sock;
    }
}

* 修改配置文件

打开 /usr/local/nagios/etc/cgi.cfg,修改 use_authentication 为:

use_authentication=0

即去除用户验证,然后重启 nagios。

打开 /usr/local/nagios/share/config.inc.php,把:

$cfg[‘cgi_base_url’]=’/nagios/cgi-bin’;

改为(根据自己的实际情况修改):

$cfg[‘cgi_base_url’]=’/cgi-bin’;

* 访问监控面板

http://nagios.local/

搭建完成!

— EOF —

Zabbix 1.8 安装记录

Zabbix 是一个提供 Web 管理界面的开源系统/网络监控服务器。
官方的文档写得非常好,许多内容这里就不介绍了,可以直接看官方文档:
http://www.zabbix.com/documentation/

本文只记录我的 Zabbix 1.8 的安装过程。
以下我要在同一台服务器上安装 Zabbix Server、Zabbix Proxy 和 Zabbix Agent。

安装前先配置好PHP,要求支持 php-gd、php-bcmath、php-xml、php-mysql、php-net-socket、php-mbstring,即 configure 参数中加上 –with-gd –enable-bcmath –enable-xml –with-mysql –enable-sockets –enable-mbstring。

我的配置参数如下:

./configure –prefix=/usr/local/php –with-config-file-path=/usr/local/php/etc –with-mysql=/usr/local/mysql –with-mysqli=/usr/local/mysql/bin/mysql_config –enable-fpm –enable-sockets –enable-pdo –with-pdo-mysql=/usr/local/mysql –with-gd –enable-bcmath –enable-xml –enable-mbstring

下面开始安装 Zabbix:

* 下载并解压:

wget http://prdownloads.sourceforge.net/zabbix/zabbix-1.8.tar.gz?download
tar zxf zabbix-1.8.tar.gz
cd zabbix-1.8

* 创建 zabbix 用户组和用户:

groupadd zabbix
useradd zabbix -g zabbix

* 创建 mysql 数据库:

create database zabbix character set utf8;

* 创建 mysql 用户:

grant all on zabbix.* to zabbix@localhost identified by ‘zabbix’;

* 导入表和数据:

mysql -uroot -p zabbix < create/schema/mysql.sql
mysql -uroot -p zabbix < create/data/data.sql
mysql -uroot -p zabbix < create/data/images_mysql.sql

* 配置编译:

./configure –enable-server –enable-proxy –enable-agent –with-mysql=/usr/local/mysql/bin/mysql_config –with-net-snmp –with-libcurl
make && make install

配置参数说明:

–enable-server 安装 Zabbix Server
–enable-proxy 安装 Zabbix Proxy
–enable-agent 安装 Zabbix Agent
–with-mysql 使用 mysql 做数据库服务器
–with-net-snmp 支持 SNMP
–with-libcurl 支持 curl,用于 web 监控

* 服务端口定义:
编辑 /etc/services,在后面追加:

zabbix-agent 10050/tcp Zabbix Agent
zabbix-agent 10050/udp Zabbix Agent
zabbix-trapper 10051/tcp Zabbix Trapper
zabbix-trapper 10051/udp Zabbix Trapper

* 复制配置文件:

mkdir /etc/zabbix
cp misc/conf/zabbix_server.conf /etc/zabbix/
cp misc/conf/zabbix_proxy.conf /etc/zabbix/
cp misc/conf/zabbix_agent.conf /etc/zabbix/
cp misc/conf/zabbix_agentd.conf /etc/zabbix/

* 修改 zabbix server 配置文件 /etc/zabbix/zabbix_server.conf 中的数据库用户名和密码:

DBUser=zabbix
DBPassword=zabbix

* 安装启动脚本

cp misc/init.d/gentoo/zabbix-server /etc/init.d/
cp misc/init.d/gentoo/zabbix-agentd /etc/init.d/

添加可执行权限:

chmod +x /etc/init.d/zabbix-server
chmod +x /etc/init.d/zabbix-agentd

修改 zabbix-server 头部变量定义:

NAME=zabbix_server
PATH=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/usr/local/sbin/${NAME}
DESC=”Zabbix 1.4″
PID=/var/run/$NAME.pid

修改 zabbix-agentd 头部变量定义:

NAME=zabbix_agentd
PATH=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/usr/local/sbin/${NAME}
DESC=”Zabbix 1.4″
PID=/var/run/$NAME.pid

* 添加到启动服务:

rc-update add zabbix-server default
rc-update add zabbix-agentd default

* 启动 Zabbix Server:

/etc/init.d/zabbix-server start

我启动时提示错误:

zabbix_server: error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory

因为我的 mysql client 库不在系统默认库中,做以下修改后重新启动就可以了:

echo /usr/local/mysql/lib/mysql/ >> /etc/ld.so.conf
ldconfig

* 启动 Zabbix Agentd

/etc/init.d/zabbix-agentd start

* 复制 Web Interface 到 web 目录:

cp -r frontends/php /work/www/zabbix

* 新建 nginx 配置:

server {
listen       80;
server_name  zabbix.local zabbix.hily;

access_log  /work/www/logs/zabbix.local.access.log  main;

location / {
root   /work/www/zabbix;
index  index.html index.htm index.php;
}

location ~ \.php$ {
root           /work/www/zabbix;
fastcgi_index  index.php;
include        fastcgi_params;
}

}

* 开始安装 Zabbix Web Interface
打开 http://zabbix.local/,看到提示:

Timezone for PHP is not set. Please set “date.timezone” option in php.ini.

按照提示,修改 php.ini 中时区设置:

date.timezone = Asia/Shanghai

重启 PHP-FPM:

/etc/init.d/php-fpm restart

监测环境时提示:

再次修改 php.ini:

post_max_size = 16M
max_execution_time = 300
mbstring.func_overload = 2

解决后按提示继续安装即可。

* 结束:
安装完后直接访问:
http://zabbix.local/
默认用户名和密码是:
Admin/zabbix
到此安装完成!

— EOF —