#!/bin/bash # PHP 설치 스크립트 (Rocky Linux 9) # 오류 처리: 실패 시 롤백, 중복 설정 처리 포함 # 현재 사용자 계정 기준으로 PHP-FPM pool 생성 # 사용법: ./install_php.sh 8.2 또는 8.4 set -euo pipefail PHP_VERSION=$1 if [[ -z "$PHP_VERSION" ]]; then echo "사용법: $0 (예: 8.2 또는 8.4)" exit 1 fi # 지원 버전 확인 if [[ ! "$PHP_VERSION" =~ ^(8\.[2-9]|9\.[0-9])$ ]]; then echo "❌ 지원하지 않는 PHP 버전: $PHP_VERSION" echo "지원 버전: 8.2, 8.3, 8.4, 9.0 이상" exit 1 fi # 현재 사용자 계정 및 홈 WEB_USER=$USER WEB_HOME=$(eval echo "~$WEB_USER") WEB_ROOT="$WEB_HOME/www" # 오류 처리 함수 cleanup() { EXIT_CODE=$? if [ $EXIT_CODE -ne 0 ]; then echo "❌ PHP 설치 중 에러 발생 ($EXIT_CODE)" echo "변경사항이 부분적으로 적용되었을 수 있습니다." echo "다시 실행하면 기존 설정을 덮어씁니다." fi exit $EXIT_CODE } trap cleanup EXIT echo "설치 사용자: $WEB_USER" echo "웹 루트: $WEB_ROOT" echo "설치 PHP 버전: $PHP_VERSION" echo "" # 사전 확인: 이미 설치된 경우 FPM_POOL="/etc/php-fpm.d/$WEB_USER.conf" if [ -f "$FPM_POOL" ]; then echo "⚠️ ${WEB_USER}의 PHP-FPM pool이 이미 존재합니다." read -p "기존 설정을 덮어쓰고 진행하시겠습니까? (y/n) " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then echo "설정 업데이트를 건너뜁니다." exit 0 fi echo "기존 pool 설정을 백업합니다..." sudo cp "$FPM_POOL" "${FPM_POOL}.bak.$(date +%s)" fi # Remi 저장소 설치 (이미 설치된 경우 재설치하지 않음) if ! rpm -q remi-release 2>/dev/null; then echo "Remi 저장소 설치 중..." sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm || { echo "❌ Remi 저장소 설치 실패"; exit 1; } else echo "ℹ️ Remi 저장소가 이미 설치되어 있습니다" fi # PHP 버전 설정 echo "PHP $PHP_VERSION 모듈 활성화 중..." sudo dnf module reset php -y 2>/dev/null || true sudo dnf module enable php:remi-$PHP_VERSION -y || { echo "❌ PHP $PHP_VERSION 활성화 실패"; exit 1; } # PHP 및 필수 모듈 설치 (NTS 빌드) echo "PHP 패키지 설치 중..." PACKAGES="php php-cli php-fpm php-mysqlnd php-pdo php-mbstring php-xml php-gd php-curl php-opcache php-soap php-intl php-zip php-bcmath php-bz2 php-imagick" for pkg in $PACKAGES; do if ! sudo dnf install -y "$pkg" 2>/dev/null; then echo "⚠️ $pkg 설치 실패 (선택사항 건너뜀)" fi done # PHP 설치 확인 if ! command -v php &>/dev/null; then echo "❌ PHP 설치 실패" exit 1 fi PHP_INSTALLED=$(php -r 'echo phpversion();') echo "✓ PHP $PHP_INSTALLED 설치 완료" # PHP-FPM pool 생성 (사용자 계정 기준) echo "PHP-FPM pool 설정 중..." sudo bash -c "cat > $FPM_POOL" </dev/null || { echo "❌ PHP-FPM 활성화 실패"; exit 1; } sudo systemctl restart php-fpm || { echo "❌ PHP-FPM 재시작 실패"; exit 1; } # 서비스 상태 확인 if ! sudo systemctl is-active --quiet php-fpm; then echo "❌ PHP-FPM 서비스가 실행 중이 아닙니다" sudo systemctl status php-fpm exit 1 fi # Socket 파일 확인 SOCKET="/run/php-fpm/$WEB_USER.sock" if [ ! -S "$SOCKET" ]; then echo "❌ PHP-FPM socket 파일이 생성되지 않았습니다: $SOCKET" exit 1 fi echo "" echo "✅ PHP $PHP_INSTALLED 설치 완료!" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "✓ PHP-FPM pool: $FPM_POOL" echo "✓ PHP-FPM socket: $SOCKET" echo "" echo "📋 다음 단계:" echo " 1. Apache 재시작: sudo systemctl restart httpd" echo " 2. PHP 정보 확인: php -v" echo " 3. PHP-FPM 상태: sudo systemctl status php-fpm" echo " 4. 웹 접속 및 테스트" # Apache와 PHP-FPM 연동 설정 (setup_common.sh에서 이미 설정됨) # Apache 재시작 sudo systemctl restart httpd # 설치 확인 echo "" echo "=== PHP $PHP_VERSION 설치 완료! ===" echo "✓ PHP-FPM 풀: $WEB_USER" echo "✓ PHP-FPM 소켓: /run/php-fpm/$WEB_USER.sock" echo "" echo "확인 방법:" echo " 1. php -v # PHP 버전 확인" echo " 2. php-fpm -v # PHP-FPM 버전 확인" echo " 3. php -m | grep -E '(pdo|mysql)' # DB 모듈 확인" echo " 4. echo '' > ~/www/test.php # 웹 접속 테스트" echo " 5. cat /var/log/httpd/${WEB_USER}-error.log # 에러 로그 확인"