This commit is contained in:
2025-08-09 23:29:05 +03:00
parent 45838a37b0
commit 07ea392c8a

View File

@@ -1,143 +1,219 @@
#!/bin/bash
# Исправленный скрипт для автоматической установки и настройки LEMP
# Скрипт для чистой установки и настройки LAMP (Apache, MariaDB, PHP 8.3)
set -e
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Функция для вывода сообщений
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# --- 1. ПРОВЕРКА СИСТЕМЫ И ПРАВ ---
log_info "Проверка прав доступа..."
if [[ $EUID -ne 0 ]]; then
echo "Ошибка: Запустите этот скрипт с правами суперпользователя (используйте sudo)."
log_error "Запустите этот скрипт с правами суперпользователя (используйте sudo)."
exit 1
fi
log_info "Определение операционной системы..."
if [ -f /etc/os-release ]; then
. /etc/os-release
DISTRO="$ID"
FAMILY="$ID_LIKE"
VERSION_ID="${VERSION_ID:-unknown}"
else
echo "Ошибка: Не удалось определить дистрибутив."
log_error "Не удалось определить дистрибутив."
exit 1
fi
echo "Определен дистрибутив: $DISTRO (Семейство: ${FAMILY:-$DISTRO}, Версия: $VERSION_ID)"
log_success "Определен дистрибутив: $DISTRO (Семейство: ${FAMILY:-$DISTRO}, Версия: $VERSION_ID)"
# --- 2. УСТАНОВКА ДЛЯ DEBIAN-ПОДОБНЫХ СИСТЕМ ---
if echo "$DISTRO $FAMILY" | grep -qi "debian\|ubuntu"; then
echo "Начало установки LEMP для Debian-подобной системы..."
apt update -y
apt install -y software-properties-common lsb-release ca-certificates curl wget gnupg2
# Добавление PPA ondrej/php для PHP 8.3
if ! apt-cache show php8.3-fpm &>/dev/null; then
echo "PHP 8.3 не найден. Добавляем PPA ondrej/php..."
CODENAME=$(lsb_release -sc)
if ! curl -fsSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /usr/share/keyrings/php-archive-keyring.gpg; then
echo "ОШИБКА: Не удалось загрузить GPG-ключ для репозитория PHP."
exit 1
fi
echo "deb [signed-by=/usr/share/keyrings/php-archive-keyring.gpg] https://packages.sury.org/php/ $CODENAME main" > /etc/apt/sources.list.d/php.list
apt update -y
fi
# Проверка доступности пакетов
if ! apt-cache show php8.3-fpm &>/dev/null; then
echo "ОШИБКА: PHP 8.3-FPM все еще недоступен. Установка невозможна."
exit 1
fi
echo "Установка пакетов: nginx, mariadb, redis, php-fpm..."
# Останавливаем Apache, если он запущен, и удаляем его
systemctl stop apache2 2>/dev/null || true
systemctl disable apache2 2>/dev/null || true
apt remove -y apache2 apache2-common apache2-utils 2>/dev/null || true
# Устанавливаем только нужные пакеты
apt install -y nginx mariadb-server redis-server libreoffice default-jre
# Устанавливаем PHP 8.3-FPM и расширения
PHP_PACKAGES="php8.3-fpm 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"
if ! apt install -y $PHP_PACKAGES; then
echo "ОШИБКА: Не удалось установить PHP 8.3-FPM и/или его расширения."
exit 1
fi
# Проверка установленной версии PHP
if systemctl is-active --quiet php8.3-fpm; then
INSTALLED_PHP_VERSION=$(php8.3 --version 2>/dev/null | head -n1 | grep -o "8\.3\.[0-9]*" || php --version 2>/dev/null | head -n1 | grep -o "8\.3\.[0-9]*" || echo "8.3.x")
echo "PHP 8.3 ($INSTALLED_PHP_VERSION) успешно установлен и запущен."
else
echo "ОШИБКА: PHP 8.3-FPM не запущен."
exit 1
fi
systemctl enable --now mariadb redis-server php8.3-fpm
else
echo "ОШИБКА: Ваш дистрибутив '$DISTRO' не поддерживается этим скриптом. Поддерживаются только Debian/Ubuntu."
# Проверка поддерживаемых дистрибутивов
if ! echo "$DISTRO $FAMILY" | grep -qi "debian\|ubuntu"; then
log_error "Ваш дистрибутив '$DISTRO' не поддерживается. Поддерживаются только Debian/Ubuntu."
exit 1
fi
# --- 3. НАСТРОЙКА NGINX ---
# --- 2. ОЧИСТКА СУЩЕСТВУЮЩИХ УСТАНОВОК ---
log_info "Очистка возможных предыдущих установок..."
# Останавливаем и удаляем конфликтующие сервисы
systemctl stop nginx apache2 php*-fpm 2>/dev/null || true
systemctl disable nginx 2>/dev/null || true
# Удаляем nginx, если установлен
apt remove -y nginx nginx-common nginx-core 2>/dev/null || true
# Удаляем старые версии PHP
apt remove -y php7.* php8.0* php8.1* php8.2* libapache2-mod-php7.* libapache2-mod-php8.0* libapache2-mod-php8.1* libapache2-mod-php8.2* 2>/dev/null || true
log_success "Очистка завершена."
# --- 3. ОБНОВЛЕНИЕ СИСТЕМЫ ---
log_info "Обновление списка пакетов..."
apt update -y
log_info "Установка базовых зависимостей..."
apt install -y software-properties-common lsb-release ca-certificates curl wget gnupg2 apt-transport-https
# --- 4. ДОБАВЛЕНИЕ РЕПОЗИТОРИЯ PHP 8.3 ---
log_info "Добавление репозитория для PHP 8.3..."
CODENAME=$(lsb_release -sc)
if ! curl -fsSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /usr/share/keyrings/php-archive-keyring.gpg; then
log_error "Не удалось загрузить GPG-ключ для репозитория PHP."
exit 1
fi
echo "deb [signed-by=/usr/share/keyrings/php-archive-keyring.gpg] https://packages.sury.org/php/ $CODENAME main" > /etc/apt/sources.list.d/php.list
log_info "Обновление списка пакетов с новым репозиторием..."
apt update -y
# --- 5. УСТАНОВКА LAMP КОМПОНЕНТОВ ---
log_info "Установка Apache2..."
apt install -y apache2
log_info "Установка MariaDB Server..."
apt install -y mariadb-server
log_info "Установка дополнительных пакетов..."
apt install -y redis-server libreoffice default-jre
log_info "Установка PHP 8.3 и модулей..."
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 libapache2-mod-php8.3"
if ! apt install -y $PHP_PACKAGES; then
log_error "Не удалось установить PHP 8.3 и/или его расширения."
exit 1
fi
# --- 6. НАСТРОЙКА APACHE ---
log_info "Настройка Apache..."
# Включаем необходимые модули
a2enmod php8.3 rewrite ssl headers expires deflate
# Отключаем старые модули PHP, если они были включены
for php_ver in 7.4 8.0 8.1 8.2; do
a2dismod php$php_ver 2>/dev/null || true
done
WEBROOT="/var/www/html"
echo "Корневая директория веб-сервера: $WEBROOT"
mkdir -p "$WEBROOT"
# Создание правильной конфигурации Nginx
NGINX_CONF="/etc/nginx/sites-available/default"
echo "Создание конфигурации Nginx в $NGINX_CONF..."
# Создание конфигурации виртуального хоста
APACHE_CONF="/etc/apache2/sites-available/000-default.conf"
log_info "Создание конфигурации Apache в $APACHE_CONF..."
cat > "$NGINX_CONF" <<EOF
server {
listen 80 default_server;
listen [::]:80 default_server;
cat > "$APACHE_CONF" <<EOF
<VirtualHost *:80>
DocumentRoot $WEBROOT
ServerName localhost
ServerAlias www.localhost
root $WEBROOT;
index index.php index.html index.htm;
server_name _;
<Directory $WEBROOT>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
# Основная обработка файлов
location / {
try_files \$uri \$uri/ =404;
}
# Включение сжатия
<IfModule mod_deflate.c>
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
</IfModule>
</Directory>
# Обработка PHP файлов через PHP-FPM
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
include fastcgi_params;
}
# Обработка PHP файлов
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
# Запрет доступа к .htaccess файлам
location ~ /\.ht {
deny all;
}
# Безопасность - защита конфигурационных файлов
<Files "*.conf">
Require all denied
</Files>
<Files "db_config.php">
Require all denied
</Files>
<Files ".htaccess">
Require all denied
</Files>
# Кэширование статических файлов
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
<IfModule mod_expires.c>
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 text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
</IfModule>
ErrorLog \${APACHE_LOG_DIR}/error.log
CustomLog \${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
EOF
# Проверка конфигурации Nginx
if ! nginx -t; then
echo "ОШИБКА: Конфигурация Nginx содержит ошибки."
exit 1
# --- 7. НАСТРОЙКА PHP ---
log_info "Настройка PHP 8.3 для Apache..."
PHP_INI_APACHE="/etc/php/8.3/apache2/php.ini"
if [ -f "$PHP_INI_APACHE" ]; then
# Создаем резервную копию
cp "$PHP_INI_APACHE" "${PHP_INI_APACHE}.backup.$(date +%Y%m%d_%H%M%S)"
# Настройки производительности и безопасности
sed -i 's/;*upload_max_filesize = .*/upload_max_filesize = 64M/' "$PHP_INI_APACHE"
sed -i 's/;*post_max_size = .*/post_max_size = 64M/' "$PHP_INI_APACHE"
sed -i 's/;*max_execution_time = .*/max_execution_time = 300/' "$PHP_INI_APACHE"
sed -i 's/;*memory_limit = .*/memory_limit = 256M/' "$PHP_INI_APACHE"
sed -i 's/;*max_input_vars = .*/max_input_vars = 3000/' "$PHP_INI_APACHE"
# Настройки OPcache
sed -i 's/;*opcache.enable=.*/opcache.enable=1/' "$PHP_INI_APACHE"
sed -i 's/;*opcache.enable_cli=.*/opcache.enable_cli=1/' "$PHP_INI_APACHE"
sed -i 's/;*opcache.memory_consumption=.*/opcache.memory_consumption=128/' "$PHP_INI_APACHE"
sed -i 's/;*opcache.revalidate_freq=.*/opcache.revalidate_freq=2/' "$PHP_INI_APACHE"
sed -i 's/;*opcache.max_accelerated_files=.*/opcache.max_accelerated_files=4000/' "$PHP_INI_APACHE"
# Настройки безопасности
sed -i 's/;*expose_php = .*/expose_php = Off/' "$PHP_INI_APACHE"
sed -i 's/;*display_errors = .*/display_errors = Off/' "$PHP_INI_APACHE"
sed -i 's/;*log_errors = .*/log_errors = On/' "$PHP_INI_APACHE"
log_success "PHP 8.3 настроен."
else
log_warning "Не найден файл конфигурации $PHP_INI_APACHE"
fi
# Убеждаемся, что PHP-FPM активен
systemctl enable --now php8.3-fpm
# --- 8. СОЗДАНИЕ ВЕБ-ФАЙЛОВ ---
# --- 4. СОЗДАНИЕ ВЕБ-ФАЙЛОВ ---
log_info "Создание веб-файлов..."
# Создаем db_config.php
cat > "$WEBROOT/db_config.php" << 'EOF'
@@ -152,7 +228,7 @@ define('DB_CHARSET', 'utf8mb4');
?>
EOF
# Создаем index.php (тот же код что и в оригинале)
# Создаем index.php
cat > "$WEBROOT/index.php" << 'EOF'
<?php
require_once __DIR__ . '/db_config.php';
@@ -190,53 +266,129 @@ $extensions = [
// Проверка статуса OPcache
$opcache_enabled = function_exists('opcache_get_status') && opcache_get_status(false)['opcache_enabled'];
// Информация о сервере
$server_info = $_SERVER['SERVER_SOFTWARE'] ?? 'Неизвестно';
$apache_version = apache_get_version() ?? 'Версия недоступна';
?>
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Статус сервера LEMP (Nginx + PHP 8.3)</title>
<title>Статус сервера LAMP (Apache + PHP 8.3)</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; background-color: #f4f7f9; color: #333; margin: 0; padding: 20px; }
.container { max-width: 800px; margin: auto; background: #fff; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.05); overflow: hidden; }
h1, h2 { padding: 20px 25px; margin: 0; background: #009639; color: #fff; }
h1 { font-size: 24px; }
h2 { font-size: 18px; background: #68a068; margin-top: 10px; }
.content { padding: 25px; }
.status { padding: 15px; margin-bottom: 15px; border-left: 5px solid; border-radius: 4px; }
.success { background-color: #e6fffa; border-color: #38b2ac; color: #234e52; }
.error { background-color: #fed7d7; border-color: #e53e3e; color: #742a2a; }
.info { background-color: #ebf8ff; border-color: #4299e1; color: #2a4365; }
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px; }
.grid-item { padding: 10px; border-radius: 4px; text-align: center; }
.ok { background: #c6f6d5; }
.missing { background: #fed7d7; }
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: #333;
margin: 0;
padding: 20px;
min-height: 100vh;
}
.container {
max-width: 900px;
margin: auto;
background: #fff;
border-radius: 12px;
box-shadow: 0 8px 32px rgba(0,0,0,0.1);
overflow: hidden;
}
h1, h2 {
padding: 20px 25px;
margin: 0;
background: linear-gradient(135deg, #d73502 0%, #f56500 100%);
color: #fff;
text-shadow: 0 1px 2px rgba(0,0,0,0.2);
}
h1 { font-size: 28px; }
h2 { font-size: 20px; background: linear-gradient(135deg, #e56b47 0%, #f78a65 100%); margin-top: 10px; }
.content { padding: 30px; }
.status {
padding: 20px;
margin-bottom: 20px;
border-left: 5px solid;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.05);
}
.success { background: linear-gradient(135deg, #e6fffa 0%, #b2f5ea 100%); border-color: #38b2ac; color: #234e52; }
.error { background: linear-gradient(135deg, #fed7d7 0%, #feb2b2 100%); border-color: #e53e3e; color: #742a2a; }
.info { background: linear-gradient(135deg, #ebf8ff 0%, #bee3f8 100%); border-color: #4299e1; color: #2a4365; }
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 15px;
margin-top: 15px;
}
.grid-item {
padding: 15px;
border-radius: 8px;
text-align: center;
font-weight: 500;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.ok { background: linear-gradient(135deg, #c6f6d5 0%, #9ae6b4 100%); color: #22543d; }
.missing { background: linear-gradient(135deg, #fed7d7 0%, #feb2b2 100%); color: #742a2a; }
strong { color: #2d3748; }
.server-badge {
display: inline-block;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 5px 12px;
border-radius: 15px;
font-size: 12px;
font-weight: bold;
margin-left: 10px;
}
</style>
</head>
<body>
<div class="container">
<h1>Статус сервера LEMP</h1>
<h1>🚀 Статус сервера LAMP <span class="server-badge">Apache + PHP 8.3</span></h1>
<div class="content">
<div class="status <?= $is_php83 ? 'success' : 'error' ?>"><strong>Версия PHP:</strong> <?= htmlspecialchars($php_version) ?> (<?= $is_php83 ? '✓ PHP 8.3' : '✗ НЕ PHP 8.3' ?>)</div>
<div class="status <?= $db_error ? 'error' : 'success' ?>"><strong>База данных:</strong> <?= htmlspecialchars($db_status) ?></div>
<div class="status <?= $opcache_enabled ? 'success' : 'error' ?>"><strong>OPcache:</strong> <?= $opcache_enabled ? '✓ Включен и работает' : '✗ Отключен или не загружен' ?></div>
<div class="status <?= $is_php83 ? 'success' : 'error' ?>">
<strong>🐘 Версия PHP:</strong> <?= htmlspecialchars($php_version) ?>
<?= $is_php83 ? '<strong style="color:#38b2ac;">✓ PHP 8.3 активен</strong>' : '<strong style="color:#e53e3e;">✗ НЕ PHP 8.3</strong>' ?>
</div>
<h2>Расширения PHP</h2>
<div class="status <?= $db_error ? 'error' : 'success' ?>">
<strong>🗄️ База данных:</strong> <?= htmlspecialchars($db_status) ?>
</div>
<div class="status <?= $opcache_enabled ? 'success' : 'error' ?>">
<strong>⚡ OPcache:</strong> <?= $opcache_enabled ? '✓ Включен и работает' : '✗ Отключен или не загружен' ?>
</div>
<h2>🔧 Расширения PHP</h2>
<div class="grid">
<?php foreach ($extensions as $ext => $loaded): ?>
<div class="grid-item <?= $loaded ? 'ok' : 'missing' ?>">
<?= htmlspecialchars($ext) ?>: <?= $loaded ? '✓' : '✗' ?>
<strong><?= htmlspecialchars($ext) ?>:</strong><br>
<?= $loaded ? '✅ Загружено' : '❌ Отсутствует' ?>
</div>
<?php endforeach; ?>
</div>
<h2>Информация о системе</h2>
<h2> Информация о системе</h2>
<div class="status info">
<strong>Java:</strong> <?php $java_version = shell_exec('java -version 2>&1 | head -n1'); echo $java_version ? htmlspecialchars(trim($java_version)) : 'Не найдена'; ?><br>
<strong>Сервер:</strong> <?= $_SERVER['SERVER_SOFTWARE'] ?? 'Nginx' ?><br>
<strong>Web SAPI:</strong> <?= php_sapi_name() ?>
<strong>Java:</strong> <?php
$java_version = shell_exec('java -version 2>&1 | head -n1');
echo $java_version ? htmlspecialchars(trim($java_version)) : 'Не найдена';
?><br>
<strong>🌐 Веб-сервер:</strong> <?= htmlspecialchars($apache_version) ?><br>
<strong>⚙️ PHP SAPI:</strong> <?= php_sapi_name() ?><br>
<strong>📁 Document Root:</strong> <?= htmlspecialchars($_SERVER['DOCUMENT_ROOT'] ?? '/var/www/html') ?><br>
<strong>🕒 Время сервера:</strong> <?= date('Y-m-d H:i:s T') ?><br>
<strong>💾 Загруженные модули Apache:</strong>
<?php
if (function_exists('apache_get_modules')) {
$modules = apache_get_modules();
$php_modules = array_filter($modules, function($mod) { return strpos($mod, 'php') !== false; });
echo $php_modules ? implode(', ', $php_modules) : 'mod_php8.3';
} else {
echo 'Информация недоступна';
}
?>
</div>
</div>
</div>
@@ -244,69 +396,181 @@ $opcache_enabled = function_exists('opcache_get_status') && opcache_get_status(f
</html>
EOF
# --- 8. СОЗДАНИЕ .HTACCESS ---
log_info "Создание .htaccess для безопасности..."
cat > "$WEBROOT/.htaccess" << 'EOF'
# Защита конфигурационных файлов
<Files "db_config.php">
Require all denied
</Files>
<Files "*.conf">
Require all denied
</Files>
<Files ".env">
Require all denied
</Files>
# Включение сжатия для лучшей производительности
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json application/xml
</IfModule>
# Кэширование статических файлов
<IfModule mod_expires.c>
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 text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
</IfModule>
# Защита от некоторых атак
<IfModule mod_headers.c>
Header always set X-Content-Type-Options nosniff
Header always set X-Frame-Options DENY
Header always set X-XSS-Protection "1; mode=block"
</IfModule>
# Красивые URL (при необходимости)
RewriteEngine On
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteRule ^(.*)$ index.php [QSA,L]
EOF
# Установка правильных прав доступа
chown -R www-data:www-data "$WEBROOT"
chmod -R 755 "$WEBROOT"
chmod 644 "$WEBROOT/.htaccess"
chmod 600 "$WEBROOT/db_config.php"
# --- 5. НАСТРОЙКА PHP.INI ДЛЯ FPM ---
# --- 9. НАСТРОЙКА БАЗЫ ДАННЫХ ---
PHP_INI_FPM="/etc/php/8.3/fpm/php.ini"
echo "Настройка PHP-FPM в $PHP_INI_FPM..."
log_info "Настройка MariaDB..."
if [ -f "$PHP_INI_FPM" ]; then
cp "$PHP_INI_FPM" "${PHP_INI_FPM}.backup.$(date +%Y%m%d)"
sed -i 's/upload_max_filesize = .*/upload_max_filesize = 64M/' "$PHP_INI_FPM"
sed -i 's/post_max_size = .*/post_max_size = 64M/' "$PHP_INI_FPM"
sed -i 's/max_execution_time = .*/max_execution_time = 300/' "$PHP_INI_FPM"
sed -i 's/memory_limit = .*/memory_limit = 256M/' "$PHP_INI_FPM"
sed -i 's/;opcache.enable=.*/opcache.enable=1/' "$PHP_INI_FPM"
sed -i 's/;opcache.enable_cli=.*/opcache.enable_cli=1/' "$PHP_INI_FPM"
sed -i 's/;opcache.memory_consumption=.*/opcache.memory_consumption=128/' "$PHP_INI_FPM"
sed -i 's/;opcache.revalidate_freq=.*/opcache.revalidate_freq=2/' "$PHP_INI_FPM"
else
echo "ПРЕДУПРЕЖДЕНИЕ: Не найден файл конфигурации $PHP_INI_FPM"
fi
# --- 6. НАСТРОЙКА БАЗЫ ДАННЫХ ---
MYSQL_TMP_SCRIPT="/tmp/mysql_first_config.sql"
MYSQL_TMP_SCRIPT="/tmp/mysql_setup_$(date +%s).sql"
cat > "$MYSQL_TMP_SCRIPT" << 'MYSQL_SCRIPT'
-- Безопасная настройка MariaDB
ALTER USER IF EXISTS 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('muJh9tNY8sg0');
-- Создание базы данных
CREATE DATABASE IF NOT EXISTS ALTCor CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON ALTCor.* TO 'root'@'localhost' IDENTIFIED BY 'muJh9tNY8sg0';
-- Предоставление прав
GRANT ALL PRIVILEGES ON ALTCor.* TO 'root'@'localhost';
FLUSH PRIVILEGES;
-- Удаление анонимных пользователей
DELETE FROM mysql.user WHERE user='';
-- Удаление удаленных root пользователей
DELETE FROM mysql.user WHERE user='root' AND host NOT IN ('localhost', '127.0.0.1', '::1');
-- Удаление тестовой базы данных
DROP DATABASE IF EXISTS test;
-- Показать созданную БД
SHOW DATABASES;
MYSQL_SCRIPT
if ! mysql -u root < "$MYSQL_TMP_SCRIPT"; then
echo "ОШИБКА: Не удалось выполнить скрипт настройки MariaDB."
if mysql -u root < "$MYSQL_TMP_SCRIPT"; then
log_success "MariaDB успешно настроена."
else
log_error "Не удалось выполнить скрипт настройки MariaDB."
rm -f "$MYSQL_TMP_SCRIPT"
exit 1
fi
rm -f "$MYSQL_TMP_SCRIPT"
echo "База данных успешно настроена."
# --- 10. ПРОВЕРКА КОНФИГУРАЦИИ И ЗАПУСК ---
# --- 7. ПЕРЕЗАПУСК СЛУЖБ И ФИНАЛЬНАЯ ПРОВЕРКА ---
log_info "Проверка конфигурации Apache..."
if apache2ctl configtest; then
log_success "Конфигурация Apache корректна."
else
log_error "Конфигурация Apache содержит ошибки."
exit 1
fi
systemctl restart php8.3-fpm
systemctl restart nginx
# Перезапуск и включение автозапуска служб
log_info "Запуск служб..."
systemctl enable nginx php8.3-fpm mariadb redis-server
systemctl restart apache2
systemctl restart mariadb
systemctl restart redis-server
systemctl enable apache2 mariadb redis-server
# --- 11. ФИНАЛЬНАЯ ПРОВЕРКА ---
log_info "Выполнение финальной проверки..."
# Проверка статуса служб
if systemctl is-active --quiet apache2; then
log_success "Apache2 запущен и работает"
else
log_error "Apache2 не запущен"
fi
if systemctl is-active --quiet mariadb; then
log_success "MariaDB запущен и работает"
else
log_error "MariaDB не запущен"
fi
if systemctl is-active --quiet redis-server; then
log_success "Redis запущен и работает"
else
log_warning "Redis не запущен"
fi
# Проверка PHP
PHP_TEST=$(php -r "echo 'PHP работает: ' . phpversion();" 2>/dev/null || echo "PHP не работает")
if [[ "$PHP_TEST" == *"PHP работает"* ]]; then
log_success "$PHP_TEST"
else
log_error "PHP не работает корректно"
fi
# --- ЗАВЕРШЕНИЕ ---
IP_ADDR=$(hostname -I | awk '{print $1}')
echo ""
echo "=== УСТАНОВКА ЗАВЕРШЕНА ==="
echo " Архитектура: LEMP (Linux + Nginx + MariaDB + PHP)"
echo " Версия PHP: $(php --version | head -n1)"
echo " Веб-директория: $WEBROOT"
echo "=============================================="
echo -e "${GREEN} УСТАНОВКА LAMP ЗАВЕРШЕНА УСПЕШНО!${NC}"
echo "=============================================="
echo ""
echo " Для проверки откройте в браузере:"
echo " -> http://localhost/"
echo " -> http://$IP_ADDR/"
echo "📋 Конфигурация:"
echo " • Архитектура: LAMP (Linux + Apache + MariaDB + PHP)"
echo " • Версия PHP: $(php --version | head -n1)"
echo "Веб-директория: $WEBROOT"
echo " • База данных: ALTCor (пользователь: root)"
echo ""
echo " Статус активных служб:"
systemctl is-active nginx php8.3-fpm mariadb redis-server || echo "ПРЕДУПРЕЖДЕНИЕ: Некоторые службы неактивны."
echo "🌐 Доступ к сайту:"
echo " • http://localhost/"
echo " • http://$IP_ADDR/"
echo ""
echo "🔧 Управление сервисами:"
echo " • Apache: sudo systemctl [start|stop|restart|status] apache2"
echo " • MariaDB: sudo systemctl [start|stop|restart|status] mariadb"
echo " • Redis: sudo systemctl [start|stop|restart|status] redis-server"
echo ""
echo "📝 Логи:"
echo " • Apache: /var/log/apache2/error.log"
echo " • PHP: /var/log/php8.3.log"
echo " • MariaDB: /var/log/mysql/error.log"
echo ""
echo "🔐 Безопасность:"
echo " • Файл db_config.php защищен от прямого доступа"
echo " • Включены базовые заголовки безопасности"
echo " • OPcache оптимизирован для производительности"
echo ""
echo "=============================================="