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

13 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 그룹 생성

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

1.2 사용자 계정 생성

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

1.3 사용자 비밀번호 설정

# xit 사용자 비밀번호 설정
passwd xit
# 프롬프트가 나오면 "xit5811807"을 입력합니다.

# root 사용자 비밀번호 설정 (필요시)
passwd root
# 프롬프트가 나오면 "xit5811807"을 입력합니다.

1.4 사용자 생성 확인

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

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 설정 파일 편집

# xit의 .bash_profile 편집
vi /home/xit/.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/VIPS
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/VIPS
export PATH=$APP_HOME:$PATH

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

vi 편집기 사용법:

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

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

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

파일 끝에 추가:

# umask 설정
umask 002

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

3.4 설정 적용

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

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

3.5 환경 변수 확인

# xit로 전환
su - xit

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

# umask 확인
umask
# 출력: 0002

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

4.1 디렉토리 생성

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

4.2 디렉토리 소유권 변경

# xit:xit 소유권으로 변경
chown -R xit:xit /app/VIPS

4.3 디렉토리 권한 설정

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

4.4 권한 확인

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

5단계: Spring Boot 소스 배포

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

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

# Windows PowerShell 또는 CMD에서 실행
scp C:\path\to\VIPS-BOOT.war xit@서버IP:/app/VIPS/

방법 2: SFTP 사용

# SFTP 접속
sftp xit@서버IP

# 파일 전송
put VIPS-BOOT.war /app/VIPS/
exit

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

# xit로 전환
su - xit

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

5.2 배포된 파일 확인

# xit로 전환
su - xit

# 파일 확인
ls -la /app/VIPS/

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

chmod 775 /app/VIPS/VIPS-BOOT.war

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

6.1 기본 실행

# xit로 전환
su - xit

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

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

# nohup으로 백그라운드 실행
nohup java -Dspring.profiles.active=prd -jar /app/VIPS/VIPS-BOOT.war > /app/VIPS/logs/app.log 2>&1 &
# 실행로그도 안남김.. 서버 부팅 로그 확인 이후
nohup java -Dspring.profiles.active=prd -jar /app/VIPS/VIPS-BOOT.war > /dev/null 2>&1 &


# 또는 출력 분리
nohup java -Dspring.profiles.active=prd -jar /app/VIPS/VIPS-BOOT.war \
  1>/app/VIPS/logs/stdout.log \
  2>/app/VIPS/logs/stderr.log &

6.3 JVM 옵션과 함께 실행

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

6.4 프로세스 ID 확인

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

# 또는 프로세스 검색
ps -ef | grep java
ps -ef | grep VIPS-BOOT.war

7단계: 실행 결과 확인

7.1 프로세스 실행 확인

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

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

7.2 로그 확인

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

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

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

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

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

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

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

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

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

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

8.1 애플리케이션 중지

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

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

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

8.2 애플리케이션 재시작

# 중지 후 시작
kill $(cat /app/VIPS/app.pid)
sleep 3
# nohup java -Dspring.profiles.active=prd -jar /app/VIPS/VIPS-BOOT.war > /app/VIPS/logs/app.log 2>&1 &
nohup java -Dspring.profiles.active=prd -jar /app/VIPS/VIPS-BOOT.war > /dev/null 2>&1 &
echo $! > /app/VIPS/app.pid

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

vi /app/VIPS/start.sh

스크립트 내용:

#!/bin/bash
APP_NAME="VIPS-BOOT.war"
APP_HOME="/app/VIPS"
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 -Dspring.profiles.active=prd $APP_HOME/$APP_NAME > $LOG_DIR/app.log 2>&1 &
nohup java -Dspring.profiles.active=prd -jar /app/VIPS/$APP_HOME/$APP_NAME > /dev/null 2>&1 &
echo $! > $PID_FILE
echo "Application started (PID: $(cat $PID_FILE))"

스크립트 실행 권한 부여:

chmod 775 /app/VIPS/start.sh

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

vi /app/VIPS/stop.sh

스크립트 내용:

#!/bin/bash
PID_FILE="/app/VIPS/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/VIPS/stop.sh

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

9.1 서비스 파일 생성

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

서비스 파일 내용:

[Unit]
Description=VIPS Spring Boot Application
After=network.target
 # 600초(10분) 동안의 재시작 횟수를 카운트, 최대 5번까지만 재시작 시도
StartLimitIntervalSec=600
StartLimitBurst=5

[Service]
Type=simple
User=xit
Group=xit
WorkingDirectory=/app/VIPS
# ExecStart=/usr/lib/jvm/java-1.8.0-openjdk/bin/java -Xms512m -Xmx1024m -Dspring.profiles.active=prd -jar /app/VIPS/VIPS-BOOT.war
ExecStart=/usr/lib/jvm/java-1.8.0-openjdk/bin/java -Dspring.profiles.active=prd -jar /app/VIPS/VIPS-BOOT.war
# ExecStop=/bin/kill -15 $MAINPID
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

9.2 서비스 등록 및 시작

# systemd 데몬 리로드
systemctl daemon-reload

# 서비스 시작
systemctl start vips

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

9.3 서비스 관리 명령어

# 상태 확인
systemctl status vips

# 시작
systemctl start vips

# 중지
systemctl stop vips

# 재시작
systemctl restart vips

# 로그 확인
journalctl -u vips -f

전체 실행 순서 요약

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

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

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

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

# 5. 소스 배포 (외부에서 파일 전송)
# scp VIPS-BOOT.war xit@서버IP:/app/VIPS/

# 6. xit로 전환 후 실행
su - xit
cd /app/VIPS
nohup java -jar VIPS-BOOT.war > /app/VIPS/logs/app.log 2>&1 &

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

문제 해결 (Troubleshooting)

Java를 찾을 수 없는 경우

# Java 설치 확인
which java
java -version

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

포트가 이미 사용 중인 경우

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

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

권한 오류 발생 시

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

# 권한 재설정
chown -R xit:xit /app/VIPS
chmod -R 775 /app/VIPS

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

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

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

메모리 부족 오류 (OutOfMemoryError)

# JVM 메모리 옵션 조정
java -Xms1g -Xmx2g -jar VIPS-BOOT.war