php-fpm 可以配置一个 pm.status_path ,如 /status
,然后通过 web server 访问这个地址来获取运行状态。但这样会侵入 web server 的配置,在一个 web server 后端有多个 php-fpm 的适合也不方便分别监控每一个后端的状态,为了安全,还要配置访问控制。
好在有个现成的工具 cgi-fcgi,可以把 fcgi 请求包装成 cgi 方式,这样就可以直接在命令行中调用 fastcgi。
cgi-fcgi 在 redhat/centos 中可以用 yum install fcgi
安装,在 ubuntu 中可以用 apt-get install libfcgi-dev
安装。
用以下方式就能获取 php-fpm 的状态了。
path=/status export REQUEST_METHOD=GET export SCRIPT_NAME="$path" export SCRIPT_FILENAME="$path" export QUERY_STRING='' # export QUERY_STRING='full' # export QUERY_STRING='json' # export QUERY_STRING='full&xml' addr=/var/run/php-fpm.socket # addr=127.0.0.1:9000 cgi-fcgi -bind -connect "$addr"
QUERY_STRING 设置为 full 会显示每一个 worker 进程的状态。添加 json、xml、html 可以以不同格式显示结果。
下面是单行脚本的写法和运行结果:
# env REQUEST_METHOD=GET SCRIPT_NAME=/status SCRIPT_FILENAME=/status QUERY_STRING='' cgi-fcgi -bind -connect /var/run/php-fpm.socket Expires: Thu, 01 Jan 1970 00:00:00 GMT Cache-Control: no-cache, no-store, must-revalidate, max-age=0 Content-type: text/plain;charset=UTF-8 pool: www process manager: dynamic start time: 15/Jan/2016:10:48:15 +0800 start since: 4604 accepted conn: 693119 listen queue: 0 max listen queue: 0 listen queue len: 0 idle processes: 157 active processes: 3 total processes: 160 max active processes: 50 max children reached: 0 slow requests: 17