1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
|
# PM2 자동 시작 설정 가이드
## 📌 개요
EVCP Next.js 애플리케이션을 PM2로 관리하여 서버 재부팅 시에도 자동으로 시작되도록 설정하는 방법입니다.
## 🔧 사전 요구사항
- Node.js 설치 완료
- 애플리케이션 빌드 완료 (`npm run build`)
- 프로덕션 환경
## 📥 1. PM2 설치
PM2를 전역으로 설치합니다:
```bash
npm install -g pm2
```
설치 확인:
```bash
pm2 --version
```
## 🚀 2. 애플리케이션 시작
### ecosystem.config.js 파일을 사용하여 시작
```bash
pm2 start ecosystem.config.js
```
### 개별 명령어로 시작 (선택사항)
```bash
pm2 start npm --name "evcp" -- run start
```
## 🔄 3. 재부팅 시 자동 시작 설정
### Windows 환경
1. PM2 startup 설정:
```bash
pm2 startup
```
2. 출력된 명령어를 **관리자 권한**으로 실행합니다.
(예: PowerShell을 관리자 권한으로 실행 후 출력된 명령어 실행)
3. 현재 실행 중인 프로세스 목록을 저장:
```bash
pm2 save
```
4. 설정 확인:
```bash
pm2 list
```
### Linux/Unix 환경
```bash
# startup 스크립트 생성
pm2 startup
# 출력된 명령어를 sudo로 실행 (예: sudo env PATH=...)
# 현재 프로세스 목록 저장
pm2 save
```
## 📊 4. PM2 주요 명령어
### 상태 관리
```bash
# 프로세스 목록 및 상태 확인
pm2 list
pm2 status
# 특정 앱 상세 정보
pm2 show evcp
# 실시간 모니터링 (CPU, 메모리)
pm2 monit
```
### 로그 확인
```bash
# 전체 로그 확인 (실시간)
pm2 logs evcp
# 에러 로그만 확인
pm2 logs evcp --err
# 최근 N개 라인만 확인
pm2 logs evcp --lines 100
# 로그 파일 위치 확인
pm2 show evcp
# 출력에서 "out log path"와 "error log path" 확인
# Windows: C:\Users\<username>\.pm2\logs\evcp-out.log
# Linux/Mac: ~/.pm2/logs/evcp-out.log
# 로그 파일 직접 확인 (Windows)
cat C:\Users\jh\.pm2\logs\evcp-out.log
```
### 재시작 및 중지
```bash
# 재시작 (무중단 재시작)
pm2 reload evcp
# 재시작 (일반)
pm2 restart evcp
# 중지
pm2 stop evcp
# 삭제 (프로세스 목록에서 제거)
pm2 delete evcp
# 전체 재시작
pm2 restart all
```
### 설정 관리
```bash
# 저장된 프로세스 목록 확인
pm2 save
# 저장된 프로세스 복구
pm2 resurrect
# startup 설정 제거
pm2 unstartup
```
## ⚙️ 5. ecosystem.config.js 설정 설명
```javascript
module.exports = {
apps: [
{
name: 'evcp', // 애플리케이션 이름
script: 'npm', // 실행할 스크립트
args: 'run start', // npm run start
cwd: './', // 작업 디렉토리
instances: 1, // 인스턴스 수 (1 또는 'max')
autorestart: true, // 크래시 시 자동 재시작
watch: false, // 파일 변경 감지 (프로덕션에서는 false)
max_memory_restart: '8G', // 메모리 임계값 초과 시 재시작
env: {
NODE_ENV: 'production', // 환경 변수
NODE_OPTIONS: '--openssl-legacy-provider'
},
// 로그 경로 미지정 시 PM2 기본 경로 사용: ~/.pm2/logs/
log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
merge_logs: true, // 로그 병합
time: true // 로그에 타임스탬프 추가
}
]
};
```
### 로그 파일 관리
**PM2 기본 로그 경로 사용:**
- `error_file`과 `out_file`을 지정하지 않으면 PM2 기본 경로 사용
- Windows: `C:\Users\<username>\.pm2\logs\`
- Linux/Mac: `~/.pm2/logs/`
- 로그 파일명: `evcp-out.log`, `evcp-error.log`
**ecosystem.config.js의 로그 설정:**
- `log_date_format`: 로그의 날짜 형식
- `merge_logs`: 여러 인스턴스의 로그를 하나의 파일로 병합
- `time`: 로그에 타임스탬프 추가
**커스텀 로그 경로 (선택사항):**
```javascript
error_file: './logs/pm2-error.log', // 프로젝트 내 logs 폴더 사용
out_file: './logs/pm2-out.log', // 상대 경로
// 또는
error_file: '/var/log/evcp/error.log', // 절대 경로 (Linux)
```
**⚠️ Windows 환경에서 `~` 심벌 사용 주의:**
- `~/.pm2/logs/` 형식은 Windows에서 제대로 해석되지 않을 수 있음
- 경로를 지정하지 않거나 절대 경로 사용 권장
**pm2-logrotate (자동 적용):**
- ecosystem.config.js에 별도 설정 불필요
- 이미 설치되어 있으면 자동으로 모든 로그 파일에 적용
- 로그 파일이 10MB 초과 시 자동으로 로테이션
- 30개의 백업 파일 유지
- `pm2 conf pm2-logrotate` 명령으로 설정 확인 가능
### 메모리 설정 가이드
`max_memory_restart`는 프로세스가 해당 메모리를 **초과**하면 자동으로 재시작하는 임계값입니다.
**중요**: 메모리가 자동으로 늘어나는 것이 아니라, 임계값 초과 시 **재시작**됩니다.
#### 권장 설정 (16GB 시스템 기준)
| 애플리케이션 규모 | 권장 값 | 설명 |
|-----------------|---------|------|
| 소규모 (경량) | `1G` ~ `2G` | 간단한 페이지, 적은 트래픽 |
| 중규모 (일반) | `2G` ~ `4G` | 일반적인 엔터프라이즈 앱 |
| 대규모 (대용량) | `4G` ~ `8G` | 많은 페이지, 높은 트래픽, 많은 동시 사용자 |
**EVCP 현재 설정**: `8G`
- 16GB 시스템에서 8GB 가용 메모리 활용
- Next.js SSR 렌더링 및 대용량 데이터 처리 고려
- 메모리 누수 방지를 위한 안전 장치
- 높은 트래픽 환경에 적합
### 인스턴스 수 설정
```javascript
instances: 1, // 단일 인스턴스
// instances: 2, // 2개 인스턴스
// instances: 'max', // CPU 코어 수만큼
```
## 🔍 6. 트러블슈팅
### 애플리케이션이 시작되지 않는 경우
```bash
# 로그 확인
pm2 logs evcp --lines 50
# 프로세스 삭제 후 재시작
pm2 delete evcp
pm2 start ecosystem.config.js
```
### 재부팅 후 자동 시작되지 않는 경우
```bash
# startup 설정 확인
pm2 startup
# 다시 저장
pm2 save
# Windows: 작업 스케줄러에서 PM2 확인
# Linux: systemd 서비스 확인
systemctl status pm2-<username>
```
### 메모리 문제
```bash
# 현재 메모리 사용량 확인
pm2 list
# 메모리 상세 확인
pm2 show evcp
# 메모리 임계값 조정이 필요한 경우
# ecosystem.config.js에서 max_memory_restart 값 수정 후
pm2 reload ecosystem.config.js
```
### 로그가 너무 큰 경우
**현재 pm2-logrotate 설정 (이미 적용 중)**
```bash
# 현재 설정 확인
pm2 conf pm2-logrotate
# 현재 적용된 설정:
# - max_size: 10M (로그 파일이 10MB 초과 시 로테이션)
# - retain: 30 (30개 백업 파일 보관)
# - compress: false (압축 미사용)
# - rotateInterval: 0 0 * * * (매일 자정 로테이션)
```
**설정 변경이 필요한 경우:**
```bash
# 로그 파일 최대 크기 (기본: 10M)
pm2 set pm2-logrotate:max_size 50M
# 보관할 백업 파일 수 (기본: 30)
pm2 set pm2-logrotate:retain 60
# 로그 압축 활성화 (기본: false)
pm2 set pm2-logrotate:compress true
# 설정 확인
pm2 conf pm2-logrotate
```
**참고**: pm2-logrotate는 ecosystem.config.js와 **독립적**으로 동작합니다.
별도 설정이 없어도 이미 설치되어 있으면 자동으로 모든 PM2 프로세스의 로그에 적용됩니다.
## 📈 7. 모니터링
### PM2 Plus (선택사항)
무료 모니터링 서비스 연결:
```bash
pm2 link <secret_key> <public_key>
```
웹 대시보드: https://app.pm2.io
### 기본 모니터링
```bash
# 실시간 모니터링
pm2 monit
# 주기적 상태 확인
watch -n 1 pm2 list
```
## 🔒 8. 보안 고려사항
1. **로그 파일 권한**: 로그 파일에 민감한 정보가 포함될 수 있으므로 적절한 권한 설정
2. **환경 변수**: 민감한 환경 변수는 `.env` 파일 사용
3. **업데이트**: PM2를 주기적으로 업데이트
```bash
npm update -g pm2
pm2 update
```
## 📚 9. 추가 자료
- [PM2 공식 문서](https://pm2.keymetrics.io/docs/)
- [PM2 Ecosystem File](https://pm2.keymetrics.io/docs/usage/application-declaration/)
- [PM2 Startup](https://pm2.keymetrics.io/docs/usage/startup/)
## 📝 10. 체크리스트
배포 전 확인사항:
- [ ] PM2 전역 설치 완료
- [ ] `npm run build` 빌드 완료
- [ ] `ecosystem.config.js` 설정 확인
- [ ] `pm2 start ecosystem.config.js` 실행
- [ ] `pm2 startup` 및 `pm2 save` 완료
- [ ] 재부팅 테스트 완료
- [ ] 로그 확인 (`pm2 logs evcp`)
- [ ] 모니터링 설정 (`pm2 monit`)
---
**마지막 업데이트**: 2025-11-02
**관리자**: EVCP 개발팀
|