You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
VIPS/docs/리눅스 rocky setting.md

12 KiB

Rocky Linux 9.5 Spring Boot 서버 설정 가이드

요구사항

  1. Rocky Linux 9.5 version, 가상화 서버
  2. 현재 root로 설치만 되어 있는 상태
  3. 목표는 신규 계정 및 그룹생성하고 java 설치, profile 설정 및 적용, path 설정 및 적용, umask 설정(775권한)
  4. 디렉토리 생성하여 spring-boot 소스 배포
  5. 소스 실행
  6. 소스 실행 결과 확인

1단계: 그룹 및 사용자 계정 생성

1.1 그룹 생성

# 애플리케이션용 그룹 생성 (예: appgroup)
groupadd appgroup

1.2 사용자 계정 생성

# 사용자 생성 (예: appuser)
# -m: 홈 디렉토리 자동 생성
# -g: 기본 그룹 지정
# -s: 기본 쉘 지정
useradd -m -g appgroup -s /bin/bash appuser

1.3 사용자 비밀번호 설정

# 비밀번호 설정
passwd appuser
# 프롬프트가 나오면 비밀번호를 두 번 입력

1.4 사용자 생성 확인

# 사용자 정보 확인
id appuser
# 출력 예시: uid=1001(appuser) gid=1001(appgroup) groups=1001(appgroup)

2단계: Java 설치

2.1 사용 가능한 Java 버전 확인

# 설치 가능한 Java 패키지 검색 (dnf 사용)
dnf search java | grep openjdk

# 또는 yum 사용 (Rocky Linux에서 yum은 dnf의 별칭)
yum search java | grep openjdk

2.2 Java 17 설치 (Spring Boot 3.x 권장)

# dnf로 Java 17 JDK 설치
dnf install -y java-17-openjdk java-17-openjdk-devel

# 또는 yum으로 설치
yum install -y java-17-openjdk java-17-openjdk-devel

2.3 Java 8 (JDK 1.8) 설치 (레거시 프로젝트용)

# dnf로 Java 8 JDK 설치
dnf install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel

# 또는 yum으로 설치
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel

2.4 여러 Java 버전 설치 시 버전 전환

# 설치된 Java 버전 목록 확인
alternatives --config java

# 실행하면 아래와 같이 선택 화면이 나옴:
# Selection    Command
# -----------------------------------------------
# *+ 1         java-17-openjdk.x86_64
#    2         java-1.8.0-openjdk.x86_64
#
# Enter to keep the current selection[+], or type selection number:

# javac도 동일하게 전환
alternatives --config javac

2.5 Java 설치 확인

# Java 버전 확인
java -version

# javac 버전 확인
javac -version

2.6 Java 설치 경로 확인

# Java 설치 경로 확인
alternatives --display java

# 또는 직접 확인
ls -la /usr/lib/jvm/

# Java 8 경로 예시: /usr/lib/jvm/java-1.8.0-openjdk
# Java 17 경로 예시: /usr/lib/jvm/java-17-openjdk

2.7 dnf vs yum 차이점

명령어 설명
dnf Rocky Linux 8/9의 기본 패키지 관리자 (권장)
yum 기존 CentOS/RHEL 호환용 (dnf의 심볼릭 링크)

참고: Rocky Linux 9에서는 dnf와 yum 둘 다 사용 가능하며, 동일하게 동작합니다.


3단계: 환경 변수 및 Profile 설정

3.1 사용자 profile 설정 파일 편집

# appuser의 .bash_profile 편집
vi /home/appuser/.bash_profile

3.2 .bash_profile 내용 추가

파일을 열고 아래 내용을 파일 끝에 추가합니다:

Java 17 사용 시:

# Java 환경 변수 설정 (Java 17)
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH=$JAVA_HOME/bin:$PATH

# 애플리케이션 관련 환경 변수
export APP_HOME=/app
export PATH=$APP_HOME:$PATH

# umask 설정 (파일 생성시 775 권한)
# 775 = 777 - 002
umask 002

Java 8 (JDK 1.8) 사용 시:

# Java 환경 변수 설정 (Java 8)
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$JAVA_HOME/bin:$PATH

# 애플리케이션 관련 환경 변수
export APP_HOME=/app
export PATH=$APP_HOME:$PATH

# umask 설정 (파일 생성시 775 권한)
# 775 = 777 - 002
umask 002

vi 편집기 사용법:

  1. i 키를 눌러 편집 모드 진입
  2. 내용 입력
  3. ESC 키를 눌러 편집 모드 종료
  4. :wq 입력 후 Enter로 저장 및 종료

3.3 .bashrc 파일도 설정 (선택사항)

# appuser의 .bashrc 편집
vi /home/appuser/.bashrc

파일 끝에 추가:

# umask 설정
umask 002

# alias 설정 (편의용)
alias ll='ls -la'
alias app='cd /app'

3.4 설정 적용

