본문 바로가기
서버 인프라 실무

리눅스 서버에 Resin WAS 올리기: 설치·보안·systemd·Nginx 연동(HTTPS)까지

by yamoojin83 2025. 10. 17.

리눅스 서버에 Resin WAS 올리기: 설치·보안·systemd·Nginx 연동(HTTPS)까지

Resin(레진, Caucho Resin)은 가볍고 빠른 Java 애플리케이션 서버(WAS)로 유명합니다. 이 문서는 Ubuntu 24.04 LTS 환경에서 OpenJDK 설치 → Resin tar 설치 → 보안 하드닝 → systemd 서비스 등록 → UFW 방화벽 → Nginx 리버스 프록시(HTTPS)까지 운영 관점으로 한 번에 구축하는 가이드입니다. 명령은 그대로 복붙해도 동작하도록 정리했습니다.


0) 사전 체크리스트

  • SSH 일반 사용자 접속(필요 시 sudo 사용)
  • Java: OpenJDK 17+ (프로젝트 요구 버전에 맞춰 선택)
  • Resin 포트: 기본 HTTP 8080 (프록시 앞단을 쓴다면 127.0.0.1 바인딩 권장)
  • 방화벽: 외부에서 8080 차단, 80/443만 오픈

1) OpenJDK 설치

sudo apt update
sudo apt install -y openjdk-17-jdk
java -version   # openjdk version "17..." 출력 확인

2) resin 사용자/디렉터리 준비

WAS는 전용 계정으로 분리해 운영하는 것이 안전합니다.

sudo useradd -r -m -U -d /opt/resin -s /bin/false resin
sudo mkdir -p /opt/resin

3) Resin 다운로드 및 설치

Caucho 공식 사이트에서 최신 안정판의 tar.gz URL을 확인해 내려받습니다. (아래 버전은 예시)

