如何检查PHP-FPM是否正常运行?

问题描述 投票:0回答:9

php fpm 网站上的文档说,从 5.3.3 开始,php fpm 是 coe php 的一部分

我运行的是 5.3.10,如何检查它是否正常工作?我以为这是一个在端口上运行的服务?

php fpm
9个回答
83
投票

假设您使用的是 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

38
投票

对于 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


13
投票

以下是如何使用 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 秒前


6
投票

如果它对在 amilinux 上安装了 php5.6 和 php-fpm 的人有帮助,它是:

sudo /etc/init.d/php-fpm-5.6 status


1
投票

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 或浏览器检查它。


1
投票

自动重启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'

1
投票

我在运行 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();
}
?>

0
投票

这是我编写的一个简单但我认为很漂亮的脚本,它可以从 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

0
投票

检查连接

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'
© www.soinside.com 2019 - 2024. All rights reserved.