일본 서버에 Node.js 기반 웹 서비스(Express, Fastify, Next.js 등)를 배포하는 방법을 안내합니다. PM2로 프로세스를 안정적으로 관리하고, Nginx를 리버스 프록시로 사용해 80/443 포트로 서비스하는 전체 구성을 다룹니다.
왜 일본 서버에서 Node.js를 운영하나요?
Node.js 기반 API 서버, 실시간 채팅, 스트리밍 서비스를 일본 서버에서 운영하면 한국과 아시아 사용자 모두에게 낮은 레이턴시를 제공할 수 있습니다. 특히 WebSocket을 사용하는 실시간 서비스는 서버와 클라이언트 간의 지연이 사용자 경험에 직접적인 영향을 미치므로, 지리적으로 가까운 일본 서버 선택이 유리합니다.
1단계: Node.js 설치
Ubuntu 22.04 LTS 기준으로 Node.js LTS 버전을 설치합니다.
# NodeSource 저장소 추가 (Node.js 20 LTS)
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt install nodejs -y
# 버전 확인
node --version
npm --version
2단계: PM2 설치 및 앱 실행
PM2는 Node.js 프로세스 매니저로, 앱이 크래시되면 자동으로 재시작하고 서버 재부팅 시에도 자동으로 앱을 시작합니다.
# PM2 전역 설치
npm install -g pm2
# 앱 시작 (예: app.js)
pm2 start app.js --name "my-api"
# 서버 재부팅 시 자동 시작 설정
pm2 startup
pm2 save
PM2 주요 명령어
pm2 list # 실행 중인 프로세스 목록
pm2 logs my-api # 로그 확인
pm2 restart my-api # 재시작
pm2 stop my-api # 중지
pm2 monit # 실시간 모니터링
3단계: Nginx 리버스 프록시 설정
Node.js 앱은 3000번 포트에서 실행되고, Nginx가 80(HTTP)/443(HTTPS) 요청을 받아 내부적으로 전달하는 구조입니다.
apt install nginx -y
Nginx 가상 호스트 파일 생성:
# /etc/nginx/sites-available/my-api
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_bypass $http_upgrade;
}
}
ln -s /etc/nginx/sites-available/my-api /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx
4단계: SSL 인증서 설정 (Let’s Encrypt)
apt install certbot python3-certbot-nginx -y
certbot --nginx -d yourdomain.com
Certbot이 자동으로 Nginx 설정에 SSL을 추가하고 자동 갱신을 설정합니다.
5단계: WebSocket 지원 (실시간 서비스)
WebSocket을 사용하는 서비스(Socket.io 등)는 Nginx에 추가 설정이 필요합니다.
location /socket.io/ {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
6단계: 환경 변수 관리
PM2 ecosystem 파일로 환경 변수를 안전하게 관리합니다:
// ecosystem.config.js
module.exports = {
apps: [{
name: 'my-api',
script: 'app.js',
env: {
NODE_ENV: 'production',
PORT: 3000,
DB_HOST: 'localhost',
}
}]
};
pm2 start ecosystem.config.js
성능 최적화 팁
- 클러스터 모드: PM2의 클러스터 모드로 CPU 코어를 모두 활용
pm2 start app.js -i max - Nginx Gzip 압축: 응답 데이터를 압축해 전송량 절감
- Redis 세션 캐시: 세션 데이터를 Redis에 저장해 DB 부하 감소
마치며
일본 서버에 Node.js + PM2 + Nginx 조합은 안정적이고 성능 좋은 웹 서비스를 위한 검증된 스택입니다. 배포 과정에서 어려움이 있으시면 TCP-80.NET 텔레그램 @tcp80net으로 문의해 주세요.