cd /tmp
curl -LO https://caucho.com/download/resin-4.0.70.tar.gz
sudo tar -xzf resin-4.0.70.tar.gz -C /opt/resin --strip-components=1
sudo chown -R resin:resin /opt/resin
sudo chmod +x /opt/resin/bin/*

4) 기본 구조 이해

  • /opt/resin/conf/ : 설정 파일(핵심: resin.xml)
  • /opt/resin/webapps/ : 기본 배포 디렉터리(전통 WAR 방식)
  • /opt/resin/log/ : jvm.log, access.log, stdout.log

5) 운영 하드닝(필수)

/opt/resin/conf/resin.xml을 열어 다음 사항을 반영합니다.

5-1) HTTP 포트/바인딩

<cluster id="app">
  <server id="app-0" address="127.0.0.1" port="6800"/>  <!-- 내부 관리포트 -->

  <http id="app-http" port="8080" address="127.0.0.1"/>
  <web-app id="/" root-directory="/opt/resin/webapps/ROOT"/>
</cluster>
  • address="127.0.0.1"로 두면 외부에서 8080 직접 접근을 차단할 수 있습니다(Nginx만 80/443 개방).

5-2) 스레드·Keep-Alive·헤더 한도

<http id="app-http" port="8080" address="127.0.0.1"
      keepalive-max="200" keepalive-timeout="15000"
      request-timeout="30000"
      header-size="16384" />
  • keepalive-timeout을 너무 길게 두면 FD가 고갈될 수 있습니다(10~20초 권장).
  • header-size는 인증/쿠키가 큰 서비스면 16KB 정도로 상향.

5-3) 압축

<cluster ...>
  <enable-compression>true</enable-compression>
  <compression-min-size>1024</compression-min-size>
  <compression-mime-type>
    text/html,text/plain,text/css,application/json,application/javascript,application/xml
  </compression-mime-type>
</cluster>

프록시(Nginx)에서 gzip을 끝내는 구성도 흔합니다. 이중 압축은 금지!

5-4) WAR 대신 디렉터리 배포(선택)

개발/스테이징에선 ROOT/ 디렉터리를 직접 두고 핫리로드를 사용할 수 있습니다.


6) systemd 서비스 등록

부팅 자동 시작과 장애 복구를 위해 유닛을 만듭니다.

sudo tee /etc/systemd/system/resin.service > /dev/null <<'UNIT'
[Unit]
Description=Resin Application Server
After=network.target

[Service]
Type=forking
User=resin
Group=resin
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
Environment="RESIN_HOME=/opt/resin"
Environment="RESIN_ROOT=/opt/resin"
Environment="JAVA_OPTS=-Xms512m -Xmx512m -XX:+UseG1GC -Djava.security.egd=file:/dev/urandom"
ExecStart=/opt/resin/bin/resin.sh start
ExecStop=/opt/resin/bin/resin.sh stop
SuccessExitStatus=143
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
UNIT

sudo systemctl daemon-reload
sudo systemctl enable --now resin
sudo systemctl status resin

7) UFW 방화벽

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw deny 8080/tcp
sudo ufw enable
sudo ufw status

8) Nginx 리버스 프록시(HTTPS 포함)

도메인으로 접속하면 Nginx가 TLS를 처리하고 내부 127.0.0.1:8080으로 프록시합니다.

sudo apt install -y nginx
sudo tee /etc/nginx/sites-available/myapp.conf > /dev/null <<'NGINX'
server {
  listen 80;
  server_name example.com;

  location / {
    proxy_pass         http://127.0.0.1:8080;
    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_set_header   X-Forwarded-Proto $scheme;
    proxy_http_version 1.1;
    proxy_set_header   Connection "";
    client_max_body_size 20m;
  }
}
NGINX

sudo ln -s /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

무료 SSL(Certbot) 적용:

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com

9) 로그와 로테이션

  • Resin 로그: /opt/resin/log/ (stdout.log, access.log, jvm.log)
  • Nginx 로그: /var/log/nginx/

로그 폭주를 막으려면 logrotate를 설정합니다.

sudo tee /etc/logrotate.d/resin > /dev/null <<'LOG'
/opt/resin/log/*.log {
  daily
  rotate 14
  compress
  missingok
  notifempty
  copytruncate
}
LOG

10) 헬스 체크 & 운영 루틴

  • curl -I http://127.0.0.1:8080/ 로 200 확인
  • journalctl -u resin -f 로 서비스 로그 관찰
  • tail -f /opt/resin/log/access.log 로 응답 시간/코드 확인
  • Nginx 에러 로그도 함께 모니터링

11) 성능/안정화 팁

  • 타임아웃 일관성: Nginx의 proxy_read_timeout/send_timeout과 Resin의 request-timeout/keepalive-timeout을 표로 맞추세요. 불일치하면 499/504가 튑니다.
  • 메모리: -Xms/-Xmx는 같은 값으로 시작(예: 512m). G1GC 유지, 지표 보며 조정.
  • 압축: JSON/HTML에만. 이미 압축 포맷(이미지/zip/pdf)은 제외.
  • 업로드: Nginx client_max_body_size와 앱 단 validation을 함께 사용.
  • 보안 헤더: Nginx 스니펫으로 일괄 적용(예: nosniff, SAMEORIGIN, Referrer-Policy).

12) 자주 겪는 문제와 해결

문제원인해결
외부에서 8080 접속 가능 address 0.0.0.0 바인딩, 방화벽 미설정 resin.xml의 http address="127.0.0.1", UFW로 8080 deny
업로드 413 Nginx 바디 제한 client_max_body_size 상향, 앱 단 크기 검증
간헐 499/504 프록시/백엔드 타임아웃 불일치 Resin request-timeout, keepalive-timeout과 Nginx 값을 재정렬
메모리 부족/GC 지연 JVM 힙 과소/과대 -Xms/-Xmx 조정, 메트릭으로 p95/p99 확인 후 점진 조정

13) 배포 전/후 체크리스트

  • OpenJDK 17+ 설치 및 java -version 확인
  • resin 전용 계정으로 서비스 구동
  • resin.xml에 address="127.0.0.1", 헤더/타임아웃/압축 합리값
  • systemd 등록, Restart=on-failure 동작 확인
  • UFW: 80/443만 허용, 8080 deny
  • Nginx 프록시 + Certbot HTTPS(옵션) 적용
  • logrotate 설정으로 로그 폭주 방지

이대로 구성하면 “설치만 된 Resin”이 아니라 운영 가능한 Resin을 갖추게 됩니다. 다음 단계로는 롤링 배포(blue/green), 접근제어(IP allowlist), 메트릭 수집(Micrometer/Prometheus) 등을 연동해 관찰 가능성을 강화하는 것을 추천합니다.