This commit is contained in:
2025-08-11 04:12:19 +03:00
parent 4ec54ba5eb
commit c61ccf799b

View File

@@ -424,7 +424,7 @@ proceed_with_installation() {
fi fi
log_success "PHP 8.3 и расширения установлены" log_success "PHP 8.3 и расширения установлены"
log_step "Настройка Apache и модулей..." log_step "Настройка Apache и модулей..."
if [ "$DISTRO_FAMILY" = "debian" ]; then if [ "$DISTRO_FAMILY" = "debian" ]; then
a2enmod php8.3 rewrite ssl headers expires deflate >/dev/null 2>&1 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" APACHE_CONF="/etc/httpd/conf.d/altcor.conf"
WEBSERVER_USER="apache" WEBSERVER_USER="apache"
# НЕ ЗАГРУЖАЕМ mod_php - используем PHP-FPM! # Отключаем старые конфигурации PHP и mod_php
# Удаляем старые конфигурации PHP rm -f /etc/httpd/conf.d/php.conf /etc/httpd/conf.modules.d/*php*.conf
rm -f /etc/httpd/conf.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
log_error "Не найден конфигурационный файл PHP-FPM"
exit 1
fi
# Создаем конфигурацию только для PHP-FPM (без mod_php)
cat > "/etc/httpd/conf.d/php-fpm.conf" << 'EOF' cat > "/etc/httpd/conf.d/php-fpm.conf" << 'EOF'
# PHP-FPM configuration for Apache # PHP-FPM configuration for Apache
# НЕ загружаем mod_php - используем PHP-FPM через ProxyPass # ВАЖНО: НЕ загружаем mod_php - используем только PHP-FPM
# Включаем нужные модули (без mod_php) # Базовые модули Apache (проверяем, не загружены ли уже)
LoadModule rewrite_module modules/mod_rewrite.so <IfModule !mod_rewrite.c>
LoadModule headers_module modules/mod_headers.so LoadModule rewrite_module modules/mod_rewrite.so
LoadModule expires_module modules/mod_expires.so </IfModule>
LoadModule deflate_module modules/mod_deflate.so <IfModule !mod_headers.c>
LoadModule proxy_module modules/mod_proxy.so LoadModule headers_module modules/mod_headers.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so </IfModule>
<IfModule !mod_expires.c>
# Обработка PHP через PHP-FPM LoadModule expires_module modules/mod_expires.so
<FilesMatch \.php$> </IfModule>
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost" <IfModule !mod_deflate.c>
</FilesMatch> LoadModule deflate_module modules/mod_deflate.so
</IfModule>
# Альтернативный способ через TCP (если Unix socket не работает) <IfModule !mod_proxy.c>
# <FilesMatch \.php$> LoadModule proxy_module modules/mod_proxy.so
# SetHandler "proxy:fcgi://127.0.0.1:9000" </IfModule>
# </FilesMatch> <IfModule !mod_proxy_fcgi.c>
EOF LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
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
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
# 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
<IfModule !mod_php.c>
LoadModule php_module modules/libphp.so
</IfModule> </IfModule>
# Обработка PHP файлов через PHP-FPM
<FilesMatch \.php$> <FilesMatch \.php$>
SetHandler application/x-httpd-php SetHandler "proxy:unix:SOCKET_PATH_PLACEHOLDER|fcgi://localhost"
</FilesMatch> </FilesMatch>
# Enable useful modules # Настройки директивы для улучшения производительности
LoadModule rewrite_module modules/mod_rewrite.so ProxyTimeout 300
LoadModule headers_module modules/mod_headers.so ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:SOCKET_PATH_PLACEHOLDER|fcgi://localhost/var/www/html/
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
EOF 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 fi
log_success "PHP-FPM настроен и запущен"
fi fi
cat > "/etc/httpd/conf.d/altcor.conf" << 'EOF' cat > "/etc/httpd/conf.d/altcor.conf" << 'EOF'
# Altcor main configuration # Altcor main configuration
# Отключаем ServerTokens и ServerSignature для безопасности # Отключаем информацию о сервере для безопасности
ServerTokens Prod ServerTokens Prod
ServerSignature Off ServerSignature Off
@@ -523,34 +550,55 @@ ServerSignature Off
# Настройки сжатия # Настройки сжатия
<IfModule mod_deflate.c> <IfModule mod_deflate.c>
SetOutputFilter DEFLATE SetOutputFilter DEFLATE
# Исключаем уже сжатые файлы
SetEnvIfNoCase Request_URI \ SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary \.(?:gif|jpe?g|png|ico|exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \ # Исключаем старые браузеры
\.(?: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
</IfModule> </IfModule>
# Кэширование # Кэширование статических ресурсов
<IfModule mod_expires.c> <IfModule mod_expires.c>
ExpiresActive On ExpiresActive On
# Изображения
ExpiresByType image/jpg "access plus 1 month" ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month" ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month" ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month" ExpiresByType image/png "access plus 1 month"
ExpiresByType image/svg+xml "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 text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month" ExpiresByType application/javascript "access plus 1 month"
ExpiresByType text/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"
</IfModule> </IfModule>
# Заголовки безопасности # Заголовки безопасности
<IfModule mod_headers.c> <IfModule mod_headers.c>
Header always set X-Content-Type-Options nosniff 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 X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Добавляем заголовки кэширования для статических файлов
<FilesMatch "\.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|otf)$">
Header set Cache-Control "public, max-age=2592000"
</FilesMatch>
</IfModule> </IfModule>
</Directory> </Directory>
# Запрет доступа к конфигурационным файлам # Запрет доступа к служебным файлам
<Files "*.conf"> <Files "*.conf">
Require all denied Require all denied
</Files> </Files>
@@ -562,48 +610,43 @@ ServerSignature Off
<Files ".env"> <Files ".env">
Require all denied Require all denied
</Files> </Files>
<Files "*.log">
Require all denied
</Files>
# Запрет доступа к директориям .git и подобным
<DirectoryMatch "^\.|\/\.">
Require all denied
</DirectoryMatch>
# Дополнительная защита от выполнения скриптов в uploads
<Directory "/var/www/html/uploads">
<Files "*.php">
Require all denied
</Files>
<Files "*.phtml">
Require all denied
</Files>
<Files "*.pl">
Require all denied
</Files>
<Files "*.py">
Require all denied
</Files>
<Files "*.jsp">
Require all denied
</Files>
<Files "*.asp">
Require all denied
</Files>
<Files "*.sh">
Require all denied
</Files>
</Directory>
EOF EOF
fi 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_success "Модули Apache настроены"
log_step "Создание конфигурации виртуального хоста..." log_step "Создание конфигурации виртуального хоста..."