리눅스 서버에 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) 등을 연동해 관찰 가능성을 강화하는 것을 추천합니다.
'서버 인프라 실무' 카테고리의 다른 글
| Ubuntu 24.04 설치 USB 만들기 & 서버 최소 설치 옵션(보안·파티션·네트워크까지) (0) | 2025.10.18 |
|---|---|
| CORS 에러 한 번에 끝내기: Spring Security 6 + 프록시(Nginx) 조합 (0) | 2025.10.17 |
| Tomcat 10 설치+튜닝 체크리스트: 커넥터/스레드풀/압축/보안 헤더 한 번에 정리 (0) | 2025.10.16 |
| 리눅스 서버에 Tomcat WAS 올리기: 설치·보안·systemd·Nginx 연동까지 한 번에 (0) | 2025.10.16 |
| JPA N+1 완전 정복: 자동 감지부터 fetch join·EntityGraph·batch_size 실전 해결 전략 (0) | 2025.10.09 |