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