Update vm/install_php.sh
This commit is contained in:
@ -1,157 +1,167 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# PHP 설치 스크립트 (Rocky Linux 9)
|
# Rocky Linux 9 - 테스트 서버용 공통 설치 스크립트
|
||||||
# 오류 처리: 실패 시 롤백, 중복 설정 처리 포함
|
# Apache + FTP + Vim
|
||||||
# 현재 사용자 계정 기준으로 PHP-FPM pool 생성
|
# Forbidden 방지 (권한 + welcome.conf 제거)
|
||||||
# 사용법: ./install_php.sh 8.2 또는 8.4
|
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
PHP_VERSION=$1
|
WEB_USER="$USER"
|
||||||
if [[ -z "$PHP_VERSION" ]]; then
|
WEB_HOME="$(eval echo "~$WEB_USER")"
|
||||||
echo "사용법: $0 <PHP_VERSION> (예: 8.2 또는 8.4)"
|
WEB_ROOT="/var/www/html"
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 지원 버전 확인
|
APACHE_CONF="/etc/httpd/conf.d/${WEB_USER}.conf"
|
||||||
if [[ ! "$PHP_VERSION" =~ ^(8\.[2-9]|9\.[0-9])$ ]]; then
|
PHP_CONF="/etc/httpd/conf.d/10-php-${WEB_USER}.conf"
|
||||||
echo "❌ 지원하지 않는 PHP 버전: $PHP_VERSION"
|
|
||||||
echo "지원 버전: 8.2, 8.3, 8.4, 9.0 이상"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 현재 사용자 계정 및 홈
|
########################################
|
||||||
WEB_USER=$USER
|
# 오류 발생 시 Apache 설정 롤백
|
||||||
WEB_HOME=$(eval echo "~$WEB_USER")
|
########################################
|
||||||
WEB_ROOT="$WEB_HOME/www"
|
|
||||||
|
|
||||||
# 오류 처리 함수
|
|
||||||
cleanup() {
|
cleanup() {
|
||||||
EXIT_CODE=$?
|
EXIT_CODE=$?
|
||||||
if [ $EXIT_CODE -ne 0 ]; then
|
if [ $EXIT_CODE -ne 0 ]; then
|
||||||
echo "❌ PHP 설치 중 에러 발생 ($EXIT_CODE)"
|
echo "❌ 오류 발생 ($EXIT_CODE) – Apache 설정 롤백"
|
||||||
echo "변경사항이 부분적으로 적용되었을 수 있습니다."
|
sudo rm -f "$APACHE_CONF"
|
||||||
echo "다시 실행하면 기존 설정을 덮어씁니다."
|
sudo rm -f "$PHP_CONF"
|
||||||
|
sudo systemctl restart httpd 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
exit $EXIT_CODE
|
exit $EXIT_CODE
|
||||||
}
|
}
|
||||||
|
|
||||||
trap cleanup EXIT
|
trap cleanup EXIT
|
||||||
|
|
||||||
echo "설치 사용자: $WEB_USER"
|
echo "▶ 설치 사용자 : $WEB_USER"
|
||||||
echo "웹 루트: $WEB_ROOT"
|
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이 이미 존재합니다."
|
sudo dnf -y update
|
||||||
read -p "기존 설정을 덮어쓰고 진행하시겠습니까? (y/n) " -n 1 -r
|
sudo dnf -y install \
|
||||||
echo
|
vim curl wget tar \
|
||||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
httpd vsftpd \
|
||||||
echo "설정 업데이트를 건너뜁니다."
|
policycoreutils-python-utils
|
||||||
exit 0
|
|
||||||
fi
|
########################################
|
||||||
echo "기존 pool 설정을 백업합니다..."
|
# firewalld 비활성화
|
||||||
sudo cp "$FPM_POOL" "${FPM_POOL}.bak.$(date +%s)"
|
########################################
|
||||||
|
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
|
fi
|
||||||
|
|
||||||
# Remi 저장소 설치 (이미 설치된 경우 재설치하지 않음)
|
########################################
|
||||||
if ! rpm -q remi-release 2>/dev/null; then
|
# 웹 루트 생성 및 권한 (403 방지 핵심)
|
||||||
echo "Remi 저장소 설치 중..."
|
########################################
|
||||||
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm || { echo "❌ Remi 저장소 설치 실패"; exit 1; }
|
sudo mkdir -p "$WEB_ROOT"
|
||||||
else
|
|
||||||
echo "ℹ️ Remi 저장소가 이미 설치되어 있습니다"
|
# 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
|
fi
|
||||||
|
|
||||||
# PHP 버전 설정
|
if [ ! -L "$WEB_HOME/www" ]; then
|
||||||
echo "PHP $PHP_VERSION 모듈 활성화 중..."
|
ln -s "$WEB_ROOT" "$WEB_HOME/www"
|
||||||
sudo dnf module reset php -y 2>/dev/null || true
|
echo "✓ ~/www → /var/www/html"
|
||||||
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
|
fi
|
||||||
PHP_INSTALLED=$(php -r 'echo phpversion();')
|
|
||||||
echo "✓ PHP $PHP_INSTALLED 설치 완료"
|
|
||||||
|
|
||||||
# PHP-FPM pool 생성 (사용자 계정 기준)
|
########################################
|
||||||
echo "PHP-FPM pool 설정 중..."
|
# 기본 index.html 생성 (없을 경우)
|
||||||
sudo bash -c "cat > $FPM_POOL" <<EOF
|
########################################
|
||||||
[$WEB_USER]
|
if [ ! -f "$WEB_ROOT/index.html" ] && [ ! -f "$WEB_ROOT/index.php" ]; then
|
||||||
user = $WEB_USER
|
sudo tee "$WEB_ROOT/index.html" >/dev/null <<EOF
|
||||||
group = $WEB_USER
|
<!DOCTYPE html>
|
||||||
listen = /run/php-fpm/$WEB_USER.sock
|
<html>
|
||||||
listen.owner = apache
|
<head>
|
||||||
listen.group = apache
|
<meta charset="utf-8">
|
||||||
pm = dynamic
|
<title>Rocky Linux Test Server</title>
|
||||||
pm.max_children = 10
|
</head>
|
||||||
pm.start_servers = 2
|
<body>
|
||||||
pm.min_spare_servers = 1
|
<h1>✅ Apache 정상 동작</h1>
|
||||||
pm.max_spare_servers = 5
|
<p>WebRoot: $WEB_ROOT</p>
|
||||||
chdir = $WEB_ROOT
|
</body>
|
||||||
php_value[display_errors] = Off
|
</html>
|
||||||
php_value[error_reporting] = E_ALL & ~E_DEPRECATED & ~E_STRICT
|
EOF
|
||||||
|
sudo chown apache:apache "$WEB_ROOT/index.html"
|
||||||
|
fi
|
||||||
|
|
||||||
|
########################################
|
||||||
|
# Apache VirtualHost
|
||||||
|
########################################
|
||||||
|
sudo tee "$APACHE_CONF" >/dev/null <<EOF
|
||||||
|
<VirtualHost *:80>
|
||||||
|
ServerAdmin webmaster@localhost
|
||||||
|
DocumentRoot $WEB_ROOT
|
||||||
|
|
||||||
|
<Directory $WEB_ROOT>
|
||||||
|
Options -Indexes +FollowSymLinks
|
||||||
|
AllowOverride All
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
ErrorLog /var/log/httpd/${WEB_USER}-error.log
|
||||||
|
CustomLog /var/log/httpd/${WEB_USER}-access.log combined
|
||||||
|
</VirtualHost>
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
echo "✓ PHP-FPM pool 설정 파일 생성 완료: $FPM_POOL"
|
########################################
|
||||||
|
# PHP 연동 설정 (php-fpm 설치 후 자동 활성)
|
||||||
|
########################################
|
||||||
|
sudo tee "$PHP_CONF" >/dev/null <<'EOF'
|
||||||
|
<IfModule proxy_fcgi_module>
|
||||||
|
<FilesMatch "\.php$">
|
||||||
|
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
|
||||||
|
</FilesMatch>
|
||||||
|
</IfModule>
|
||||||
|
EOF
|
||||||
|
|
||||||
# PHP-FPM 서비스 활성화 및 재시작
|
########################################
|
||||||
echo "PHP-FPM 서비스 재시작 중..."
|
# SELinux 컨텍스트 복구
|
||||||
sudo systemctl enable --now php-fpm 2>/dev/null || { echo "❌ PHP-FPM 활성화 실패"; exit 1; }
|
########################################
|
||||||
sudo systemctl restart php-fpm || { echo "❌ PHP-FPM 재시작 실패"; exit 1; }
|
sudo restorecon -Rv "$WEB_ROOT"
|
||||||
|
|
||||||
# 서비스 상태 확인
|
########################################
|
||||||
if ! sudo systemctl is-active --quiet php-fpm; then
|
# Apache / FTP 활성화
|
||||||
echo "❌ PHP-FPM 서비스가 실행 중이 아닙니다"
|
########################################
|
||||||
sudo systemctl status php-fpm
|
sudo systemctl enable --now httpd
|
||||||
exit 1
|
sudo systemctl enable --now vsftpd
|
||||||
fi
|
|
||||||
|
|
||||||
# Socket 파일 확인
|
########################################
|
||||||
SOCKET="/run/php-fpm/$WEB_USER.sock"
|
# SELinux - Apache/PHP 통합 허용
|
||||||
if [ ! -S "$SOCKET" ]; then
|
########################################
|
||||||
echo "❌ PHP-FPM socket 파일이 생성되지 않았습니다: $SOCKET"
|
sudo setsebool -P httpd_unified 1
|
||||||
exit 1
|
|
||||||
fi
|
########################################
|
||||||
|
# 완료 메시지
|
||||||
|
########################################
|
||||||
|
IP_ADDR=$(hostname -I | awk '{print $1}')
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "✅ PHP $PHP_INSTALLED 설치 완료!"
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
echo "✅ 테스트 서버 설정 완료 (Forbidden 해결)"
|
||||||
echo "✓ PHP-FPM pool: $FPM_POOL"
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||||
echo "✓ PHP-FPM socket: $SOCKET"
|
echo "✔ WebRoot : $WEB_ROOT"
|
||||||
|
echo "✔ Welcome 페이지 제거됨"
|
||||||
|
echo "✔ Apache 접근 권한 정상"
|
||||||
echo ""
|
echo ""
|
||||||
echo "📋 다음 단계:"
|
echo "🌐 접속 주소"
|
||||||
echo " 1. Apache 재시작: sudo systemctl restart httpd"
|
echo " http://$IP_ADDR/"
|
||||||
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 ""
|
||||||
echo "=== PHP $PHP_VERSION 설치 완료! ==="
|
echo "📄 로그"
|
||||||
echo "✓ PHP-FPM 풀: $WEB_USER"
|
echo " /var/log/httpd/${WEB_USER}-access.log"
|
||||||
echo "✓ PHP-FPM 소켓: /run/php-fpm/$WEB_USER.sock"
|
echo " /var/log/httpd/${WEB_USER}-error.log"
|
||||||
echo ""
|
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 # 에러 로그 확인"
|
|
||||||
|
|||||||
Reference in New Issue
Block a user