AlmaLinux 9에서 Spring Boot 서비스 등록 및 운영하기 (systemd + Apache Reverse Proxy)

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 서비스를 사용합니다.

항목java -jar 직접 실행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만으로도 충분히 로그 관리가 가능합니다.