Files
cafe24-testserver/vm/install_php.sh

158 lines
5.0 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 <PHP_VERSION> (예: 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" <<EOF
[$WEB_USER]
user = $WEB_USER
group = $WEB_USER
listen = /run/php-fpm/$WEB_USER.sock
listen.owner = apache
listen.group = apache
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 5
chdir = $WEB_ROOT
php_value[display_errors] = Off
php_value[error_reporting] = E_ALL & ~E_DEPRECATED & ~E_STRICT
EOF
echo "✓ PHP-FPM pool 설정 파일 생성 완료: $FPM_POOL"
# PHP-FPM 서비스 활성화 및 재시작
echo "PHP-FPM 서비스 재시작 중..."
sudo systemctl enable --now php-fpm 2>/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 '<?php phpinfo(); ?>' > ~/www/test.php # 웹 접속 테스트"
echo " 5. cat /var/log/httpd/${WEB_USER}-error.log # 에러 로그 확인"