# 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 그룹 생성 ```bash # 애플리케이션용 그룹 생성 (예: xit) groupadd xit ``` ### 1.2 사용자 계정 생성 ```bash # 사용자 생성 (예: xit) # -m: 홈 디렉토리 자동 생성 # -g: 기본 그룹 지정 # -s: 기본 쉘 지정 useradd -m -g xit -s /bin/bash xit ``` ### 1.3 사용자 비밀번호 설정 ```bash # xit 사용자 비밀번호 설정 passwd xit # 프롬프트가 나오면 "xit5811807"을 입력합니다. # root 사용자 비밀번호 설정 (필요시) passwd root # 프롬프트가 나오면 "xit5811807"을 입력합니다. ``` ### 1.4 사용자 생성 확인 ```bash # 사용자 정보 확인 id xit # 출력 예시: uid=1001(xit) gid=1001(xit) groups=1001(xit) ``` --- ## 2단계: Java 설치 ### 2.1 사용 가능한 Java 버전 확인 ```bash # 설치 가능한 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 권장) ```bash # 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) 설치 (레거시 프로젝트용) ```bash # 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 버전 설치 시 버전 전환 ```bash # 설치된 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 설치 확인 ```bash # Java 버전 확인 java -version # javac 버전 확인 javac -version ``` ### 2.6 Java 설치 경로 확인 ```bash # 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 설정 파일 편집 ```bash # xit의 .bash_profile 편집 vi /home/xit/.bash_profile ``` ### 3.2 .bash_profile 내용 추가 파일을 열고 아래 내용을 파일 끝에 추가합니다: **Java 17 사용 시:** ```bash # 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) 사용 시:** ```bash # 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 파일도 설정 (선택사항) ```bash # xit의 .bashrc 편집 vi /home/xit/.bashrc ``` 파일 끝에 추가: ```bash # umask 설정 umask 002 # alias 설정 (편의용) alias ll=\'ls -la\' alias app=\'cd /app/VIPS\' ``` ### 3.4 설정 적용 ```bash # 설정 즉시 적용 (root에서 실행 시) su - xit -c "source ~/.bash_profile" # 또는 xit로 전환 후 실행 su - xit source ~/.bash_profile ``` ### 3.5 환경 변수 확인 ```bash # xit로 전환 su - xit # 환경 변수 확인 echo $JAVA_HOME echo $PATH echo $APP_HOME # umask 확인 umask # 출력: 0002 ``` --- ## 4단계: 애플리케이션 디렉토리 생성 및 권한 설정 ### 4.1 디렉토리 생성 ```bash # root 계정으로 실행 # 애플리케이션 디렉토리 생성 mkdir -p /app/VIPS mkdir -p /app/VIPS/logs mkdir -p /app/VIPS/config mkdir -p /app/VIPS/backup ``` ### 4.2 디렉토리 소유권 변경 ```bash # xit:xit 소유권으로 변경 chown -R xit:xit /app/VIPS ``` ### 4.3 디렉토리 권한 설정 ```bash # 775 권한 설정 (소유자/그룹: rwx, 기타: r-x) chmod -R 775 /app/VIPS ``` ### 4.4 권한 확인 ```bash # 디렉토리 권한 및 소유권 확인 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에서 실행)** ```bash # Windows PowerShell 또는 CMD에서 실행 scp C:\path\to\VIPS-BOOT.war xit@서버IP:/app/VIPS/ ``` **방법 2: SFTP 사용** ```bash # SFTP 접속 sftp xit@서버IP # 파일 전송 put VIPS-BOOT.war /app/VIPS/ exit ``` **방법 3: 서버에서 직접 다운로드 (URL이 있는 경우)** ```bash # xit로 전환 su - xit # 파일 다운로드 cd /app/VIPS curl -O http://your-server/VIPS-BOOT.war # 또는 wget http://your-server/VIPS-BOOT.war ``` ### 5.2 배포된 파일 확인 ```bash # xit로 전환 su - xit # 파일 확인 ls -la /app/VIPS/ ``` ### 5.3 실행 권한 부여 (필요시) ```bash chmod 775 /app/VIPS/VIPS-BOOT.war ``` --- ## 6단계: Spring Boot 애플리케이션 실행 ### 6.1 기본 실행 ```bash # xit로 전환 su - xit # 애플리케이션 실행 cd /app/VIPS java -jar VIPS-BOOT.war ``` ### 6.2 백그라운드 실행 (터미널 종료 후에도 계속 실행) ```bash # 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 옵션과 함께 실행 ```bash # 메모리 설정 포함 실행 nohup java \ -Xms512m \ -Xmx1024m \ -jar /app/VIPS/VIPS-BOOT.war \ --spring.profiles.active=prod \ > /app/VIPS/logs/app.log 2>&1 & ``` ### 6.4 프로세스 ID 확인 ```bash # 실행 직후 PID 저장 echo $! > /app/VIPS/app.pid # 또는 프로세스 검색 ps -ef | grep java ps -ef | grep VIPS-BOOT.war ``` --- ## 7단계: 실행 결과 확인 ### 7.1 프로세스 실행 확인 ```bash # Java 프로세스 확인 ps -ef | grep java # 특정 포트 확인 (예: 18080) ss -tlnp | grep 18080 # 또는 netstat -tlnp | grep 18080 ``` ### 7.2 로그 확인 ```bash # 실시간 로그 확인 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 애플리케이션 응답 테스트 ```bash # HTTP 응답 확인 (포트 18080 예시) curl -I http://localhost:18080 # API 엔드포인트 테스트 curl http://localhost:18080/actuator/health curl http://localhost:18080/api/test ``` ### 7.4 방화벽 설정 (외부 접속 허용) ```bash # root 계정으로 실행 # 포트 18080 방화벽 허용 firewall-cmd --permanent --add-port=18080/tcp firewall-cmd --reload # 방화벽 상태 확인 firewall-cmd --list-all ``` --- ## 8단계: 애플리케이션 관리 명령어 ### 8.1 애플리케이션 중지 ```bash # PID 파일로 중지 kill $(cat /app/VIPS/app.pid) # 또는 프로세스 검색 후 중지 ps -ef | grep VIPS-BOOT.war kill [PID번호] # 강제 종료 (응답 없을 때) kill -9 [PID번호] ``` ### 8.2 애플리케이션 재시작 ```bash # 중지 후 시작 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 시작 스크립트 생성 (선택사항) ```bash vi /app/VIPS/start.sh ``` 스크립트 내용: ```bash #!/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))" ``` 스크립트 실행 권한 부여: ```bash chmod 775 /app/VIPS/start.sh ``` ### 8.4 중지 스크립트 생성 (선택사항) ```bash vi /app/VIPS/stop.sh ``` 스크립트 내용: ```bash #!/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 ``` 스크립트 실행 권한 부여: ```bash chmod 775 /app/VIPS/stop.sh ``` --- ## 9단계: systemd 서비스 등록 (선택사항 - 권장) ### 9.1 서비스 파일 생성 ```bash # root 계정으로 실행 vi /etc/systemd/system/vips.service ``` 서비스 파일 내용: ```ini [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 서비스 등록 및 시작 ```bash # systemd 데몬 리로드 systemctl daemon-reload # 서비스 시작 systemctl start vips # 부팅 시 자동 시작 설정 systemctl enable vips ``` ### 9.3 서비스 관리 명령어 ```bash # 상태 확인 systemctl status vips # 시작 systemctl start vips # 중지 systemctl stop vips # 재시작 systemctl restart vips # 로그 확인 journalctl -u vips -f ``` --- ## 전체 실행 순서 요약 ```bash # 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를 찾을 수 없는 경우 ```bash # Java 설치 확인 which java java -version # 환경 변수 확인 echo $JAVA_HOME echo $PATH ``` ### 포트가 이미 사용 중인 경우 ```bash # 포트 사용 프로세스 확인 ss -tlnp | grep 18080 lsof -i :18080 # 해당 프로세스 종료 kill [PID] ``` ### 권한 오류 발생 시 ```bash # 파일 권한 확인 ls -la /app/VIPS/ # 권한 재설정 chown -R xit:xit /app/VIPS chmod -R 775 /app/VIPS ``` ### 로그 파일이 생성되지 않는 경우 ```bash # 로그 디렉토리 권한 확인 ls -la /app/VIPS/logs # 디렉토리가 없으면 생성 mkdir -p /app/VIPS/logs chown xit:xit /app/VIPS/logs chmod 775 /app/VIPS/logs ``` ### 메모리 부족 오류 (OutOfMemoryError) ```bash # JVM 메모리 옵션 조정 java -Xms1g -Xmx2g -jar VIPS-BOOT.war ```