node+redis+express+pm2

최종적으로 PM2를 디렉토리에 포함하여 독립적으로 실행 가능한 Node.js + Redis + Express 환경을 구성하려면 아래 단계를 따릅니다.

최종 디렉토리 구조

project-directory/

├── node/              # Node.js 바이너리

│   ├── bin/           # Node 및 npm 실행 파일

│   └── lib/           # Node.js 기본 라이브러리

├── redis/             # Redis 실행 파일 및 데이터

│   ├── redis-server

│   ├── redis-cli

│   ├── redis.conf

│   └── data/

├── pm2/               # PM2 실행 파일 및 설정

│   └── bin/pm2        # PM2 실행 파일

├── node_modules/      # 설치된 npm 모듈

├── app.js             # Express 서버 코드

├── ecosystem.config.js# PM2 설정 파일

├── package.json       # Node.js 프로젝트 설정

├── .env               # 환경 변수 파일

└── start.sh           # 실행 스크립트

1. PM2를 로컬 디렉토리에 설치

PM2를 프로젝트 디렉토리의 node_modules에 설치하고 로컬 실행할 수 있도록 설정합니다.

1. PM2 설치:

npm install pm2 –save

2. PM2 실행 파일 확인:

ls node_modules/.bin/pm2

2. Node.js와 Redis 설정

(a) Node.js 바이너리 설치

1. Node.js 바이너리를 설치:

curl -O https://nodejs.org/dist/v18.x/node-v18.x.x-linux-x64.tar.xz

mkdir node

tar -xvJf node-v18.x.x-linux-x64.tar.xz –strip-components=1 -C ./node

2. Node.js 바이너리 경로를 $PATH에 추가:

export PATH=$(pwd)/node/bin:$PATH

(b) Redis 바이너리 설정

1. Redis 설치:

curl -O http://download.redis.io/redis-stable.tar.gz

tar -xvzf redis-stable.tar.gz

cd redis-stable

make

mkdir ../redis

cp src/redis-server src/redis-cli ../redis/

2. Redis 설정 파일 생성(redis/redis.conf):

bind 127.0.0.1

port 6379

dir ./data

dbfilename dump.rdb

3. PM2 설정 파일 작성

ecosystem.config.js 파일을 생성하여 Node.js와 Redis를 PM2로 관리할 수 있도록 설정합니다.

module.exports = {

  apps: [

    {

      name: ‘ExpressApp’,

      script: ‘./app.js’,

      env: {

        NODE_ENV: ‘production’,

        PORT: 3000,

        REDIS_HOST: ‘127.0.0.1’,

        REDIS_PORT: 6379,

      },

    },

    {

      name: ‘RedisServer’,

      script: ‘./redis/redis-server’,

      args: ‘./redis/redis.conf’,

    },

  ],

};

4. 실행 스크립트 작성

start.sh 파일에 Redis, Node.js, 그리고 PM2를 사용하여 프로젝트를 시작하는 스크립트를 작성합니다.

#!/bin/bash

# 환경 변수 설정

export PATH=$(pwd)/node/bin:$PATH

# PM2 실행

echo “Starting PM2 with ecosystem.config.js…”

node_modules/.bin/pm2 start ecosystem.config.js

# PM2 상태 확인

node_modules/.bin/pm2 status

스크립트 실행 권한 추가:

chmod +x start.sh

5. Express 서버 코드 (app.js)

Express 서버 코드를 작성하여 Redis와 통신합니다.

require(‘dotenv’).config();

const express = require(‘express’);

const redis = require(‘redis’);

const app = express();

const port = process.env.PORT || 3000;

// Redis 클라이언트 설정

const redisClient = redis.createClient({

  socket: {

    host: process.env.REDIS_HOST || ‘127.0.0.1’,

    port: process.env.REDIS_PORT || 6379,

  },

});

redisClient.on(‘connect’, () => {

  console.log(‘Connected to Redis’);

});

redisClient.on(‘error’, (err) => {

  console.error(‘Redis connection error:’, err);

});

redisClient.connect();

app.get(‘/’, async (req, res) => {

  try {

    await redisClient.set(‘key’, ‘Hello, Redis with PM2!’);

    const value = await redisClient.get(‘key’);

    res.send(`Redis Value: ${value}`);

  } catch (err) {

    res.status(500).send(`Error: ${err.message}`);

  }

});

app.listen(port, () => {

  console.log(`Express server running on http://localhost:${port}`);

});

6. 실행 및 테스트

1. 실행 스크립트 실행:

./start.sh

2. PM2 상태 확인:

node_modules/.bin/pm2 status

3. 애플리케이션 테스트:

http://localhost:3000

7. 추가 고려 사항

1. Redis 데이터 영구 저장:

redis/redis.conf에 appendonly yes를 추가하여 데이터를 영구 저장.

2. 로그 관리:

PM2는 자체 로그 관리를 제공합니다. 로그 확인:

node_modules/.bin/pm2 logs

3. 서버 재시작 시 자동 실행:

PM2를 시스템 서비스로 설정:

node_modules/.bin/pm2 startup

node_modules/.bin/pm2 save

이 구성을 사용하면 Node.js, Redis, 그리고 PM2가 한 디렉토리 안에서 독립적으로 실행됩니다. 추가적인 도움이 필요하면 언제든 말씀해주세요! 😊