최종적으로 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가 한 디렉토리 안에서 독립적으로 실행됩니다. 추가적인 도움이 필요하면 언제든 말씀해주세요! 😊