AlmaLinux 9 환경에서 Spring Boot JAR 파일을 systemd 서비스로 등록하고 Apache Reverse Proxy와 연동하여 안정적으로 운영하는 방법을 설명합니다. 서비스 자동 시작, 로그 확인, 포트 관리, GitLab CI/CD 배포까지 실무 기준으로 정리했습니다.

AlmaLinux 9에서 Spring Boot 서비스 등록 및 운영하기 (systemd + Apache Reverse Proxy)
Spring Boot 애플리케이션을 운영 서버에 배포할 때 가장 중요한 것은 안정적인 서비스 관리입니다. 단순히 java -jar 명령으로 실행하는 방식은 서버 재부팅 시 자동 실행되지 않고 프로세스 관리도 어렵습니다.
이번 글에서는 AlmaLinux 9 환경에서 Spring Boot 애플리케이션을 systemd 서비스로 등록하고 Apache Reverse Proxy와 연동하여 운영하는 방법을 정리합니다.
이 글을 따라 하면 다음과 같은 구조로 서비스를 운영할 수 있습니다.
사용자 접속
↓
https://example.com
↓
Apache Reverse Proxy
↓
http://localhost:8888
↓
Spring Boot
왜 systemd로 Spring Boot를 운영해야 할까?
실무 환경에서는 다음과 같은 이유로 systemd 서비스를 사용합니다.
| 서버 재부팅 후 자동 실행 | 불가능 | 가능 |
| 서비스 상태 확인 | 어려움 | 가능 |
| 자동 재시작 | 불가능 | 가능 |
| 로그 관리 | 불편 | journalctl 사용 |
| 운영 표준 | 낮음 | 높음 |
특히 운영 서버에서는 장애 발생 시 자동 복구 기능이 매우 중요하기 때문에 systemd 사용이 사실상 표준이라고 볼 수 있습니다.
Spring Boot 서비스 등록
먼저 서비스 파일을 생성합니다.
sudo vi /etc/systemd/system/app.service
아래 내용을 입력합니다.
[Unit]
Description=Spring Boot Application
After=network.target
[Service]
User=deploy
Group=deploy
WorkingDirectory=/home/deploy/app
ExecStart=/usr/bin/java \
-jar /home/deploy/app/application.jar \
--server.port=8888
SuccessExitStatus=143
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
주요 설정 설명
User
User=deploy
실제 Java 프로세스를 실행할 계정입니다.
root 권한으로 실행하지 않고 별도 배포 계정을 사용하는 것이 보안상 안전합니다.
WorkingDirectory
WorkingDirectory=/home/deploy/app
애플리케이션 실행 기준 경로입니다.
로그 파일이나 상대 경로 리소스를 사용할 경우 중요합니다.
ExecStart
ExecStart=/usr/bin/java \
-jar /home/deploy/app/application.jar \
--server.port=8888
Spring Boot JAR 파일을 실행하는 명령입니다.
필요하다면 JVM 옵션도 추가할 수 있습니다.
ExecStart=/usr/bin/java \
-Xms512m \
-Xmx1024m \
-jar /home/deploy/app/application.jar
Restart
Restart=always
RestartSec=5
프로세스가 종료되면 5초 후 자동으로 재시작합니다.
운영 서버에서는 거의 필수 설정입니다.
서비스 적용하기
서비스 파일 작성 후 systemd를 다시 로드합니다.
sudo systemctl daemon-reload
자동 시작 등록
sudo systemctl enable app
서비스 시작
sudo systemctl start app
상태 확인
sudo systemctl status app
서비스 운영 명령어
운영 중 가장 자주 사용하는 명령어입니다.
시작
sudo systemctl start app
중지
sudo systemctl stop app
재시작
sudo systemctl restart app
상태 확인
sudo systemctl status app
Java 프로세스 확인
서비스는 root 권한으로 제어하지만 실제 Java 프로세스는 배포 계정으로 실행됩니다.
ps -ef | grep java
예시
deploy 12345 1 2 08:30 ? \
java -jar application.jar --server.port=8888
실행 계정이 배포 계정으로 표시되면 정상입니다.
로그 확인 방법
systemd를 사용하면 별도 로그 파일을 만들지 않아도 됩니다.
실시간 로그 확인
journalctl -u app -f
최근 로그 100건 조회
journalctl -u app -n 100
배포 후 장애 확인 시 가장 많이 사용하는 명령어입니다.
포트 및 서비스 상태 확인
포트 확인
sudo ss -ntlp | grep 8888
예시
LISTEN 0 511 *:8888 *:*
서버 내부 확인
curl http://localhost:8888
응답이 정상적으로 반환되면 Spring Boot 애플리케이션이 실행 중인 상태입니다.
Apache Reverse Proxy 연동
외부에서는 HTTPS로 접속하고 내부에서는 Spring Boot 포트로 전달합니다.
구조는 다음과 같습니다.
https://example.com
↓
Apache
↓
http://localhost:8888
Apache VirtualHost 예시
<VirtualHost *:443>
ServerName example.com
ProxyPreserveHost On
ProxyPass / http://localhost:8888/
ProxyPassReverse / http://localhost:8888/
</VirtualHost>
필요 모듈 활성화
sudo dnf install mod_proxy mod_proxy_http
설정 적용
sudo systemctl restart httpd
배포 계정에서 서비스 제어하기
일반적으로 systemctl은 root 권한이 필요합니다.
하지만 배포 자동화를 위해 특정 서비스만 제어할 수 있도록 sudo 권한을 부여할 수 있습니다.
sudo visudo
추가
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl start app
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl stop app
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart app
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl status app
deploy ALL=(ALL) NOPASSWD: /usr/bin/journalctl -u app
GitLab CI/CD 자동 배포 구성
Spring Boot 운영 환경에서는 GitLab Runner를 이용한 자동 배포가 일반적입니다.
배포 흐름
Git Push
↓
GitLab Runner
↓
Maven Build
↓
JAR 생성
↓
서버 업로드
↓
systemctl restart
↓
배포 완료
배포 예시
deploy:
stage: deploy
script:
- scp target/application.jar deploy@SERVER:/home/deploy/app/
- ssh deploy@SERVER "sudo systemctl restart app"
운영 시 자주 사용하는 명령어
배포 후 재시작
sudo systemctl restart app
서비스 상태 확인
sudo systemctl status app
실시간 로그
sudo journalctl -u app -f
포트 확인
sudo ss -ntlp | grep 8888
프로세스 확인
ps -ef | grep java
최종 운영 구조
root
└─ systemd(app.service)
└─ deploy
└─ java -jar application.jar
└─ port 8888
Apache HTTPS
↓
https://example.com
↓
localhost:8888
↓
Spring Boot
Apache Reverse Proxy 설정하기
Spring Boot는 일반적으로 8080, 8888과 같은 내부 포트에서 실행하고, 외부 사용자는 Apache를 통해 HTTPS로 접속하도록 구성합니다.
구조는 다음과 같습니다.
사용자
↓
https://example.com
↓
Apache (443)
↓
http://localhost:8888
↓
Spring Boot
이 방식을 사용하면 SSL 인증서 관리를 Apache에서 처리할 수 있고, Spring Boot는 내부 포트만 사용하므로 보안성과 운영 편의성이 높아집니다.
Apache Proxy 모듈 설치
AlmaLinux 9 기준으로 Proxy 모듈을 설치합니다.
sudo dnf install mod_proxy mod_proxy_http -y
설치 후 Apache를 재시작합니다.
sudo systemctl restart httpd
VirtualHost 설정
가상 호스트 설정 파일을 생성합니다.
sudo vi /etc/httpd/conf.d/vk.conf
HTTP → HTTPS 리다이렉트
80포트 접속 시 HTTPS로 강제 이동합니다.
<VirtualHost *:80>
ServerName example.com
RewriteEngine On
RewriteRule ^(.*)$ https://example.com$1 [R=301,L]
</VirtualHost>
HTTPS Reverse Proxy 설정
<VirtualHost *:443>
ServerName example.com
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8888/
ProxyPassReverse / http://127.0.0.1:8888/
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
ErrorLog logs/example-error.log
CustomLog logs/example-access.log combined
</VirtualHost>
설정 문법 확인
Apache 설정 적용 전 문법 검사를 수행합니다.
sudo apachectl configtest
정상일 경우
Syntax OK
가 출력됩니다.
Apache 재시작
sudo systemctl restart httpd
또는
sudo systemctl reload httpd
Reverse Proxy 동작 확인
Spring Boot 서비스 상태 확인
sudo systemctl status vk
포트 확인
sudo ss -ntlp | grep 8888
예시
LISTEN 0 511 *:8888 *:*
서버 내부 테스트
curl http://localhost:8888
응답이 정상적으로 나오면 Spring Boot는 정상입니다.
이후 브라우저에서
https://example.com
접속 시 Spring Boot 화면이 나타나면 Reverse Proxy 설정이 완료된 것입니다.
Spring Boot에서 X-Forwarded 헤더 처리
Apache 뒤에서 실행되는 Spring Boot는 실제 접속 프로토콜이 HTTPS라는 것을 인식해야 하는 경우가 있습니다.
application.yml
server:
forward-headers-strategy: framework
또는
server.forward-headers-strategy=framework
설정하면 Spring Security, OAuth 로그인, Redirect URL 생성 시 HTTPS 주소를 올바르게 인식할 수 있습니다.
운영 환경 권장 구성
Internet
↓
HTTPS 443
↓
Apache
↓
Reverse Proxy
↓
localhost:8888
↓
Spring Boot(systemd)
이 구조는 현재 대부분의 Spring Boot 운영 서버에서 사용하는 표준 구성으로, SSL 처리, 보안 강화, 서비스 관리, 자동 재시작, CI/CD 배포까지 안정적으로 운영할 수 있습니다.
마무리
AlmaLinux 9에서 Spring Boot를 운영할 때는 단순한 java -jar 실행 방식보다 systemd 서비스 등록 + Apache Reverse Proxy 구성이 가장 안정적인 운영 방식입니다.
이 구조를 사용하면 서버 재부팅 시 자동 실행, 장애 발생 시 자동 복구, 로그 관리, GitLab CI/CD 자동 배포까지 모두 구현할 수 있습니다. 특히 운영 환경에서는 서비스 계정 분리와 systemd 기반 프로세스 관리가 필수에 가깝기 때문에 초기 구축 단계에서 함께 적용하는 것을 권장합니다.
FAQ
Spring Boot를 root 계정으로 실행해도 되나요?
가능하지만 권장하지 않습니다. 별도 배포 계정을 생성하여 실행하는 것이 보안상 안전합니다.
nohup과 systemd 중 무엇이 더 좋은가요?
운영 서버라면 systemd가 정답에 가깝습니다. 자동 시작, 자동 재시작, 로그 관리 등 운영 기능이 훨씬 우수합니다.
Apache 대신 Nginx를 사용해도 되나요?
가능합니다. 실제로 Nginx Reverse Proxy + Spring Boot 조합도 매우 많이 사용됩니다.
로그 파일을 별도로 생성해야 하나요?
필수는 아닙니다. systemd 환경에서는 journalctl만으로도 충분히 로그 관리가 가능합니다.
'서버 & 인프라' 카테고리의 다른 글
| DDNS란 무엇인가? 유동 IP 환경에서 꼭 필요한 이유와 활용 방법 (0) | 2026.06.04 |
|---|---|
| GitLab Runner SSH 비밀번호 없이 원격 서버 자동 배포 설정하기 (0) | 2026.06.04 |
| ipTIME 포트포워딩 설정 방법 (Ubuntu 서버 GitLab, Nexus, Apache 외부 접속하기) (0) | 2026.06.03 |
| 게이트웨이(Gateway)란 무엇인가? 인터넷이 연결되는 원리 쉽게 이해하기 (0) | 2026.06.02 |
| Ubuntu 22.04 Nexus 3.92 systemd 서비스 등록 및 자동 실행 설정 방법 (0) | 2026.06.02 |
