php fpm 网站上的文档说,从 5.3.3 开始,php fpm 是 coe php 的一部分
我运行的是 5.3.10,如何检查它是否正常工作?我以为这是一个在端口上运行的服务?
假设您使用的是 Linux,通过搜索进程列表来检查 php-fpm 是否正在运行:
ps aux | grep php-fpm
如果通过 IP 运行(而不是通过 Unix 套接字),那么您还可以检查端口:
netstat -an | grep :9000
或使用 nmap:
nmap localhost -p 9000
最后,我读到您可以请求状态,但根据我的经验,这被证明是不可靠的:
/etc/init.d/php5-fpm status
对于 php7.0-fpm 我调用:
service php7.0-fpm status
php7.0-fpm启动/运行,进程25993
现在看好的部分。进程名称实际上是php-fpm7.0
echo `/bin/pidof php-fpm7.0`
26334 26297 26286 26285 26282
以下是如何使用 php-fpm 7 上的套接字来完成此操作
install socat
apt-get install socat
#!/bin/sh
if echo /dev/null | socat UNIX:/var/run/php/php7.0-fpm.sock - ; then
echo "$home/run/php-fpm.sock connect OK"
else
echo "$home/run/php-fpm.sock connect ERROR"
fi
您还可以这样检查服务是否正在运行。
service php7.0-fpm status | grep running
它会回来的
Active:自周日 2017-04-09 12:48:09 PDT 起处于活动状态(运行); 48 秒前
如果它对在 amilinux 上安装了 php5.6 和 php-fpm 的人有帮助,它是:
sudo /etc/init.d/php-fpm-5.6 status
PHP-FPM 是一种在需要时生成新 PHP 进程的服务,通常通过 nginx 等 fast-cgi 模块。您可以通过检查 init.d 脚本来判断(有一定的误差),例如“sudo /etc/init.d/php-fpm 状态”
使用什么端口或unix文件套接字取决于配置,但通常只是TCP端口9000。即127.0.0.1:9000
判断其是否正确运行的最佳方法是运行 nginx,并设置一个将 fast-cgi 传递给 PHP-FPM 的虚拟主机,然后使用 wget 或浏览器检查它。
自动重启php-fpm的bash脚本:
#!/bin/bash
is_running=`service php7.4-fpm status | grep running`
if [[ ! $is_running ]]
then
echo 'php7.4-fpm is running'
else
echo 'php7.4-fpm is not running';
fi
每 5 分钟检查一次的 Cron 配置(
/root/check_php7.4_status.sh
- bash 脚本的路径):
*/5 * * * * /root/check_php7.4_status.sh 2>&1 >> '/root/check_php7.4_status.log'
我在运行 cPanel 和 WHM 的 Centos 7 服务器上苦苦挣扎了一段时间,PHP-FPM 有时变得无响应。 PHP-FPM服务显示正在运行,但不响应请求。
我的数据中心的团队也在尝试帮助我找到永久解决方案,但到目前为止我们还没有任何运气。
在此期间,我开发了一个 Node.js 监控系统,该系统通过打开在 PHP FPM 上运行的测试文件来运行。系统使用 HTTP:// 和 HTTPS:// 调用,同时引用服务器的 IP 地址和站点主机名,以防止因网络、DNS 或其他相关错误而导致的任何不必要的重新启动。如果系统没有收到有效响应,它会重新启动 PHP FPM 并向我发送一封电子邮件。
代码和方法如下,如果有人觉得有用的话。
在您的服务器上创建一个文件夹,例如/home/itdint/monitor/ 并在该文件夹中创建一个名为 monitor.js 和 init.php 的文件。在可以在服务器上测试的域上创建 testFPM.php 文件。
---节点进程(monitor.js),您需要安装的唯一模块是 axios(例如 npm install axios)
const axios = require('axios');
const { execSync } = require('child_process');
const failureEmail = "[your email address]";
const serverIP = "[server ip]"; //e.g. 8.8.8.8
const testDomain = "[your domain name]"; //e.g. example.com
const testFile = "testFPM.php";
const restartFPMCommand = "/scripts/restartsrv_apache_php_fpm";
const failedEmailCommand = 'mail -s \"FPM Restarted\" '+failureEmail+' < /dev/null';
function date(str,timestamp){
var ret = "";
if(!timestamp){
var timestamp = Math.floor(new Date().getTime() / 1000);
timestamp = timestamp;
}
else{
timestamp = parseInt(timestamp);
}
var d = new Date(timestamp*1000);
if(!str){var str = "Y-m-d H:i:s";}
str = str.split("");
var strc = str.length;
for(var a=0;a<strc;a++){
switch(str[a]) {
case "d":
var m = d.getDate()+""; if(m.length < 2){m = "0"+m;}
ret = ret + m;
break;
case "j":
var m = d.getDate()+"";
ret = ret + m;
break;
case "D":
var m = d.getDay();
if(m == 0){m = "Sun";}
if(m == 1){m = "Mon";}
if(m == 2){m = "Tue";}
if(m == 3){m = "Wed";}
if(m == 4){m = "Thu";}
if(m == 5){m = "Fri";}
if(m == 6){m = "Sat";}
ret = ret + m;
break;
case "N":
var m = d.getDay();
if(m == 0){m = 7;}
ret = ret + m + "";
break;
case "w":
var m = d.getDay();
ret = ret + m + "";
break;
case "z":
var start = new Date(d.getFullYear(), 0, 0);
var diff = d - start;
var daytime = 1000 * 60 * 60 * 24;
var m = Math.floor(diff / daytime) - 1;
ret = ret + m + "";
break;
case "S":
var m = d.getDate();
if(m == 1 || m == 21 || m == 31){m = "st";}
if(m == 2 || m == 22){m = "nd";}
if(m == 3 || m == 23){m = "rd";}
if((m > 3 && m < 21) || (m > 23 && m < 31)){m = "th";}
ret = ret + m;
break;
case "l":
var m = d.getDay();
if(m == 0){m = "Sunday";}
if(m == 1){m = "Monday";}
if(m == 2){m = "Tuesday";}
if(m == 3){m = "Wednesday";}
if(m == 4){m = "Thursday";}
if(m == 5){m = "Friday";}
if(m == 6){m = "Saturday";}
ret = ret + m;
break;
case "W":
var dd = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));
dd.setUTCDate(dd.getUTCDate() + 4 - (dd.getUTCDay()||7));
var year_start = new Date(Date.UTC(dd.getUTCFullYear(),0,1));
var week_no = Math.ceil((((dd-year_start)/86400000)+1)/7);
var m = week_no + "";
ret = ret + m;
break;
case "F":
var m = (d.getMonth()+1);
if(m == 1){m = "January";}
if(m == 2){m = "February";}
if(m == 3){m = "March";}
if(m == 4){m = "April";}
if(m == 5){m = "May";}
if(m == 6){m = "June";}
if(m == 7){m = "July";}
if(m == 8){m = "August";}
if(m == 9){m = "September";}
if(m == 10){m = "October";}
if(m == 11){m = "November";}
if(m == 12){m = "December";}
ret = ret + m;
break;
case "m":
var m = (d.getMonth()+1)+""; if(m.length < 2){m = "0"+m;}
ret = ret + m;
break;
case "M":
var m = (d.getMonth()+1);
if(m == 1){m = "Jan";}
if(m == 2){m = "Feb";}
if(m == 3){m = "Mar";}
if(m == 4){m = "Apr";}
if(m == 5){m = "May";}
if(m == 6){m = "Jun";}
if(m == 7){m = "Jul";}
if(m == 8){m = "Aug";}
if(m == 9){m = "Sep";}
if(m == 10){m = "Oct";}
if(m == 11){m = "Nov";}
if(m == 12){m = "Dec";}
ret = ret + m;
break;
case "n":
var m = (d.getMonth()+1)+"";
ret = ret + m;
break;
case "t":
var m = new Date(d.getFullYear(), d.getMonth()+1, 0);
m = m.getDate();
ret = ret + m + "";
break;
case "L":
var m = new Date(d.getFullYear(), 1, 0);
m = m.getDate();
if(m == 29){m = "1";}
else{m = "0";}
ret = ret + m + "";
break;
case "o":
ret = ret + d.getFullYear()+"";
break;
case "Y":
ret = ret + d.getFullYear()+"";
break;
case "y":
var m = d.getFullYear()+"";
m = m.substr((m.length-2),2);
ret = ret + m + "";
break;
case "a":
var m = d.getHours();
if(m < 12){m = "am"}
else{m = "pm"};
ret = ret + m + "";
break;
case "A":
var m = d.getHours();
if(m < 12){m = "AM"}
else{m = "PM"};
ret = ret + m + "";
break;
case "B":
var m = Math.floor((((d.getUTCHours() + 1) % 24) + d.getUTCMinutes() / 60 + d.getUTCSeconds() / 3600) * 1000 / 24);
ret = ret + m + "";
break;
case "g":
var m = d.getHours();
if(m > 12){m = m - 12;}
ret = ret + m + "";
break;
case "G":
var m = d.getHours();
ret = ret + m + "";
break;
case "h":
var m = d.getHours();
if(m > 12){m = m - 12;}
m = m + ""; if(m.length < 2){m = "0"+m;}
ret = ret + m + "";
break;
case "H":
var m = d.getHours();
m = m + ""; if(m.length < 2){m = "0"+m;}
ret = ret + m + "";
break;
case "i":
var m = d.getMinutes();
m = m + ""; if(m.length < 2){m = "0"+m;}
ret = ret + m + "";
break;
case "s":
var m = d.getSeconds();
m = m + ""; if(m.length < 2){m = "0"+m;}
ret = ret + m + "";
break;
default:
ret = ret + str[a] + "";
}
}
return ret;
}
function log(message){
console.log(date("Y-m-d H:i:s") + " - "+message)
}
var checking = false;
async function checkStatus(host,type){
const startTime = Date.now();
var r = "";
try {
const res = await axios.get(type+serverIP+'/'+testFile, {
timeout: 4000,
headers: {
'Host': host,
// other headers
}
})
const endTime = Date.now();
const elapsedTime = endTime - startTime;
if (res.status >= 200 && res.status < 306) {
if(res.data == "fpm-fcgi"){
r = 'UP in '+elapsedTime+" => "+res.data;
}
else{
r = 'DOWN ' + res.status + " in "+elapsedTime+" => "+res.data;
}
} else {
r = 'DOWN ' + res.status + " in "+elapsedTime;
}
} catch (err) {
r = 'DOWN ' + err.message;
}
return r;
}
async function checkAStatus(){
if(!checking){
checking = true;
var httpStatus = await checkStatus(testDomain,"http://");
var httpsStatus = await checkStatus(testDomain,"https://");
if(httpStatus.substring(0,4) == "DOWN" || httpsStatus.substring(0,4) == "DOWN"){
log("Restarting FPM...");
try {
const output = execSync(restartFPMCommand);
console.log(output.toString());
} catch (error) {
console.error(`execSync error: ${error}`);
}
try {
execSync(failedEmailCommand);
} catch (error) {
console.error(`execSync error: ${error}`);
}
}
log("HTTP: "+httpStatus+" | HTTPS: "+httpsStatus);
checking = false;
}
else{
log("Already checking.");
}
}
// Check the website status every 10 seconds
setInterval(checkAStatus, 10000);
--PHP 测试文件(testFPM.php)
<?php
$sapiType = php_sapi_name();
echo $sapiType;
?>
--PHP INIT 脚本(init.php),可用于通过 cron 启动/停止/重新启动和检查监控进程。该脚本还将监控日志输出到同一文件夹中的 log.log 中,并且可以按如下方式使用。
php /home/itdint/monitor/init.php 检查
php /home/itdint/monitor/init.php 停止
php /home/itdint/monitor/init.php 启动
php /home/itdint/monitor/init.php 重新启动
查看日志文件:tail -f /home/itdint/monitor/log.log
#!/usr/bin/php -q
<?
$command = $argv[1];
global $node_process;
global $pid_file;
global $log_file;
global $log_levels;
global $first_log;
$log_levels = array();
$log_levels["error"] = true;
$log_levels["info"] = false;
$log_levels["general"] = true;
$node_process = "node ".__DIR__."/monitor.js";
$pid_file = __DIR__."/pid";
$log_file = __DIR__."/log";
$first_log = true;
function write_log($data,$type="info",$add=false,$nodate=false){
global $log_file;
global $log_levels;
global $first_log;
if($log_levels[$type]){
$date_string = "";
$color = "\x1b[2m";
if($type == "general"){$color = "\x1b[36m";}
if($type == "error"){$color = "\x1b[31m";}
if(!$nodate){
$date = "INIT - ".date("D M d Y H:i:s \G\M\TO (T) ");
}
else{
$date = "";
}
$string = "";
if(!$add && !$first_log){$string .= "\n";}
$string .= $color;
if(!$add){$string .= $date;}
$string .= $data;
$string .= "\x1b[0m";
if($add){
$string .= "\n";
}
file_put_contents($log_file.".log",$string,FILE_APPEND);
$first_log = false;
}
}
function pid(){
return "test";
}
function is_running(){
global $node_process;
write_log("Checking if process is running.");
$pid = pid();
if($pid != ""){
exec("ps aux | grep node",$output,$result);
$outputc = count($output);
$found = false;
for($a=0;$a<$outputc;$a++){
write_log($output[$a]);
if(strpos($output[$a],$node_process) !== false){
$found = true;
}
}
if($found){
return true;
}
else{
return false;
}
}
else{
return false;
}
}
function start(){
global $node_process;
global $client_user;
if(!is_running()){
write_log("Starting Node Process:");
exec("nohup ".$node_process." >> ".__DIR__."/log".".log 2>&1 &");
write_log("-----------------------------------------------------------------------------------","general",false,true);
write_log("Starting Node Server... ","general");
sleep(1);
if(is_running()){
write_log("[OK]","general",true);
}
else{
write_log("[FAILED]","error",true);
}
}
else{
write_log("Process already running");
}
}
function stop(){
global $node_process;
if(!is_running()){
write_log("Process not running.");
}
else{
write_log("Stopping process...","general");
$pid = "";
$nout = array();
$output = array();
$result = array();
exec("ps aux | grep '".$node_process."'",$output,$result);
$outputc = count($output);
$found = false;
for($a=0;$a<$outputc;$a++){
if(strpos($output[$a],$node_process) !== false && strpos($output[$a],"grep") === false){
/*write_log($output[$a],"general",true);*/
$found = true;
$out = explode(" ",$output[$a]);
$outc = count($out);
for($a=0;$a<$outc;$a++){
if(trim($out[$a]) != ""){
$nout[] = $out[$a];
}
}
}
}
if($found){
$pid = $nout[1];
write_log("Killing process ".$pid."... ","general");
exec("kill ".$pid);
if(!is_running()){
write_log("[OK]","general",true);
}
else{
write_log("[FAILED]","error",true);
}
}
else{
write_log("[PROCESS NOT FOUND][FAILED]","error",true);
}
}
}
function restart(){
stop();
start();
}
function check(){
write_log("Checking if running... ","general");
if(is_running()){
write_log("Process is running [OK]","general",true);
}
else{
write_log("Process is not running [FAILED]","error",true);
restart();
}
}
if($command == ""){$command = "check";}
write_log("Command: ".$command);
if($command == "start"){
start();
}
if($command == "stop"){
stop();
}
if($command == "restart"){
restart();
}
if($command == "check"){
check();
}
?>
这是我编写的一个简单但我认为很漂亮的脚本,它可以从 CRON 运行,并将检查服务器上安装的所有版本的 php-fpm 是否正在运行。这是为 Ubuntu 22.04 编写的,所以 YMMV。 (此信息部分来自此页面上的信息,但奇怪的是没有人采取额外的步骤来使用运行“php-fpm status”时返回的状态
这个想法是对 /etc/init.d 中找到的每个 php-fpm 版本进行状态检查,然后检查返回代码。如果返回代码不为空,则表示出现问题,我们会发出通知并尝试重新启动。
#!/bin/bash
[email protected]
for each in /etc/init.d/php*fpm
do
$each status > /dev/null
if [ $? -ne 0 ]
then
logger "$each was not running on $( hostname ) "
mail -s "$each was not running on $( hostname ) " $NOTIFY < /dev/null
$each restart
fi
done
检查连接
Debian
apt-get install libfcgi0ldbl
阿尔卑斯山
apl add fcgi
并运行命令
cgi-fcgi -bind -connect localhost:9000 >/dev/null 2>&1 || echo 'Error'
这对于检查 docker 容器的运行状况很有用。
HEALTHCHECK CMD "cgi-fcgi -bind -connect localhost:9000 >/dev/null 2>&1 || exit 1"
或者检查其他服务的连接。
cgi-fcgi -bind -connect ${host}:${PORT} >/dev/null 2>&1 || echo 'Error'
运行特定脚本
SCRIPT_FILENAME=/mnt/data/php/www/phpinfo/test.php \
REQUEST_METHOD=GET \
cgi-fcgi -bind -connect ${host}:${PORT} || \
echo 'Error'