Update
This commit is contained in:
596
install.sh
596
install.sh
@@ -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
|
||||
|
||||
# Включение сжатия
|
||||
<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>
|
||||
|
||||
# Основная обработка файлов
|
||||
location / {
|
||||
try_files \$uri \$uri/ =404;
|
||||
}
|
||||
# Обработка PHP файлов
|
||||
<FilesMatch \.php$>
|
||||
SetHandler application/x-httpd-php
|
||||
</FilesMatch>
|
||||
|
||||
# Обработка 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;
|
||||
}
|
||||
# Безопасность - защита конфигурационных файлов
|
||||
<Files "*.conf">
|
||||
Require all denied
|
||||
</Files>
|
||||
|
||||
<Files "db_config.php">
|
||||
Require all denied
|
||||
</Files>
|
||||
|
||||
# Запрет доступа к .htaccess файлам
|
||||
location ~ /\.ht {
|
||||
deny all;
|
||||
}
|
||||
<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>
|
||||
|
||||
<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>
|
||||
<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 "🌐 Доступ к сайту:"
|
||||
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 "=============================================="
|
||||
Reference in New Issue
Block a user