React 앱을 개발한 후 배포를 위해 클라우드 서버에서 빌드를 진행해야 합니다. 이 때 로컬 개발 환경에서는 빌드가 잘 되는데 클라우드 서버에서 다음과 같은 React 빌드 오류가 발생하는 경우가 있습니다.
Creating an optimized production build...
/var/www/web/node_modules/react-scripts/scripts/build.js:19
throw err;
^
RpcIpcMessagePortClosedError: Process 33108 exited [SIGKILL].
at /var/www/web/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/RpcIpcMessagePort.js:19:23
at Generator.next (<anonymous>)
at /var/www/web/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/RpcIpcMessagePort.js:8:71
at new Promise (<anonymous>)
at __awaiter (/var/www/web/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/RpcIpcMessagePort.js:4:12)
at ChildProcess.handleExit (/var/www/web/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/RpcIpcMessagePort.js:18:42)
at ChildProcess.emit (node:events:518:28)
at ChildProcess._handle.onexit (node:internal/child_process:293:12) {
code: null,
signal: 'SIGKILL'
}
이 오류 메시지의 핵심은 SIGKILL 신호입니다. SIGKILL은 시스템이 프로세스를 강제로 종료할 때 발생하는 신호로, 다양한 원인이 있지만 위 상황에서는 주로 리소스 부족으로 인해 발생합니다. 클라우드 환경은 로컬 개발 환경에 비해 제한된 리소스를 사용하는데 이로 인하여 발생하는 경우가 많습니다.
React 빌드 오류 원인 분석
오류 메시지에서 fork-ts-checker-webpack-plugin/.../RpcIpcMessagePort.js:19:23
부분에 에러가 발생한 것을 볼 수 있습니다. 이러한 이유 때문에 fork-ts-checker-webpack-plugin
문제로 보고 설치 버전을 변경하거나 설정을 수정하는 경우가 많습니다. 하지만 실제로 해당 코드에서 문제가 발생하는 것이 아니라 프로세스가 비정상 종료되어 발생하는 문제입니다.
해당 위치의 코드는 아래와 같은데 프로세스가 종료될 때 실행되며, 오류를 처리하고 있는 코드입니다.
const handleExit = (code, signal) => __awaiter(this, void 0, void 0, function* () {
closedError = new RpcIpcMessagePortClosedError_1.RpcIpcMessagePortClosedError(code
? `Process ${process.pid} exited with code "${code}" [${signal}]`
: `Process ${process.pid} exited [${signal}].`, code, signal);
errorListeners.forEach((listener) => {
if (closedError) {
listener(closedError);
}
});
yield port.close();
});
해결 방법
이 문제를 해결하기 위해 다음과 같은 방법을 고려해볼 수 있습니다.
- 서버 메모리 증가: 클라우드 서버의 메모리가 부족해서 빌드 프로세스가 종료되었을 가능성이 큽니다. 따라서 서버의 메모리를 늘려서 빌드하는 것이 가장 직관적인 해결책입니다
- Docker 리소스 설정: Docker 환경에서 빌드를 진행 중이라면, Docker에 할당된 메모리와 CPU 자원을 충분히 확보해야 합니다. Docker의 기본 리소스 설정이 낮게 설정되어 있을 경우, 빌드 도중 메모리 부족으로 프로세스가 종료될 수 있습니다.
- 스왑 메모리 설정: 클라우드 서버에서 물리 메모리가 부족할 경우 스왑 메모리를 설정하여 메모리 부족 문제를 완화할 수 있습니다. 다만 스왑은 성능이 떨어질 수 있으므로 가능한 한 물리 메모리를 확보하는 것이 좋습니다.
결론
이 오류는 클라우드 서버의 리소스가 부족할 때 발생하는 경우가 많습니다. 문제 해결을 위해서는 서버의 메모리를 늘리거나, Docker 리소스를 조정하는 등의 방법을 통해 해결할 수 있습니다. 로컬 환경에서는 잘 동작하지만 클라우드 환경에서 문제가 발생한다면, 리소스 제한이 원인일 가능성을 항상 염두에 두어야 합니다.