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

리눅스 서버에 Tomcat WAS 올리기: 설치·보안·systemd·Nginx 연동까지 한 번에

by yamoojin83 2025. 10. 16.

리눅스 서버에 Tomcat WAS 올리기: 설치·보안·systemd·Nginx 연동까지 한 번에

현업에서 톰캣(Tomcat)을 올릴 때 가장 많이 실수하는 부분은 설치만 하고 운영 준비(보안, 서비스 등록, 로그 회전, 프록시 연동)를 빼먹는 것입니다. 이 글은 Ubuntu 24.04 LTS 기준으로 OpenJDK 설치 → Tomcat tar 설치 → 운영자 계정 분리 → systemd 등록 → UFW 방화벽 → Nginx 리버스 프록시(옵션)까지 한 번에 마무리합니다. 명령어는 그대로 복붙해도 동작하도록 정리했습니다.


0) 사전 준비(체크리스트)

  • 루트가 아닌 일반 사용자로 접속(필요 시 sudo 사용)
  • 자바 런타임: OpenJDK 17+ (Tomcat 10.x 권장)
  • WAS 포트: 기본 8080 (프록시 구성 시 127.0.0.1:8080 바인딩)
  • 방화벽: 외부에서 8080 차단, 80/443만 오픈

1) OpenJDK 설치

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

2) 전용 계정과 디렉터리 만들기

톰캣은 별도 계정으로 돌려야 사고 범위를 줄일 수 있습니다.

sudo useradd -r -m -U -d /opt/tomcat -s /bin/false tomcat
# 설치 디렉터리 준비
sudo mkdir -p /opt/tomcat

3) Tomcat 다운로드 & 설치

공식 사이트에서 최신 LTS(예: 10.1.x) tar.gz를 받습니다.

cd /tmp
# 최신 버전은 공식 사이트에서 확인 후 교체
curl -O https://downloads.apache.org/tomcat/tomcat-10/v10.1.25/bin/apache-tomcat-10.1.25.tar.gz
sudo tar -xzf apache-tomcat-10.1.25.tar.gz -C /opt/tomcat --strip-components=1
# 권한 부여
sudo chown -R tomcat:tomcat /opt/tomcat
sudo chmod +x /opt/tomcat/bin/*.sh

4) 운영 모드 하드닝(필수)

  • 관리 앱 제거: 불필요한 관리자 앱은 지웁니다.
    sudo rm -rf /opt/tomcat/webapps/host-manager /opt/tomcat/webapps/manager
    sudo rm -rf /opt/tomcat/webapps/docs /opt/tomcat/webapps/examples
    
  • 접속 바인딩: 프록시(Nginx) 앞단에서만 쓸 거라면 127.0.0.1에 묶어 외부 접근을 막습니다. server.xml의 Connector에 address="127.0.0.1" 추가.
  • AJP 비활성화: 사용하지 않으면 주석 처리(보안 사고 이슈가 잦음).

5) 포트/스레드 등 기본 튜닝

/opt/tomcat/conf/server.xml에서 다음 항목을 확인합니다.

<Connector port="8080" protocol="HTTP/1.1"
           address="127.0.0.1"
           connectionTimeout="20000"
           maxThreads="200"
           redirectPort="8443" />

초기에는 maxThreads 200 정도면 충분합니다. 실제 값은 트래픽/CPU/백엔드 지연을 보면서 조정하세요.

6) systemd 서비스로 등록

부팅 시 자동 시작과 비정상 종료 시 재시작을 위해 systemd 유닛을 만듭니다.

sudo tee /etc/systemd/system/tomcat.service > /dev/null <<'UNIT'
[Unit]
Description=Apache Tomcat
After=network.target

[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
Environment="CATALINA_BASE=/opt/tomcat"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
Environment="JAVA_OPTS=-Xms512m -Xmx512m -XX:+UseG1GC -Djava.security.egd=file:/dev/urandom"
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
SuccessExitStatus=143
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
UNIT
sudo systemctl daemon-reload
sudo systemctl enable --now tomcat
sudo systemctl status tomcat

7) UFW 방화벽(외부 8080 차단, 80/443만 허용)

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)

프록시 앞단에서 HTTPS를 종단하고, WAS는 내부 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

HTTPS는 Certbot으로 무료 SSL을 바로 적용할 수 있습니다.

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

9) 로그 경로와 로그 회전(logrotate)

톰캣 기본 로그는 /opt/tomcat/logs에 쌓입니다. 일일 회전이 필요하면 아래처럼 설정 파일을 추가합니다.

sudo tee /etc/logrotate.d/tomcat > /dev/null <<'LOG'
/opt/tomcat/logs/catalina.out {
  size 50M
  copytruncate
  rotate 5
  compress
  missingok
  notifempty
}
/opt/tomcat/logs/*.log {
  daily
  rotate 14
  compress
  missingok
  notifempty
}
LOG

10) 헬스 체크 & 점검 루틴

  • curl -I http://127.0.0.1:8080/ 로 200 응답 확인
  • journalctl -u tomcat -f 로 부팅/에러 로그 관찰
  • Nginx 접근/에러 로그: /var/log/nginx/access.log, error.log

11) 자주 나는 문제와 해결

  • 8080이 열려 외부에서 바로 접속된다: UFW에서 8080 deny, Nginx만 80/443 허용. 서버 XML에 address="127.0.0.1" 추가.
  • 파일 업로드 413 에러: Nginx에 client_max_body_size 값을 서비스 요구에 맞게 키움.
  • 메모리 부족/GC 지연: JAVA_OPTS에서 -Xms/-Xmx 조정, G1GC 유지. 실제 지표(Micrometer/Prometheus)로 확인하고 올릴 것.
  • 관리 앱 노출: manager/host-manager 반드시 제거 또는 방화벽으로 내부망만 허용.

12) 마무리 체크리스트

  • OpenJDK 17+ 설치 확인
  • tomcat 전용 계정으로 서비스 구동
  • 불필요한 webapps 제거, AJP 비활성화
  • systemd 등록 및 자동 재시작(Restart=on-failure)
  • UFW로 80/443만 오픈, 8080은 내부만
  • Nginx 프록시 및 Certbot HTTPS(옵션)
  • logrotate 구성으로 로그 폭주 방지

여기까지 완료하면 “설치만 된 톰캣”이 아니라 실제 운영 가능한 톰캣 상태가 됩니다. 다음 글에서는 스레드풀·압축·헤더·접속 제한실무 튜닝 체크리스트를 더 깊게 다루겠습니다.