diff --git a/install.sh b/install.sh index 3342d7e..5b2963e 100644 --- a/install.sh +++ b/install.sh @@ -424,7 +424,7 @@ proceed_with_installation() { fi log_success "PHP 8.3 и расширения установлены" - log_step "Настройка Apache и модулей..." +log_step "Настройка Apache и модулей..." if [ "$DISTRO_FAMILY" = "debian" ]; then a2enmod php8.3 rewrite ssl headers expires deflate >/dev/null 2>&1 @@ -441,76 +441,103 @@ proceed_with_installation() { APACHE_CONF="/etc/httpd/conf.d/altcor.conf" WEBSERVER_USER="apache" - # НЕ ЗАГРУЖАЕМ mod_php - используем PHP-FPM! - # Удаляем старые конфигурации PHP - rm -f /etc/httpd/conf.d/php.conf - - cat > "/etc/httpd/conf.d/php-fpm.conf" << 'EOF' -# PHP-FPM configuration for Apache -# НЕ загружаем mod_php - используем PHP-FPM через ProxyPass - -# Включаем нужные модули (без mod_php) -LoadModule rewrite_module modules/mod_rewrite.so -LoadModule headers_module modules/mod_headers.so -LoadModule expires_module modules/mod_expires.so -LoadModule deflate_module modules/mod_deflate.so -LoadModule proxy_module modules/mod_proxy.so -LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so - -# Обработка PHP через PHP-FPM - - SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost" - - -# Альтернативный способ через TCP (если Unix socket не работает) -# -# SetHandler "proxy:fcgi://127.0.0.1:9000" -# -EOF + # Отключаем старые конфигурации PHP и mod_php + rm -f /etc/httpd/conf.d/php.conf /etc/httpd/conf.modules.d/*php*.conf + + # Определяем, какой PHP-FPM сервис и путь к конфигурации использовать + if [ -f "/etc/opt/remi/php83/php-fpm.d/www.conf" ]; then + PHP_FPM_CONF="/etc/opt/remi/php83/php-fpm.d/www.conf" + PHP_FPM_SERVICE="php83-php-fpm" + SOCKET_PATH="/var/opt/remi/php83/run/php-fpm/www.sock" + elif [ -f "/etc/php-fpm.d/www.conf" ]; then + PHP_FPM_CONF="/etc/php-fpm.d/www.conf" + PHP_FPM_SERVICE="php-fpm" + SOCKET_PATH="/run/php-fpm/www.sock" else - # Для Rocky Linux/CentOS/RHEL с Remi - # Проверяем доступные PHP модули - if [ -f "/etc/opt/remi/php83/php.ini" ]; then - # Remi PHP 8.3 - cat > "/etc/httpd/conf.d/php.conf" << 'EOF' -# PHP 8.3 from Remi repository -LoadModule php_module modules/libphp83.so + log_error "Не найден конфигурационный файл PHP-FPM" + exit 1 + fi - - SetHandler application/x-httpd-php - + # Создаем конфигурацию только для PHP-FPM (без mod_php) + cat > "/etc/httpd/conf.d/php-fpm.conf" << 'EOF' +# PHP-FPM configuration for Apache +# ВАЖНО: НЕ загружаем mod_php - используем только PHP-FPM -# Enable useful modules -LoadModule rewrite_module modules/mod_rewrite.so -LoadModule headers_module modules/mod_headers.so -LoadModule expires_module modules/mod_expires.so -LoadModule deflate_module modules/mod_deflate.so -EOF - else - # Стандартный PHP - cat > "/etc/httpd/conf.d/php.conf" << 'EOF' -# Standard PHP configuration - - LoadModule php_module modules/libphp.so +# Базовые модули Apache (проверяем, не загружены ли уже) + + LoadModule rewrite_module modules/mod_rewrite.so + + + LoadModule headers_module modules/mod_headers.so + + + LoadModule expires_module modules/mod_expires.so + + + LoadModule deflate_module modules/mod_deflate.so + + + LoadModule proxy_module modules/mod_proxy.so + + + LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so +# Обработка PHP файлов через PHP-FPM - SetHandler application/x-httpd-php + SetHandler "proxy:unix:SOCKET_PATH_PLACEHOLDER|fcgi://localhost" -# Enable useful modules -LoadModule rewrite_module modules/mod_rewrite.so -LoadModule headers_module modules/mod_headers.so -LoadModule expires_module modules/mod_expires.so -LoadModule deflate_module modules/mod_deflate.so +# Настройки директивы для улучшения производительности +ProxyTimeout 300 +ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:SOCKET_PATH_PLACEHOLDER|fcgi://localhost/var/www/html/ EOF - fi - fi - cat > "/etc/httpd/conf.d/altcor.conf" << 'EOF' + # Заменяем плейсхолдер на реальный путь к сокету + sed -i "s|SOCKET_PATH_PLACEHOLDER|$SOCKET_PATH|g" "/etc/httpd/conf.d/php-fpm.conf" + + log_info "Настройка PHP-FPM..." + + # Создаем резервную копию конфигурации + cp "$PHP_FPM_CONF" "${PHP_FPM_CONF}.backup.$(date +%Y%m%d_%H%M%S)" + + # Настраиваем PHP-FPM pool + 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" + + # Настраиваем производительность PHP-FPM + 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" + + # Создаем директорию для socket + SOCKET_DIR=$(dirname "$SOCKET_PATH") + mkdir -p "$SOCKET_DIR" + chown apache:apache "$SOCKET_DIR" + + # Запускаем и включаем PHP-FPM + systemctl start $PHP_FPM_SERVICE >/dev/null 2>&1 + systemctl enable $PHP_FPM_SERVICE >/dev/null 2>&1 + + if ! systemctl is-active --quiet $PHP_FPM_SERVICE; then + log_error "PHP-FPM не удалось запустить" + systemctl status $PHP_FPM_SERVICE --no-pager -l + exit 1 + fi + + log_success "PHP-FPM настроен и запущен" + fi + + cat > "/etc/httpd/conf.d/altcor.conf" << 'EOF' # Altcor main configuration -# Отключаем ServerTokens и ServerSignature для безопасности +# Отключаем информацию о сервере для безопасности ServerTokens Prod ServerSignature Off @@ -523,34 +550,55 @@ ServerSignature Off # Настройки сжатия SetOutputFilter DEFLATE + # Исключаем уже сжатые файлы SetEnvIfNoCase Request_URI \ - \.(?:gif|jpe?g|png)$ no-gzip dont-vary - SetEnvIfNoCase Request_URI \ - \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary + \.(?:gif|jpe?g|png|ico|exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary + # Исключаем старые браузеры + SetEnvIfNoCase User-Agent "^Mozilla/4\.0[678]" no-gzip + SetEnvIfNoCase User-Agent "^Mozilla/4\.[0678]" no-gzip + SetEnvIfNoCase User-Agent "MSIE [1-6]\." no-gzip - # Кэширование + # Кэширование статических ресурсов ExpiresActive On + # Изображения ExpiresByType image/jpg "access plus 1 month" ExpiresByType image/jpeg "access plus 1 month" ExpiresByType image/gif "access plus 1 month" ExpiresByType image/png "access plus 1 month" ExpiresByType image/svg+xml "access plus 1 month" + ExpiresByType image/webp "access plus 1 month" + ExpiresByType image/ico "access plus 1 month" + ExpiresByType image/x-icon "access plus 1 month" + # CSS и JS ExpiresByType text/css "access plus 1 month" ExpiresByType application/javascript "access plus 1 month" ExpiresByType text/javascript "access plus 1 month" + # Шрифты + ExpiresByType font/woff "access plus 1 month" + ExpiresByType font/woff2 "access plus 1 month" + ExpiresByType font/ttf "access plus 1 month" + ExpiresByType font/otf "access plus 1 month" + # HTML и PHP - без кэширования + ExpiresByType text/html "access plus 0 seconds" + ExpiresByType application/x-httpd-php "access plus 0 seconds" # Заголовки безопасности Header always set X-Content-Type-Options nosniff - Header always set X-Frame-Options DENY + Header always set X-Frame-Options SAMEORIGIN Header always set X-XSS-Protection "1; mode=block" + Header always set Referrer-Policy "strict-origin-when-cross-origin" + # Добавляем заголовки кэширования для статических файлов + + Header set Cache-Control "public, max-age=2592000" + -# Запрет доступа к конфигурационным файлам +# Запрет доступа к служебным файлам Require all denied @@ -562,48 +610,43 @@ ServerSignature Off Require all denied + + + Require all denied + + +# Запрет доступа к директориям .git и подобным + + Require all denied + + +# Дополнительная защита от выполнения скриптов в uploads + + + Require all denied + + + Require all denied + + + Require all denied + + + Require all denied + + + Require all denied + + + Require all denied + + + Require all denied + + EOF fi - - log_info "Настройка PHP-FPM..." - # Определяем путь к конфигурации PHP-FPM - if [ -f "/etc/opt/remi/php83/php-fpm.d/www.conf" ]; then - PHP_FPM_CONF="/etc/opt/remi/php83/php-fpm.d/www.conf" - PHP_FPM_SERVICE="php83-php-fpm" - elif [ -f "/etc/php-fpm.d/www.conf" ]; then - PHP_FPM_CONF="/etc/php-fpm.d/www.conf" - PHP_FPM_SERVICE="php-fpm" - else - log_error "Не найден конфигурационный файл PHP-FPM" - exit 1 - fi - - # Настраиваем PHP-FPM pool - cp "$PHP_FPM_CONF" "${PHP_FPM_CONF}.backup.$(date +%Y%m%d_%H%M%S)" - - # Настройки для работы с Apache - sed -i 's/;*listen = .*/listen = \/run\/php-fpm\/www.sock/' "$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 - mkdir -p /run/php-fpm - chown apache:apache /run/php-fpm - - # Запускаем и включаем PHP-FPM - systemctl start $PHP_FPM_SERVICE >/dev/null 2>&1 - systemctl enable $PHP_FPM_SERVICE >/dev/null 2>&1 - - if ! systemctl is-active --quiet $PHP_FPM_SERVICE; then - log_error "PHP-FPM не удалось запустить" - exit 1 - fi - - log_success "PHP-FPM настроен и запущен" log_success "Модули Apache настроены" log_step "Создание конфигурации виртуального хоста..."