From 01637e7778770403714f62e2162b9810099604bb Mon Sep 17 00:00:00 2001 From: hosh1 Date: Mon, 11 Aug 2025 07:12:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=84=D0=B8=D0=BA=D1=81=20=D0=B4=D0=BB=D1=8F=20fpm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fix_php_fpm.sh | 176 +++++++++++++++++++++++++++++++++++++++ install.sh | 219 +++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 359 insertions(+), 36 deletions(-) create mode 100644 fix_php_fpm.sh diff --git a/fix_php_fpm.sh b/fix_php_fpm.sh new file mode 100644 index 0000000..39c5c0b --- /dev/null +++ b/fix_php_fpm.sh @@ -0,0 +1,176 @@ +#!/bin/bash + +# Быстрое исправление проблемы с PHP-FPM +# Запустите этот скрипт после неудачной установки + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +log_info() { echo -e "${BLUE}[Инфо]${NC} $1"; } +log_success() { echo -e "${GREEN}[Успех]${NC} $1"; } +log_error() { echo -e "${RED}[Ошибка]${NC} $1"; } +log_warning() { echo -e "${YELLOW}[Предупреждение]${NC} $1"; } + +echo "=== Диагностика и исправление PHP-FPM ===" + +# Проверяем установленные PHP пакеты +log_info "Установленные PHP пакеты:" +rpm -qa | grep -E "php[0-9]*" | sort + +# Проверяем доступные сервисы +log_info "Доступные PHP-FPM сервисы:" +systemctl list-unit-files | grep php-fpm + +# Останавливаем все PHP-FPM сервисы +log_info "Остановка всех PHP-FPM сервисов..." +for service in php-fpm php83-php-fpm php82-php-fpm php81-php-fpm php80-php-fpm php74-php-fpm php84-php-fpm php85-php-fpm; do + systemctl stop "$service" 2>/dev/null && log_info "Остановлен: $service" || true + systemctl disable "$service" 2>/dev/null || true +done + +# Определяем правильный сервис PHP 8.3 +if systemctl list-unit-files | grep -q "php83-php-fpm.service"; then + PHP_FPM_SERVICE="php83-php-fpm" + PHP_FPM_CONF="/etc/opt/remi/php83/php-fpm.d/www.conf" + SOCKET_PATH="/var/opt/remi/php83/run/php-fpm/www.sock" + log_info "Используем: php83-php-fpm (Remi)" +elif systemctl list-unit-files | grep -q "php-fpm.service"; then + PHP_FPM_SERVICE="php-fpm" + PHP_FPM_CONF="/etc/php-fpm.d/www.conf" + SOCKET_PATH="/run/php-fpm/www.sock" + log_info "Используем: php-fpm (стандартный)" +else + log_error "PHP-FPM сервис не найден!" + exit 1 +fi + +# Проверяем конфигурацию +if [ ! -f "$PHP_FPM_CONF" ]; then + log_error "Конфигурационный файл не найден: $PHP_FPM_CONF" + + # Ищем альтернативные конфигурации + log_info "Поиск конфигурационных файлов..." + find /etc -name "www.conf" -type f 2>/dev/null | grep php-fpm + + # Используем первый найденный + PHP_FPM_CONF=$(find /etc -name "www.conf" -type f 2>/dev/null | grep php-fpm | head -1) + + if [ -f "$PHP_FPM_CONF" ]; then + log_success "Найден конфигурационный файл: $PHP_FPM_CONF" + # Обновляем путь к сокету + SOCKET_PATH=$(dirname "$(dirname "$PHP_FPM_CONF")")/run/php-fpm/www.sock + else + log_error "Конфигурационный файл не найден" + exit 1 + fi +fi + +# Создаем резервную копию и настраиваем +log_info "Настройка конфигурации PHP-FPM..." +cp "$PHP_FPM_CONF" "${PHP_FPM_CONF}.backup.$(date +%Y%m%d_%H%M%S)" + +# Настраиваем основные параметры +sed -i "s|;*listen = .*|listen = $SOCKET_PATH|" "$PHP_FPM_CONF" +sed -i 's/;*listen.owner = .*/listen.owner = apache/' "$PHP_FPM_CONF" +sed -i 's/;*listen.group = .*/listen.group = apache/' "$PHP_FPM_CONF" +sed -i 's/;*listen.mode = .*/listen.mode = 0660/' "$PHP_FPM_CONF" +sed -i 's/;*user = .*/user = apache/' "$PHP_FPM_CONF" +sed -i 's/;*group = .*/group = apache/' "$PHP_FPM_CONF" + +# Создаем директорию для сокета +socket_dir=$(dirname "$SOCKET_PATH") +mkdir -p "$socket_dir" +chown apache:apache "$socket_dir" +chmod 755 "$socket_dir" + +# Запускаем сервис +log_info "Запуск $PHP_FPM_SERVICE..." +if systemctl start "$PHP_FPM_SERVICE"; then + log_success "$PHP_FPM_SERVICE запущен успешно" + systemctl enable "$PHP_FPM_SERVICE" + + # Проверяем создание сокета + sleep 3 + if [ -S "$SOCKET_PATH" ]; then + log_success "Сокет создан: $SOCKET_PATH" + chown apache:apache "$SOCKET_PATH" + else + log_warning "Сокет не создан, проверяем статус..." + systemctl status "$PHP_FPM_SERVICE" --no-pager + fi +else + log_error "Не удалось запустить $PHP_FPM_SERVICE" + systemctl status "$PHP_FPM_SERVICE" --no-pager + exit 1 +fi + +# Обновляем конфигурацию Apache +log_info "Обновление конфигурации Apache..." + +cat > /etc/httpd/conf.d/php-fpm.conf << EOF +# PHP-FPM configuration for Apache + + LoadModule proxy_module modules/mod_proxy.so + + + LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so + + +# Обработка PHP файлов через PHP-FPM + + SetHandler "proxy:unix:$SOCKET_PATH|fcgi://localhost" + + +# Настройки производительности +ProxyTimeout 300 +EOF + +# Тестируем конфигурацию Apache +log_info "Тестирование конфигурации Apache..." +if httpd -t; then + log_success "Конфигурация Apache корректна" +else + log_error "Ошибка в конфигурации Apache" +fi + +# Перезапускаем Apache +log_info "Перезапуск Apache..." +if systemctl restart httpd; then + log_success "Apache перезапущен" +else + log_error "Не удалось перезапустить Apache" +fi + +# Финальная проверка +log_info "Финальная проверка сервисов..." +echo "--- Статус PHP-FPM ---" +systemctl status "$PHP_FPM_SERVICE" --no-pager +echo "--- Статус Apache ---" +systemctl status httpd --no-pager + +# Проверяем PHP +log_info "Проверка PHP..." +if command -v php >/dev/null 2>&1; then + php_version=$(php -v | head -1) + log_success "PHP работает: $php_version" +else + log_warning "PHP не найден в PATH, проверяем php83..." + if /opt/remi/php83/root/usr/bin/php -v >/dev/null 2>&1; then + php_version=$(/opt/remi/php83/root/usr/bin/php -v | head -1) + log_success "PHP 8.3 найден: $php_version" + + # Создаем символическую ссылку + ln -sf /opt/remi/php83/root/usr/bin/php /usr/bin/php + log_info "Создана символическая ссылка для PHP" + fi +fi + +echo "" +log_success "Исправление завершено!" +echo "" +echo "Проверьте работу сайта: http://localhost/" +echo "Логи PHP-FPM: /var/opt/remi/php83/log/php-fpm/ или /var/log/php-fpm/" +echo "Логи Apache: /var/log/httpd/" \ No newline at end of file diff --git a/install.sh b/install.sh index e7433c4..c6233ff 100644 --- a/install.sh +++ b/install.sh @@ -359,6 +359,7 @@ remove_old_packages() { if [ "$DISTRO_FAMILY" = "debian" ]; then export DEBIAN_FRONTEND=noninteractive + # Удаление старых версий MariaDB for db_package in mariadb-server mysql-server; do for version in "" "-10.3" "-10.5" "-10.6" "-10.11" "-5.7" "-8.0"; do echo "${db_package}${version} mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true @@ -370,10 +371,50 @@ remove_old_packages() { apt remove --purge -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" mariadb* mysql* 2>/dev/null || true apt autoremove -y 2>/dev/null || true else - $PKG_MANAGER remove -y nginx php php7* php80* php81* php82* mariadb* mysql* 2>/dev/null || true + # Для RHEL семейства - удаляем только ненужные версии PHP + log_info "Очистка конфликтующих пакетов PHP..." + + # Останавливаем все PHP-FPM сервисы перед удалением + for service in php-fpm php74-php-fpm php80-php-fpm php81-php-fpm php82-php-fpm php84-php-fpm php85-php-fpm; do + systemctl stop "$service" 2>/dev/null || true + systemctl disable "$service" 2>/dev/null || true + done + + # Удаляем ненужные версии PHP, оставляем только php83 + $PKG_MANAGER remove -y nginx 2>/dev/null || true + $PKG_MANAGER remove -y php php7* php80* php81* php82* php84* php85* 2>/dev/null || true + $PKG_MANAGER remove -y mariadb* mysql* 2>/dev/null || true + + # Очищаем конфигурации + rm -rf /etc/php-fpm.d/*.conf.rpmsave /etc/opt/remi/php*/php-fpm.d/*.conf.rpmsave 2>/dev/null || true fi + # Общая очистка rm -rf /var/lib/mysql* /etc/mysql* /var/log/mysql* /etc/my.cnf* 2>/dev/null || true + + log_success "Очистка пакетов завершена" +} + +diagnose_php_fpm() { + log_info "Диагностика PHP-FPM..." + + echo "=== Установленные PHP пакеты ===" | tee -a "$LOG_FILE" + rpm -qa | grep -E "php[0-9]*" | sort | tee -a "$LOG_FILE" + + echo "=== Доступные PHP-FPM сервисы ===" | tee -a "$LOG_FILE" + systemctl list-unit-files | grep php-fpm | tee -a "$LOG_FILE" + + echo "=== Статус PHP сервисов ===" | tee -a "$LOG_FILE" + for service in php-fpm php83-php-fpm php82-php-fpm php81-php-fpm php80-php-fpm; do + if systemctl list-unit-files | grep -q "${service}.service"; then + echo "--- $service ---" | tee -a "$LOG_FILE" + systemctl status "$service" --no-pager -l | tee -a "$LOG_FILE" + fi + done + + echo "=== Конфигурационные файлы PHP-FPM ===" | tee -a "$LOG_FILE" + find /etc -name "*php-fpm*" -type f 2>/dev/null | tee -a "$LOG_FILE" + find /etc/opt/remi -name "*php-fpm*" -type f 2>/dev/null | tee -a "$LOG_FILE" } install_mariadb() { @@ -411,22 +452,45 @@ install_php83() { export DEBIAN_FRONTEND=noninteractive local php_packages="php8.3 php8.3-cli php8.3-common php8.3-mysql php8.3-curl php8.3-gd php8.3-mbstring php8.3-xml php8.3-zip php8.3-opcache php8.3-intl php8.3-bcmath php8.3-json php8.3-readline libapache2-mod-php8.3" else - if $PKG_MANAGER list available | grep -q "php83-php\b"; then - local php_packages="php83-php php83-php-cli php83-php-common php83-php-mysqlnd php83-php-curl php83-php-gd php83-php-mbstring php83-php-xml php83-php-zip php83-php-opcache php83-php-intl php83-php-bcmath php83-php-json php83-php-fpm" - else - local php_packages="php php-cli php-common php-mysqlnd php-curl php-gd php-mbstring php-xml php-zip php-opcache php-intl php-bcmath php-json php-fpm" + # Для RHEL семейства устанавливаем только PHP 8.3 пакеты + local php_packages="php83-php php83-php-cli php83-php-common php83-php-mysqlnd php83-php-curl php83-php-gd php83-php-mbstring php83-php-xml php83-php-zip php83-php-opcache php83-php-intl php83-php-bcmath php83-php-json php83-php-fpm" + + # Убеждаемся, что включен правильный модуль + if command -v dnf >/dev/null 2>&1; then + dnf module reset php -y 2>/dev/null || true + dnf module install php:remi-8.3 -y 2>/dev/null || true fi fi - if ! $PKG_MANAGER install -y $php_packages >/dev/null 2>&1; then + log_info "Устанавливаем пакеты: $php_packages" + + if ! $PKG_MANAGER install -y $php_packages; then log_error "Не удалось установить PHP пакеты. Подробности в логе: $LOG_FILE" $PKG_MANAGER install -y $php_packages 2>&1 | tee -a "$LOG_FILE" exit 1 fi - if command -v php83 >/dev/null 2>&1 && [ ! -f /usr/bin/php ]; then - ln -sf /opt/remi/php83/root/usr/bin/php /usr/bin/php 2>/dev/null || true + # Для RHEL - создаем символические ссылки + if [ "$DISTRO_FAMILY" = "rhel" ]; then + # Создаем символические ссылки для php83 + if [ -f /opt/remi/php83/root/usr/bin/php ] && [ ! -f /usr/bin/php ]; then + ln -sf /opt/remi/php83/root/usr/bin/php /usr/bin/php + fi + + # Добавляем в PATH echo 'export PATH=/opt/remi/php83/root/usr/bin:$PATH' > /etc/profile.d/php83.sh + source /etc/profile.d/php83.sh 2>/dev/null || true + + # Устанавливаем переменные для PHP-FPM + PHP_FPM_SERVICE="php83-php-fpm" + PHP_FPM_CONF="/etc/opt/remi/php83/php-fpm.d/www.conf" + SOCKET_PATH="/var/opt/remi/php83/run/php-fpm/www.sock" + PHP_INI_PATH="/etc/opt/remi/php83/php.ini" + + log_info "Настроены пути для PHP 8.3:" + log_info " PHP: /opt/remi/php83/root/usr/bin/php" + log_info " PHP-FPM: $PHP_FPM_SERVICE" + log_info " Socket: $SOCKET_PATH" fi verify_php_installation @@ -465,9 +529,15 @@ verify_php_extensions() { local required_extensions="mysqli pdo_mysql curl gd mbstring xml zip opcache intl bcmath json" local missing_extensions="" + local php_cmd="php" + + # Для RHEL используем полный путь к php83 + if [ "$DISTRO_FAMILY" = "rhel" ] && [ -f /opt/remi/php83/root/usr/bin/php ]; then + php_cmd="/opt/remi/php83/root/usr/bin/php" + fi for ext in $required_extensions; do - if php -m 2>/dev/null | grep -q "^$ext$"; then + if $php_cmd -m 2>/dev/null | grep -q "^$ext$"; then log_success "Расширение $ext: установлено" else log_warning "Расширение $ext: НЕ найдено" @@ -478,6 +548,16 @@ verify_php_extensions() { if [ -n "$missing_extensions" ]; then log_warning "Попытка установки отсутствующих расширений:$missing_extensions" install_missing_php_extensions "$missing_extensions" + + # Повторная проверка после установки + log_info "Повторная проверка расширений..." + for ext in $missing_extensions; do + if $php_cmd -m 2>/dev/null | grep -q "^$ext$"; then + log_success "Расширение $ext: теперь установлено" + else + log_warning "Расширение $ext: все еще отсутствует" + fi + done fi } @@ -486,19 +566,32 @@ install_missing_php_extensions() { if [ "$DISTRO_FAMILY" = "debian" ]; then for ext in $missing_extensions; do - if [[ "$ext" =~ ^(mysqli|pdo_mysql)$ ]]; then - apt install -y php8.3-mysql 2>/dev/null || true - else - apt install -y "php8.3-$ext" 2>/dev/null || true - fi + case $ext in + mysqli|pdo_mysql) + apt install -y php8.3-mysql 2>/dev/null || true + ;; + opcache) + apt install -y php8.3-opcache 2>/dev/null || true + ;; + *) + apt install -y "php8.3-$ext" 2>/dev/null || true + ;; + esac done else + # Для RHEL используем пакеты php83 for ext in $missing_extensions; do - if [[ "$ext" =~ ^(mysqli|pdo_mysql)$ ]]; then - $PKG_MANAGER install -y php*-mysqlnd 2>/dev/null || true - else - $PKG_MANAGER install -y "php*-$ext" 2>/dev/null || true - fi + case $ext in + mysqli|pdo_mysql) + $PKG_MANAGER install -y php83-php-mysqlnd 2>/dev/null || true + ;; + opcache) + $PKG_MANAGER install -y php83-php-opcache 2>/dev/null || true + ;; + *) + $PKG_MANAGER install -y "php83-php-$ext" 2>/dev/null || true + ;; + esac done fi } @@ -583,46 +676,100 @@ EOF configure_php_fpm() { log_info "Настройка PHP-FPM..." - if [ -z "$PHP_FPM_CONF" ] || [ ! -f "$PHP_FPM_CONF" ]; then - PHP_FPM_CONF=$(find /etc/opt/remi/ -name www.conf 2>/dev/null | head -1) - if [ -z "$PHP_FPM_CONF" ]; then - PHP_FPM_CONF=$(find /etc/ -name www.conf 2>/dev/null | head -1) - fi - if [ -z "$PHP_FPM_CONF" ]; then - log_error "Файл конфигурации PHP-FPM не найден" - exit 1 + # Определяем правильный сервис PHP-FPM + if systemctl list-unit-files | grep -q "php83-php-fpm.service"; then + PHP_FPM_SERVICE="php83-php-fpm" + PHP_FPM_CONF="/etc/opt/remi/php83/php-fpm.d/www.conf" + SOCKET_PATH="/var/opt/remi/php83/run/php-fpm/www.sock" + PHP_INI_PATH="/etc/opt/remi/php83/php.ini" + elif systemctl list-unit-files | grep -q "php-fpm.service"; then + PHP_FPM_SERVICE="php-fpm" + PHP_FPM_CONF="/etc/php-fpm.d/www.conf" + SOCKET_PATH="/run/php-fpm/www.sock" + PHP_INI_PATH="/etc/php.ini" + else + log_error "PHP-FPM сервис не найден" + return 1 + fi + + log_info "Используется сервис: $PHP_FPM_SERVICE" + log_info "Конфигурация: $PHP_FPM_CONF" + + # Проверяем существование конфигурационного файла + if [ ! -f "$PHP_FPM_CONF" ]; then + log_error "Файл конфигурации PHP-FPM не найден: $PHP_FPM_CONF" + + # Ищем альтернативные пути + log_info "Поиск альтернативных конфигураций..." + for conf_path in "/etc/opt/remi/php83/php-fpm.d/www.conf" "/etc/php-fpm.d/www.conf" "/etc/opt/remi/php*/php-fpm.d/www.conf"; do + if [ -f "$conf_path" ]; then + PHP_FPM_CONF="$conf_path" + log_info "Найден конфигурационный файл: $PHP_FPM_CONF" + break + fi + done + + if [ ! -f "$PHP_FPM_CONF" ]; then + log_error "Конфигурационный файл PHP-FPM не найден" + return 1 fi fi + # Создаем резервную копию cp "$PHP_FPM_CONF" "${PHP_FPM_CONF}.backup.$(date +%Y%m%d_%H%M%S)" + # Настраиваем конфигурацию sed -i "s|;*listen = .*|listen = $SOCKET_PATH|" "$PHP_FPM_CONF" sed -i 's/;*listen.owner = .*/listen.owner = apache/' "$PHP_FPM_CONF" sed -i 's/;*listen.group = .*/listen.group = apache/' "$PHP_FPM_CONF" sed -i 's/;*listen.mode = .*/listen.mode = 0660/' "$PHP_FPM_CONF" sed -i 's/;*user = .*/user = apache/' "$PHP_FPM_CONF" sed -i 's/;*group = .*/group = apache/' "$PHP_FPM_CONF" - + + # Настройки производительности sed -i 's/;*pm = .*/pm = dynamic/' "$PHP_FPM_CONF" sed -i 's/;*pm.max_children = .*/pm.max_children = 50/' "$PHP_FPM_CONF" sed -i 's/;*pm.start_servers = .*/pm.start_servers = 5/' "$PHP_FPM_CONF" sed -i 's/;*pm.min_spare_servers = .*/pm.min_spare_servers = 5/' "$PHP_FPM_CONF" sed -i 's/;*pm.max_spare_servers = .*/pm.max_spare_servers = 35/' "$PHP_FPM_CONF" + # Создаем директорию для сокета local socket_dir=$(dirname "$SOCKET_PATH") mkdir -p "$socket_dir" - - chown apache:apache "$socket_dir" - chmod 775 "$socket_dir" chown apache:apache "$socket_dir" + chmod 755 "$socket_dir" - safe_execute "Запуск PHP-FPM" systemctl start "$PHP_FPM_SERVICE" - safe_execute "Включение PHP-FPM в автозагрузку" systemctl enable "$PHP_FPM_SERVICE" + # Останавливаем все PHP-FPM сервисы + log_info "Остановка всех PHP-FPM сервисов..." + for service in php-fpm php83-php-fpm php82-php-fpm php81-php-fpm php80-php-fpm php74-php-fpm; do + systemctl stop "$service" 2>/dev/null || true + systemctl disable "$service" 2>/dev/null || true + done - if ! systemctl is-active --quiet "$PHP_FPM_SERVICE"; then - log_error "PHP-FPM не удалось запустить" + # Запускаем нужный сервис + log_info "Запуск $PHP_FPM_SERVICE..." + if systemctl start "$PHP_FPM_SERVICE"; then + log_success "$PHP_FPM_SERVICE запущен" + systemctl enable "$PHP_FPM_SERVICE" + + # Проверяем создание сокета + local retry_count=0 + while [ ! -S "$SOCKET_PATH" ] && [ $retry_count -lt 10 ]; do + sleep 1 + ((retry_count++)) + done + + if [ -S "$SOCKET_PATH" ]; then + log_success "Сокет PHP-FPM создан: $SOCKET_PATH" + chown apache:apache "$SOCKET_PATH" + else + log_warning "Сокет PHP-FPM не создан, проверяем статус..." + systemctl status "$PHP_FPM_SERVICE" --no-pager -l | tee -a "$LOG_FILE" + fi + else + log_error "Не удалось запустить $PHP_FPM_SERVICE" systemctl status "$PHP_FPM_SERVICE" --no-pager -l | tee -a "$LOG_FILE" - exit 1 + return 1 fi }