sourcecode

PHP-FPM이 제대로 실행되고 있는지 확인하는 방법은?

copyscript 2023. 10. 6. 21:55
반응형

PHP-FPM이 제대로 실행되고 있는지 확인하는 방법은?

php fpm 웹사이트의 문서에는 5.3.3 현재 php fpm이 coe php의 일부라고 나와 있습니다.

5.3.10을 실행하고 있는데, 제대로 작동하는지 어떻게 확인할 수 있나요?항구에서 운행하는 서비스인 줄 알았는데요?

Linux를 사용하고 있다고 가정할 때 프로세스 목록을 검색하여 php-fpm이 실행되고 있는지 확인합니다.

ps aux | grep php-fpm

(유닉스 소켓이 아닌) IP를 통해 실행되는 경우 포트를 확인할 수도 있습니다.

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

돌아올 것입니다.

액티브 : 2017-04-09 일요일 12:48:09 PDT 이후 액티브(실행중); 48s 전

php5.6 및 php-fpm이 설치된 amilinux에서 누군가에게 도움이 되는 경우:

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

PHP-FPM은 필요할 때 새로운 PHP 프로세스를 생성하는 서비스로, 보통 nginx와 같은 fast-cgi 모듈을 통해 생성됩니다."sudo /etc/init.d/php-fpm status"와 같이 init.d 스크립트를 확인하는 것만으로 (오차 한계로) 알 수 있습니다.

포트 또는 유닉스 파일 소켓을 사용하는 것은 구성에 달려 있지만 종종 TCP 포트 9000(예: 127.0.0.1:9000)에 불과합니다.

nginx가 올바르게 실행되고 있는지 확인하는 가장 좋은 방법은 nginx를 실행하고 PHP-FPM에 fast-cgi를 전달할 가상 호스트를 설정하고 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

할 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이 있는 WHM은 가끔 응답이 없습니다.PHP-FPM 서비스는 실행 중임을 표시하지만 요청에 응답하지 않습니다.

저희 데이터 센터의 팀에서도 영구적인 솔루션을 찾는 데 도움을 주고 있지만, 지금까지 운이 따르지 않았습니다.

그동안 저는 PHP FPM에서 실행되는 테스트 파일을 열어 동작하는 Node.js 모니터링 시스템을 개발하였습니다.시스템은 서버의 IP 주소와 사이트 호스트 이름을 참조하는 동안 HTTP:// 및 HTTPS:// 호출을 모두 사용하여 네트워크, DNS 또는 기타 관련 오류로 인한 부당한 재시작을 방지합니다.시스템이 유효한 응답을 받지 못할 경우 PHP FPM을 재시작하여 이메일을 보내줍니다.

코드와 방법은 유용하다고 판단되는 사람이 있다면 아래와 같습니다.

서버에 /home/itdint/monitor/ 같은 폴더를 만들고 monitor.js라는 파일을 만들고 init를 만듭니다.그 폴더에 php.서버에서 테스트할 수 있는 도메인에 testFPM.php 파일을 만듭니다.

---Node Process(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 테스트 파일(test FPM.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 stop

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의 각 버전에 대해 상태를 확인한 후 반환 코드를 확인하는 것입니다.반환 코드가 null이 아니면 문제가 발생하여 알림을 보내고 재시작을 시도합니다.

#!/bin/bash

NOTIFY=me@my.address

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

언급URL : https://stackoverflow.com/questions/14915147/how-to-check-if-php-fpm-is-running-properly

반응형