# 설정 즉시 적용 (root에서 실행 시)
su - appuser -c "source ~/.bash_profile"

# 또는 appuser로 전환 후 실행
su - appuser
source ~/.bash_profile

3.5 환경 변수 확인

# appuser로 전환
su - appuser

# 환경 변수 확인
echo $JAVA_HOME
echo $PATH
echo $APP_HOME

# umask 확인
umask
# 출력: 0002

4단계: 애플리케이션 디렉토리 생성 및 권한 설정

4.1 디렉토리 생성

# root 계정으로 실행
# 애플리케이션 디렉토리 생성
mkdir -p /app
mkdir -p /app/logs
mkdir -p /app/config
mkdir -p /app/backup

4.2 디렉토리 소유권 변경

# appuser:appgroup 소유권으로 변경
chown -R appuser:appgroup /app

4.3 디렉토리 권한 설정

# 775 권한 설정 (소유자/그룹: rwx, 기타: r-x)
chmod -R 775 /app

4.4 권한 확인

# 디렉토리 권한 및 소유권 확인
ls -la /app
# 출력 예시:
# drwxrwxr-x. 4 appuser appgroup 4096 Nov 19 10:00 .
# drwxrwxr-x. 2 appuser appgroup 4096 Nov 19 10:00 logs
# drwxrwxr-x. 2 appuser appgroup 4096 Nov 19 10:00 config
# drwxrwxr-x. 2 appuser appgroup 4096 Nov 19 10:00 backup

5단계: Spring Boot 소스 배포

5.1 소스 파일 전송 (로컬 PC → 서버)

방법 1: SCP 사용 (로컬 PC에서 실행)

# Windows PowerShell 또는 CMD에서 실행
scp C:\path\to\your-app.jar appuser@서버IP:/app/

방법 2: SFTP 사용

# SFTP 접속
sftp appuser@서버IP

# 파일 전송
put your-app.jar /app/
exit

방법 3: 서버에서 직접 다운로드 (URL이 있는 경우)

# appuser로 전환
su - appuser

# 파일 다운로드
cd /app
curl -O http://your-server/your-app.jar
# 또는
wget http://your-server/your-app.jar

5.2 배포된 파일 확인

# appuser로 전환
su - appuser

# 파일 확인
ls -la /app/

5.3 실행 권한 부여 (필요시)

chmod 775 /app/your-app.jar

6단계: Spring Boot 애플리케이션 실행

6.1 기본 실행

# appuser로 전환
su - appuser

# 애플리케이션 실행
cd /app
java -jar your-app.jar

6.2 백그라운드 실행 (터미널 종료 후에도 계속 실행)

# nohup으로 백그라운드 실행
nohup java -jar /app/your-app.jar > /app/logs/app.log 2>&1 &

# 또는 출력 분리
nohup java -jar /app/your-app.jar \
  1>/app/logs/stdout.log \
  2>/app/logs/stderr.log &

6.3 JVM 옵션과 함께 실행

# 메모리 설정 포함 실행
nohup java \
  -Xms512m \
  -Xmx1024m \
  -jar /app/your-app.jar \
  --spring.profiles.active=prod \
  > /app/logs/app.log 2>&1 &

6.4 프로세스 ID 확인

# 실행 직후 PID 저장
echo $! > /app/app.pid

# 또는 프로세스 검색
ps -ef | grep java
ps -ef | grep your-app.jar

7단계: 실행 결과 확인

7.1 프로세스 실행 확인

# Java 프로세스 확인
ps -ef | grep java

# 특정 포트 확인 (예: 8080)
ss -tlnp | grep 8080
# 또는
netstat -tlnp | grep 8080

7.2 로그 확인

# 실시간 로그 확인
tail -f /app/logs/app.log

# 최근 100줄 확인
tail -100 /app/logs/app.log

# 로그에서 에러 검색
grep -i error /app/logs/app.log
grep -i exception /app/logs/app.log

7.3 애플리케이션 응답 테스트

# HTTP 응답 확인 (포트 8080 예시)
curl -I http://localhost:8080

# API 엔드포인트 테스트
curl http://localhost:8080/actuator/health
curl http://localhost:8080/api/test

7.4 방화벽 설정 (외부 접속 허용)

# root 계정으로 실행
# 포트 8080 방화벽 허용
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload

# 방화벽 상태 확인
firewall-cmd --list-all

8단계: 애플리케이션 관리 명령어

8.1 애플리케이션 중지

# PID 파일로 중지
kill $(cat /app/app.pid)

# 또는 프로세스 검색 후 중지
ps -ef | grep your-app.jar
kill [PID번호]

# 강제 종료 (응답 없을 때)
kill -9 [PID번호]

8.2 애플리케이션 재시작

# 중지 후 시작
kill $(cat /app/app.pid)
sleep 3
nohup java -jar /app/your-app.jar > /app/logs/app.log 2>&1 &
echo $! > /app/app.pid

