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
}