AWS Lightsail에서 Ubuntu 서버를 사용하여 Spring Boot 애플리케이션을 운영할 때,
서버가 재부팅되거나 애플리케이션이 비정상 종료되더라도 자동으로 실행되도록 systemd 서비스를 활용하는 방법을 정리해 보겠습니다.
systemd 서비스를 활용하면?
- 서버 재부팅 시 자동 실행
- 프로세스가 비정상 종료되면 자동 재시작
- nohup, screen 없이 백그라운드 실행 가능
- 운영 환경에서 보다 안정적인 애플리케이션 실행 가능
1. Spring Boot 실행용 사용자 계정 생성 (보안 강화)
Ubuntu의 기본 ubuntu
계정 대신 전용 계정(springboot
)을 생성하여 애플리케이션을 실행하면 보안성이 강화됩니다.
1.1 springboot
사용자 생성
# 새로운 사용자 계정 생성 sudo useradd -m -s /bin/bash springboot # sudo 권한 제거 (보안 강화) sudo usermod -L springboot
-m
: 홈 디렉토리 생성 (/home/springboot/
)-s /bin/bash
: 기본 쉘을bash
로 설정usermod -L
:springboot
계정이sudo
사용을 못하게 제한 (보안 강화)
1.2 애플리케이션 배포 디렉토리 생성
sudo mkdir -p /opt/mustard sudo chown -R springboot:springboot /opt/mustard
/opt/mustard/
에 JAR 파일을 배포하고 실행할 예정springboot
계정만 접근 가능하도록 설정
2. systemd
서비스 파일을 사용한 Spring Boot 자동 실행
Lightsail 인스턴스가 재부팅되더라도 Spring Boot 애플리케이션을 자동으로 실행하도록 systemd
서비스를 설정합니다.
systemd
서비스 파일 작성
sudo nano /etc/systemd/system/mustard.service
서비스 설정 파일 (mustard.service
)
[Unit] Description=Mustard Spring Boot Application After=network.target [Service] User=springboot WorkingDirectory=/opt/mustard ExecStart=/usr/bin/java -Duser.timezone=Asia/Seoul -jar /opt/mustard/Mustard-0.0.1-SNAPSHOT.jar SuccessExitStatus=143 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
3. systemd 서비스 파일 상세 설명
3.1 [Unit]
섹션
[Unit] Description=Mustard Spring Boot Application After=network.target
Description=Mustard Spring Boot Application
→ 서비스 설명After=network.target
→ 네트워크가 활성화된 후 서비스 실행- Spring Boot 애플리케이션은 보통 데이터베이스와 연결되므로, 네트워크 활성화 후 실행되도록 설정
3.2 [Service]
섹션
[Service] User=springboot WorkingDirectory=/opt/mustard ExecStart=/usr/bin/java -Duser.timezone=Asia/Seoul -jar /opt/mustard/Mustard-0.0.1-SNAPSHOT.jar SuccessExitStatus=143 Restart=always RestartSec=5
- 실행 계정 (
User=springboot
)- Spring Boot 애플리케이션을 실행할 계정을
springboot
로 지정 (보안 강화) root
로 실행하면 보안 문제가 발생할 수 있음
- Spring Boot 애플리케이션을 실행할 계정을
- 실행 위치 (
WorkingDirectory=/opt/mustard
)/opt/mustard/
에서 JAR 파일을 실행하도록 지정- 애플리케이션이 필요한 파일을
WorkingDirectory
내에서 찾을 수 있음
- 애플리케이션 실행 명령 (
ExecStart
)/usr/bin/java
→ Java 실행 경로-Duser.timezone=Asia/Seoul
→ JVM이 KST 시간대를 사용하도록 설정/opt/mustard/Mustard-0.0.1-SNAPSHOT.jar
→ 실행할 JAR 파일 경로
- 정상 종료 코드 (
SuccessExitStatus=143
)- Spring Boot 애플리케이션이
SIGTERM
(143) 신호를 받으면 정상 종료로 간주 - 기본적으로
systemctl stop
을 실행하면SIGTERM
을 보냄
- Spring Boot 애플리케이션이
- 자동 재시작 (
Restart=always
)Restart=always
→ Spring Boot 애플리케이션이 예기치 않게 종료되면 자동으로 재시작RestartSec=5
→ 5초 후 다시 실행
3.3 [Install]
섹션
[Install] WantedBy=multi-user.target
WantedBy=multi-user.target
→ 서버 부팅 시 자동으로 실행
4. 서비스 등록 및 실행
서비스 파일을 저장한 후 systemd에 등록 및 실행합니다.
# systemd 서비스 설정 반영 sudo systemctl daemon-reload # Spring Boot 애플리케이션 실행 sudo systemctl start mustard # 서버 재부팅 시 자동 실행 설정 sudo systemctl enable mustard
서비스 상태 확인:
sudo systemctl status mustard
이제 서버가 재부팅되어도 Spring Boot 애플리케이션이 자동으로 실행됩니다!
5. Spring Boot 애플리케이션 수동 실행 & 종료
Lightsail에서 직접 애플리케이션을 실행/종료하고 싶다면 아래 명령어를 사용하세요.
5.1 Spring Boot 서비스 수동 실행
sudo systemctl start mustard
5.2 Spring Boot 서비스 안전하게 종료
sudo systemctl stop mustard
또는
kill $(pgrep -f 'Mustard-0.0.1-SNAPSHOT.jar')
5.3 서비스 자동 실행 해제
만약 서버 재부팅 시 자동 실행을 중지하고 싶다면:
sudo systemctl disable mustard