diff --git a/vm/install_php.sh b/vm/install_php.sh index 3491ff9..c09e9f5 100644 --- a/vm/install_php.sh +++ b/vm/install_php.sh @@ -1,157 +1,167 @@ #!/bin/bash -# PHP 설치 스크립트 (Rocky Linux 9) -# 오류 처리: 실패 시 롤백, 중복 설정 처리 포함 -# 현재 사용자 계정 기준으로 PHP-FPM pool 생성 -# 사용법: ./install_php.sh 8.2 또는 8.4 +# Rocky Linux 9 - 테스트 서버용 공통 설치 스크립트 +# Apache + FTP + Vim +# Forbidden 방지 (권한 + welcome.conf 제거) set -euo pipefail -PHP_VERSION=$1 -if [[ -z "$PHP_VERSION" ]]; then - echo "사용법: $0 (예: 8.2 또는 8.4)" - exit 1 -fi +WEB_USER="$USER" +WEB_HOME="$(eval echo "~$WEB_USER")" +WEB_ROOT="/var/www/html" -# 지원 버전 확인 -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 +APACHE_CONF="/etc/httpd/conf.d/${WEB_USER}.conf" +PHP_CONF="/etc/httpd/conf.d/10-php-${WEB_USER}.conf" -# 현재 사용자 계정 및 홈 -WEB_USER=$USER -WEB_HOME=$(eval echo "~$WEB_USER") -WEB_ROOT="$WEB_HOME/www" - -# 오류 처리 함수 +######################################## +# 오류 발생 시 Apache 설정 롤백 +######################################## cleanup() { EXIT_CODE=$? if [ $EXIT_CODE -ne 0 ]; then - echo "❌ PHP 설치 중 에러 발생 ($EXIT_CODE)" - echo "변경사항이 부분적으로 적용되었을 수 있습니다." - echo "다시 실행하면 기존 설정을 덮어씁니다." + echo "❌ 오류 발생 ($EXIT_CODE) – Apache 설정 롤백" + sudo rm -f "$APACHE_CONF" + sudo rm -f "$PHP_CONF" + sudo systemctl restart httpd 2>/dev/null || true fi exit $EXIT_CODE } - trap cleanup EXIT -echo "설치 사용자: $WEB_USER" -echo "웹 루트: $WEB_ROOT" -echo "설치 PHP 버전: $PHP_VERSION" -echo "" +echo "▶ 설치 사용자 : $WEB_USER" +echo "▶ 웹 루트 : $WEB_ROOT" -# 사전 확인: 이미 설치된 경우 -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)" +######################################## +# 시스템 업데이트 / 필수 패키지 +######################################## +sudo dnf -y update +sudo dnf -y install \ + vim curl wget tar \ + httpd vsftpd \ + policycoreutils-python-utils + +######################################## +# firewalld 비활성화 +######################################## +sudo systemctl stop firewalld 2>/dev/null || true +sudo systemctl disable firewalld 2>/dev/null || true + +######################################## +# Apache 기본 Welcome 페이지 제거 +######################################## +if [ -f /etc/httpd/conf.d/welcome.conf ]; then + sudo mv /etc/httpd/conf.d/welcome.conf \ + /etc/httpd/conf.d/welcome.conf.disabled + echo "✓ Apache welcome.conf 비활성화" 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 저장소가 이미 설치되어 있습니다" +######################################## +# 웹 루트 생성 및 권한 (403 방지 핵심) +######################################## +sudo mkdir -p "$WEB_ROOT" + +# Apache가 반드시 접근 가능해야 함 +sudo chown -R apache:apache "$WEB_ROOT" +sudo chmod 755 "$WEB_ROOT" + +# 디렉토리/파일 권한 정규화 +sudo find "$WEB_ROOT" -type d -exec chmod 755 {} \; +sudo find "$WEB_ROOT" -type f -exec chmod 644 {} \; + +######################################## +# 홈 디렉토리 심볼릭 링크 (~/www) +######################################## +if [ -d "$WEB_HOME/www" ] && [ ! -L "$WEB_HOME/www" ]; then + rm -rf "$WEB_HOME/www" 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 +if [ ! -L "$WEB_HOME/www" ]; then + ln -s "$WEB_ROOT" "$WEB_HOME/www" + echo "✓ ~/www → /var/www/html" 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 < + + + + Rocky Linux Test Server + + +

✅ Apache 정상 동작

+

WebRoot: $WEB_ROOT

+ + +EOF + sudo chown apache:apache "$WEB_ROOT/index.html" +fi + +######################################## +# Apache VirtualHost +######################################## +sudo tee "$APACHE_CONF" >/dev/null < + ServerAdmin webmaster@localhost + DocumentRoot $WEB_ROOT + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + ErrorLog /var/log/httpd/${WEB_USER}-error.log + CustomLog /var/log/httpd/${WEB_USER}-access.log combined + EOF -echo "✓ PHP-FPM pool 설정 파일 생성 완료: $FPM_POOL" +######################################## +# PHP 연동 설정 (php-fpm 설치 후 자동 활성) +######################################## +sudo tee "$PHP_CONF" >/dev/null <<'EOF' + + + SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost" + + +EOF -# 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; } +######################################## +# SELinux 컨텍스트 복구 +######################################## +sudo restorecon -Rv "$WEB_ROOT" -# 서비스 상태 확인 -if ! sudo systemctl is-active --quiet php-fpm; then - echo "❌ PHP-FPM 서비스가 실행 중이 아닙니다" - sudo systemctl status php-fpm - exit 1 -fi +######################################## +# Apache / FTP 활성화 +######################################## +sudo systemctl enable --now httpd +sudo systemctl enable --now vsftpd -# Socket 파일 확인 -SOCKET="/run/php-fpm/$WEB_USER.sock" -if [ ! -S "$SOCKET" ]; then - echo "❌ PHP-FPM socket 파일이 생성되지 않았습니다: $SOCKET" - exit 1 -fi +######################################## +# SELinux - Apache/PHP 통합 허용 +######################################## +sudo setsebool -P httpd_unified 1 + +######################################## +# 완료 메시지 +######################################## +IP_ADDR=$(hostname -I | awk '{print $1}') echo "" -echo "✅ PHP $PHP_INSTALLED 설치 완료!" -echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -echo "✓ PHP-FPM pool: $FPM_POOL" -echo "✓ PHP-FPM socket: $SOCKET" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "✅ 테스트 서버 설정 완료 (Forbidden 해결)" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "✔ WebRoot : $WEB_ROOT" +echo "✔ Welcome 페이지 제거됨" +echo "✔ Apache 접근 권한 정상" 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 " http://$IP_ADDR/" echo "" -echo "=== PHP $PHP_VERSION 설치 완료! ===" -echo "✓ PHP-FPM 풀: $WEB_USER" -echo "✓ PHP-FPM 소켓: /run/php-fpm/$WEB_USER.sock" +echo "📄 로그" +echo " /var/log/httpd/${WEB_USER}-access.log" +echo " /var/log/httpd/${WEB_USER}-error.log" 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 # 에러 로그 확인"