리눅스 서버에 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 구성으로 로그 폭주 방지
여기까지 완료하면 “설치만 된 톰캣”이 아니라 실제 운영 가능한 톰캣 상태가 됩니다. 다음 글에서는 스레드풀·압축·헤더·접속 제한 등 실무 튜닝 체크리스트를 더 깊게 다루겠습니다.
'서버 인프라 실무' 카테고리의 다른 글
| 리눅스 서버에 Resin WAS 올리기: 설치·보안·systemd·Nginx 연동(HTTPS)까지 (0) | 2025.10.17 |
|---|---|
| Tomcat 10 설치+튜닝 체크리스트: 커넥터/스레드풀/압축/보안 헤더 한 번에 정리 (0) | 2025.10.16 |
| JPA N+1 완전 정복: 자동 감지부터 fetch join·EntityGraph·batch_size 실전 해결 전략 (0) | 2025.10.09 |
| Gradle 빌드 캐시/병렬/Configuration Cache로 빌드 50% 줄이기 (0) | 2025.10.08 |
| Tomcat 10 운영자 튜닝 가이드(커넥터·스레드풀·압축·헤더 최적화) (0) | 2025.10.07 |