일본 서버에 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

성능 최적화 팁

  1. 클러스터 모드: PM2의 클러스터 모드로 CPU 코어를 모두 활용
    pm2 start app.js -i max
    
  2. Nginx Gzip 압축: 응답 데이터를 압축해 전송량 절감
  3. Redis 세션 캐시: 세션 데이터를 Redis에 저장해 DB 부하 감소

마치며

일본 서버에 Node.js + PM2 + Nginx 조합은 안정적이고 성능 좋은 웹 서비스를 위한 검증된 스택입니다. 배포 과정에서 어려움이 있으시면 TCP-80.NET 텔레그램 @tcp80net으로 문의해 주세요.