From 73cc5c41972035b28bed51fdf37cde60f0ef43a5 Mon Sep 17 00:00:00 2001 From: hosh1 Date: Mon, 11 Aug 2025 09:14:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=84=D0=B8=D0=BA=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fix_php_fpm.sh | 351 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 238 insertions(+), 113 deletions(-) diff --git a/fix_php_fpm.sh b/fix_php_fpm.sh index 39c5c0b..ba45478 100644 --- a/fix_php_fpm.sh +++ b/fix_php_fpm.sh @@ -1,176 +1,301 @@ #!/bin/bash -# Быстрое исправление проблемы с PHP-FPM -# Запустите этот скрипт после неудачной установки +# Скрипт для диагностики и исправления ошибки 502 Bad Gateway +# Проблема: Apache не может связаться с PHP-FPM RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' +CYAN='\033[0;36m' 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"; } +log_step() { echo -e "${CYAN}[Шаг]${NC} $1"; } -echo "=== Диагностика и исправление PHP-FPM ===" +echo "==============================================================" +echo "Диагностика и исправление ошибки 502 Bad Gateway" +echo "==============================================================" -# Проверяем установленные PHP пакеты -log_info "Установленные PHP пакеты:" -rpm -qa | grep -E "php[0-9]*" | sort +# Функция проверки статуса сервиса +check_service() { + local service=$1 + if systemctl is-active --quiet "$service"; then + log_success "$service: работает" + return 0 + else + log_error "$service: не работает" + return 1 + fi +} -# Проверяем доступные сервисы -log_info "Доступные PHP-FPM сервисы:" -systemctl list-unit-files | grep php-fpm +# Шаг 1: Проверка статуса сервисов +log_step "Проверка статуса сервисов" +check_service "httpd" +check_service "php83-php-fpm" || check_service "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 сервис +if systemctl is-active --quiet php83-php-fpm; 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" + log_info "Используется: php83-php-fpm" +elif systemctl is-active --quiet php-fpm; 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 (стандартный)" + log_info "Используется: php-fpm" else - log_error "PHP-FPM сервис не найден!" + log_error "PHP-FPM не запущен!" exit 1 fi -# Проверяем конфигурацию -if [ ! -f "$PHP_FPM_CONF" ]; then - log_error "Конфигурационный файл не найден: $PHP_FPM_CONF" +# Шаг 2: Проверка сокета PHP-FPM +log_step "Проверка сокета PHP-FPM" +if [ -S "$SOCKET_PATH" ]; then + log_success "Сокет существует: $SOCKET_PATH" + ls -la "$SOCKET_PATH" - # Ищем альтернативные конфигурации - 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 + # Проверка прав доступа + if [ "$(stat -c %U:%G "$SOCKET_PATH")" = "apache:apache" ]; then + log_success "Права доступа к сокету корректны" 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" + log_warning "Неправильные права доступа к сокету" chown apache:apache "$SOCKET_PATH" - else - log_warning "Сокет не создан, проверяем статус..." - systemctl status "$PHP_FPM_SERVICE" --no-pager + chmod 660 "$SOCKET_PATH" + log_info "Права доступа исправлены" fi else - log_error "Не удалось запустить $PHP_FPM_SERVICE" - systemctl status "$PHP_FPM_SERVICE" --no-pager + log_error "Сокет не существует: $SOCKET_PATH" + + # Проверяем конфигурацию PHP-FPM + log_info "Проверка конфигурации PHP-FPM..." + if [ -f "$PHP_FPM_CONF" ]; then + grep "^listen" "$PHP_FPM_CONF" + fi + + log_info "Перезапуск PHP-FPM..." + systemctl restart "$PHP_FPM_SERVICE" + sleep 3 + + if [ -S "$SOCKET_PATH" ]; then + log_success "Сокет создан после перезапуска" + else + log_error "Сокет не создался, переходим к исправлению конфигурации" + fi +fi + +# Шаг 3: Проверка и исправление конфигурации PHP-FPM +log_step "Проверка конфигурации PHP-FPM" + +if [ -f "$PHP_FPM_CONF" ]; then + log_info "Конфигурационный файл: $PHP_FPM_CONF" + + # Создаем резервную копию + cp "$PHP_FPM_CONF" "${PHP_FPM_CONF}.backup.$(date +%Y%m%d_%H%M%S)" + + # Исправляем конфигурацию + log_info "Исправление конфигурации PHP-FPM..." + + # Убеждаемся что используется правильный сокет + sed -i "s|^listen = .*|listen = $SOCKET_PATH|" "$PHP_FPM_CONF" + 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" + + # Убираем возможные конфликты с TCP + sed -i 's|^listen = 127.0.0.1:9000|; listen = 127.0.0.1:9000|' "$PHP_FPM_CONF" + + log_success "Конфигурация PHP-FPM обновлена" + + # Показываем ключевые настройки + echo "--- Ключевые настройки PHP-FPM ---" + grep -E "^(listen|user|group)" "$PHP_FPM_CONF" | grep -v "^#" +else + log_error "Конфигурационный файл не найден: $PHP_FPM_CONF" exit 1 fi -# Обновляем конфигурацию Apache -log_info "Обновление конфигурации Apache..." +# Шаг 4: Проверка и исправление конфигурации Apache +log_step "Проверка конфигурации Apache" + +# Проверяем загрузку необходимых модулей +log_info "Проверка модулей Apache..." +if httpd -M 2>/dev/null | grep -q "proxy_module"; then + log_success "Модуль proxy загружен" +else + log_warning "Модуль proxy не загружен" +fi + +if httpd -M 2>/dev/null | grep -q "proxy_fcgi_module"; then + log_success "Модуль proxy_fcgi загружен" +else + log_warning "Модуль proxy_fcgi не загружен" +fi + +# Создаем правильную конфигурацию Apache для PHP-FPM +log_info "Создание конфигурации Apache для PHP-FPM..." 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 - + +# Загрузка необходимых модулей +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" -# Настройки производительности +# Альтернативный способ для всех .php файлов +ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:$SOCKET_PATH|fcgi://localhost/var/www/html/ + +# Настройки таймаутов ProxyTimeout 300 +ProxyPreserveHost On + +# Индексные файлы +DirectoryIndex index.php index.html + +# Логирование ошибок прокси +LogLevel proxy:trace1 EOF -# Тестируем конфигурацию Apache -log_info "Тестирование конфигурации Apache..." +# Также обновляем основную конфигурацию виртуального хоста +log_info "Обновление конфигурации виртуального хоста..." + +# Проверяем есть ли файл конфигурации altcor +if [ -f /etc/httpd/conf.d/altcor.conf ]; then + VHOST_CONF="/etc/httpd/conf.d/altcor.conf" +else + VHOST_CONF="/etc/httpd/conf.d/000-default.conf" +fi + +# Добавляем или обновляем секцию обработки PHP +if [ -f "$VHOST_CONF" ]; then + cp "$VHOST_CONF" "${VHOST_CONF}.backup.$(date +%Y%m%d_%H%M%S)" + + # Убираем старые настройки PHP + sed -i '/SetHandler application\/x-httpd-php/d' "$VHOST_CONF" + sed -i '/AddHandler php[0-9]*-script/d' "$VHOST_CONF" + + log_success "Основная конфигурация виртуального хоста обновлена" +fi + +# Шаг 5: Создание директории для сокета +log_step "Проверка директории сокета" +socket_dir=$(dirname "$SOCKET_PATH") +if [ ! -d "$socket_dir" ]; then + log_info "Создание директории: $socket_dir" + mkdir -p "$socket_dir" +fi + +chown apache:apache "$socket_dir" +chmod 755 "$socket_dir" +log_success "Директория сокета настроена: $socket_dir" + +# Шаг 6: Проверка SELinux (если активен) +if command -v getenforce >/dev/null 2>&1 && [ "$(getenforce)" = "Enforcing" ]; then + log_step "Настройка SELinux" + + log_info "SELinux включен, настраиваем политики..." + + # Разрешаем Apache подключаться к сокету PHP-FPM + setsebool -P httpd_can_network_connect 1 2>/dev/null || true + setsebool -P httpd_execmem 1 2>/dev/null || true + + # Устанавливаем правильный контекст для сокета + semanage fcontext -a -t httpd_var_run_t "$SOCKET_PATH" 2>/dev/null || true + restorecon -R "$(dirname "$SOCKET_PATH")" 2>/dev/null || true + + log_success "SELinux политики обновлены" +fi + +# Шаг 7: Тестирование конфигурации +log_step "Тестирование конфигурации Apache" if httpd -t; then log_success "Конфигурация Apache корректна" else - log_error "Ошибка в конфигурации Apache" + log_error "Ошибки в конфигурации Apache:" + httpd -t + exit 1 +fi + +# Шаг 8: Перезапуск сервисов в правильном порядке +log_step "Перезапуск сервисов" + +log_info "Перезапуск PHP-FPM..." +systemctl restart "$PHP_FPM_SERVICE" +sleep 3 + +if systemctl is-active --quiet "$PHP_FPM_SERVICE"; then + log_success "PHP-FPM перезапущен" +else + log_error "PHP-FPM не запустился" + systemctl status "$PHP_FPM_SERVICE" --no-pager + exit 1 fi -# Перезапускаем Apache log_info "Перезапуск Apache..." -if systemctl restart httpd; then +systemctl restart httpd +sleep 2 + +if systemctl is-active --quiet httpd; then log_success "Apache перезапущен" else - log_error "Не удалось перезапустить Apache" + log_error "Apache не запустился" + systemctl status httpd --no-pager + exit 1 fi -# Финальная проверка -log_info "Финальная проверка сервисов..." -echo "--- Статус PHP-FPM ---" -systemctl status "$PHP_FPM_SERVICE" --no-pager -echo "--- Статус Apache ---" -systemctl status httpd --no-pager +# Шаг 9: Финальная диагностика +log_step "Финальная проверка" -# Проверяем PHP -log_info "Проверка PHP..." -if command -v php >/dev/null 2>&1; then - php_version=$(php -v | head -1) - log_success "PHP работает: $php_version" +echo "--- Статус сервисов ---" +systemctl status httpd --no-pager -l | head -10 +systemctl status "$PHP_FPM_SERVICE" --no-pager -l | head -10 + +echo "--- Проверка сокета ---" +if [ -S "$SOCKET_PATH" ]; then + log_success "Сокет активен: $SOCKET_PATH" + ls -la "$SOCKET_PATH" 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 + log_error "Сокет не активен: $SOCKET_PATH" fi +echo "--- Тест PHP ---" +cat > /var/www/html/phpinfo.php << 'EOF' + +EOF + +log_info "Создан тестовый файл /var/www/html/phpinfo.php" + 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 +echo "Проверьте работу:" +echo "• http://62.109.14.183/phpinfo.php" +echo "• http://62.109.14.183/" +echo "" +echo "Логи для отладки:" +echo "• Apache: /var/log/httpd/error_log" +echo "• PHP-FPM: /var/opt/remi/php83/log/php-fpm/error.log" +echo "" +echo "Если проблема сохраняется, проверьте логи:" +echo "tail -f /var/log/httpd/error_log" \ No newline at end of file