8.3 시작 스크립트 생성 (선택사항)

vi /app/start.sh

스크립트 내용:

#!/bin/bash
APP_NAME="your-app.jar"
APP_HOME="/app"
LOG_DIR="$APP_HOME/logs"
PID_FILE="$APP_HOME/app.pid"

# 이미 실행 중인지 확인
if [ -f "$PID_FILE" ]; then
    PID=$(cat $PID_FILE)
    if ps -p $PID > /dev/null 2>&1; then
        echo "Application is already running (PID: $PID)"
        exit 1
    fi
fi

# 애플리케이션 시작
echo "Starting application..."
nohup java -Xms512m -Xmx1024m -jar $APP_HOME/$APP_NAME > $LOG_DIR/app.log 2>&1 &
echo $! > $PID_FILE
echo "Application started (PID: $(cat $PID_FILE))"

스크립트 실행 권한 부여:

chmod 775 /app/start.sh

8.4 중지 스크립트 생성 (선택사항)

vi /app/stop.sh

스크립트 내용:

#!/bin/bash
PID_FILE="/app/app.pid"

if [ -f "$PID_FILE" ]; then
    PID=$(cat $PID_FILE)
    if ps -p $PID > /dev/null 2>&1; then
        echo "Stopping application (PID: $PID)..."
        kill $PID
        sleep 3
        if ps -p $PID > /dev/null 2>&1; then
            echo "Force killing..."
            kill -9 $PID
        fi
        rm -f $PID_FILE
        echo "Application stopped"
    else
        echo "Application is not running"
        rm -f $PID_FILE
    fi
else
    echo "PID file not found"
fi

스크립트 실행 권한 부여:

chmod 775 /app/stop.sh

9단계: systemd 서비스 등록 (선택사항 - 권장)

9.1 서비스 파일 생성

# root 계정으로 실행
vi /etc/systemd/system/myapp.service

서비스 파일 내용:

[Unit]
Description=My Spring Boot Application
After=network.target

[Service]
Type=simple
User=appuser
Group=appgroup
WorkingDirectory=/app
ExecStart=/usr/lib/jvm/java-17-openjdk/bin/java -Xms512m -Xmx1024m -jar /app/your-app.jar
ExecStop=/bin/kill -15 $MAINPID
Restart=on-failure
RestartSec=10

# 로그 설정
StandardOutput=append:/app/logs/app.log
StandardError=append:/app/logs/error.log

[Install]
WantedBy=multi-user.target

9.2 서비스 등록 및 시작

# systemd 데몬 리로드
systemctl daemon-reload

# 서비스 시작
systemctl start myapp

# 부팅 시 자동 시작 설정
systemctl enable myapp

9.3 서비스 관리 명령어

# 상태 확인
systemctl status myapp

# 시작
systemctl start myapp

# 중지
systemctl stop myapp

# 재시작
systemctl restart myapp

# 로그 확인
journalctl -u myapp -f

전체 실행 순서 요약

# 1. root로 로그인 후 그룹/사용자 생성
groupadd appgroup
useradd -m -g appgroup -s /bin/bash appuser
passwd appuser

# 2. Java 설치
dnf install -y java-17-openjdk java-17-openjdk-devel

# 3. 환경 변수 설정
vi /home/appuser/.bash_profile
# (JAVA_HOME, PATH, umask 설정 추가)

# 4. 디렉토리 생성 및 권한 설정
mkdir -p /app/logs /app/config /app/backup
chown -R appuser:appgroup /app
chmod -R 775 /app

# 5. 소스 배포 (외부에서 파일 전송)
# scp your-app.jar appuser@서버IP:/app/

# 6. appuser로 전환 후 실행
su - appuser
cd /app
nohup java -jar your-app.jar > /app/logs/app.log 2>&1 &

# 7. 실행 확인
ps -ef | grep java
tail -f /app/logs/app.log
curl http://localhost:8080/actuator/health

문제 해결 (Troubleshooting)

Java를 찾을 수 없는 경우

# Java 설치 확인
which java
java -version

# 환경 변수 확인
echo $JAVA_HOME
echo $PATH

포트가 이미 사용 중인 경우

# 포트 사용 프로세스 확인
ss -tlnp | grep 8080
lsof -i :8080

# 해당 프로세스 종료
kill [PID]

권한 오류 발생 시

# 파일 권한 확인
ls -la /app/

# 권한 재설정
chown -R appuser:appgroup /app
chmod -R 775 /app

로그 파일이 생성되지 않는 경우

# 로그 디렉토리 권한 확인
ls -la /app/logs

# 디렉토리가 없으면 생성
mkdir -p /app/logs
chown appuser:appgroup /app/logs
chmod 775 /app/logs

메모리 부족 오류 (OutOfMemoryError)

# JVM 메모리 옵션 조정
java -Xms1g -Xmx2g -jar your-app.jar