pm2 포트 모니터링

리눅스/OS 일반|2024. 6. 27. 08:51
반응형

PM2 는 Node.js 애플리케이션의 프로세스를 관리하는 도구로, 애플리케이션의 성능과 상태를 모니터링할 수 있는 기능을 제공합니다. 특히 PM2 의 포트 모니터링 기능은 애플리케이션이 특정 포트에서 잘 동작하고 있는지 확인하는 데 유용합니다.

PM2 를 사용하면 다음과 같은 모니터링 기능을 활용할 수 있습니다.
1. 실시간 모니터링 : 애플리케이션의 CPU 및 메모리 사용량을 실시간으로 확인할 수 있습니다.
2. 다중 프로세스 관리 : 여러 개의 Node.js 애플리케이션을 동시에 관리하고, 각 애플리케이션의 상태를 모니터링합니다.
3. 포트 상태 확인 : 특정 포트에서 실행 중인 애플리케이션이 정상적으로 작동 중인지 확인하고, 필요시 프로세스를 재시작할 수 있습니다.
4. 웹 인터페이스(PM2 Plus) : PM2 Plus와 같은 웹 기반 대시보드를 사용하면 애플리케이션의 상태를 시각적으로 모니터링할 수 있습니다.

 

이러한 기능을 통해 PM2는 서버에서 Node.js 애플리케이션을 안정적으로 운영하고 모니터링하는 데 매우 유용한 도구입니다.
또한, 프로그래밍을 어떻게 하느냐에 따라 내용을 예쁘게 출력 시킬수 있습니다.

저는 로컬의 80, 443 포트가 정상 동작하는지 5초마다 체크하는 내용을 작성하였습니다.

 

1. 설치

모니터링을 하기 위한 패키지 pm2 를 설치합니다.

# apt -y install nodejs npm

 

npm 을 이용해 모니터링 도구 pm2 를 전역으로 설치합니다.

# npm install -g pm2

 

2. 파일 생성

# vi monitor.js

const http = require('http');
const pm2 = require('pm2');

const ports = [80, 443];
const interval = 5000; // 5 seconds

function checkPort(port) {
    return new Promise((resolve, reject) => {
        const options = {
            method: 'HEAD',
            host: 'localhost',
            port: port,
            path: '/',
        };

        const req = http.request(options, (res) => {
            resolve(res.statusCode);
        });

        req.on('error', (err) => {
            reject(err);
        });

        req.end();
    });
}

function startMonitoring() {
    pm2.connect((err) => {
        if (err) {
            console.error('PM2 connect error:', err);
            process.exit(2);
        }

        pm2.list((err, list) => {
            if (err) {
                console.error('PM2 list error:', err);
                process.exit(2);
            }

            const pm_id = list.find(proc => proc.name === 'port-monitor').pm_id;

            setInterval(() => {
                ports.forEach((port) => {
                    checkPort(port)
                        .then((status) => {
                            console.log(`Port ${port} is up. Status code: ${status}`);
                            pm2.sendDataToProcessId({
                                id: pm_id,
                                type: 'process:msg',
                                data: {
                                    port: port,
                                    status: 'up',
                                    statusCode: status
                                },
                                topic: 'status'
                            }, (err, res) => {
                                if (err) console.error(err);
                            });
                        })
                        .catch((err) => {
                            console.error(`Port ${port} is down. Error:`, err);
                            pm2.sendDataToProcessId({
                                id: pm_id,
                                type: 'process:msg',
                                data: {
                                    port: port,
                                    status: 'down',
                                    error: err.message
                                },
                                topic: 'status'
                            }, (err, res) => {
                                if (err) console.error(err);
                            });
                        });
                });
            }, interval);
        });
    });
}

startMonitoring();

 

# vi ecosystem.config.js

module.exports = {
  apps: [
    {
      name: 'port-monitor',
      script: './monitor.js',
      watch: true,
      env: {
        NODE_ENV: 'production'
      }
    }
  ]
};

 

# 모니터링을 시작하고 로그를 확인합니다.

# pm2 start ecosystem.config.js

# pm2 monit

 

프로세스 리스트를 보고, 중지하거나 삭제하는 명령입니다.

# pm2 list

# pm2 stop ecosystem.config.js

# pm2 monitor

 

반응형

댓글()