#!/bin/bash # Скрипт для автоматической установки и настройки LEMP (Nginx, MariaDB, PHP-FPM 8.3) set -e # --- 1. ПРОВЕРКА СИСТЕМЫ И ПРАВ --- if [[ $EUID -ne 0 ]]; then echo "Ошибка: Запустите этот скрипт с правами суперпользователя (используйте sudo)." exit 1 fi if [ -f /etc/os-release ]; then . /etc/os-release DISTRO="$ID" FAMILY="$ID_LIKE" VERSION_ID="${VERSION_ID:-unknown}" else echo "Ошибка: Не удалось определить дистрибутив." exit 1 fi echo "Определен дистрибутив: $DISTRO (Семейство: ${FAMILY:-$DISTRO}, Версия: $VERSION_ID)" # --- 2. УСТАНОВКА ДЛЯ DEBIAN-ПОДОБНЫХ СИСТЕМ (Debian, Ubuntu) --- 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 "Установка пакетов: apache2, nginx (для прокси), mariadb, redis, php-fpm..." # Устанавливаем Nginx и PHP-FPM apt install -y apache2 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 INSTALLED_PHP_VERSION=$(php --version 2>/dev/null | head -n1 | grep -o "8\.3\.[0-9]*" || echo "") if [ -z "$INSTALLED_PHP_VERSION" ]; then echo "ОШИБКА: PHP 8.3 не был установлен корректно." exit 1 fi echo "PHP 8.3 ($INSTALLED_PHP_VERSION) успешно установлен." systemctl enable --now mariadb redis-server nginx php8.3-fpm else echo "ОШИБКА: Ваш дистрибутив '$DISTRO' не поддерживается этим скриптом. Поддерживаются только Debian/Ubuntu." exit 1 fi systemctl stop apache2 ngninx WEBROOT="/var/www/html" echo "Корневая директория веб-сервера: $WEBROOT" mkdir -p "$WEBROOT" APACHE_CONF="/etc/apache2/sites-available/000-default.conf" echo "Настройка Apache в $APACHE_CONF..." # Конфигурация Apache для работы с PHP-FPM cat > "$APACHE_CONF" < DocumentRoot $WEBROOT Options -Indexes +FollowSymLinks AllowOverride All Require all granted SetHandler "proxy:unix:/var/run/php/php8.3-fpm.sock|fcgi://localhost" ErrorLog \${APACHE_LOG_DIR}/error.log CustomLog \${APACHE_LOG_DIR}/access.log combined EOF sed -i 's/Listen 80/Listen 8080/' /etc/apache2/ports.conf # Создание конфигурации Nginx для нашего сайта NGINX_CONF="/etc/nginx/sites-available/default" echo "Создание конфигурации Nginx в $NGINX_CONF..." cat > "$NGINX_CONF" < "$WEBROOT/db_config.php" << 'EOF' EOF # Создаем index.php cat > "$WEBROOT/index.php" << 'EOF' =') && version_compare($php_version, '8.4.0', '<'); // Проверка подключения к БД $db_status = ""; $db_error = false; try { $pdo = new PDO("mysql:host=$db_host;dbname=$db_name;charset=" . DB_CHARSET, $db_user, $db_pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db_status = "Подключение к базе данных успешно!"; } catch (PDOException $e) { $db_status = "Ошибка подключения к БД: " . $e->getMessage(); $db_error = true; } // Проверка расширений PHP $extensions = [ 'pdo_mysql' => extension_loaded('pdo_mysql'), 'curl' => extension_loaded('curl'), 'gd' => extension_loaded('gd'), 'mbstring' => extension_loaded('mbstring'), 'xml' => extension_loaded('xml'), 'zip' => extension_loaded('zip'), 'opcache' => extension_loaded('opcache'), 'intl' => extension_loaded('intl'), 'bcmath' => extension_loaded('bcmath'), 'json' => extension_loaded('json') ]; // Проверка статуса OPcache $opcache_enabled = function_exists('opcache_get_status') && opcache_get_status(false)['opcache_enabled']; ?> Статус сервера LEMP (Nginx + PHP 8.3)

Статус сервера LEMP

Версия PHP: ()
База данных:
OPcache:

Расширения PHP

$loaded): ?>
:

Информация о системе

Java: &1 | head -n1'); echo $java_version ? htmlspecialchars(trim($java_version)) : 'Не найдена'; ?>
Сервер:
Web SAPI:
EOF chown -R www-data:www-data "$WEBROOT" chmod -R 755 "$WEBROOT" # --- 5. НАСТРОЙКА PHP.INI ДЛЯ FPM --- # Настраиваем php.ini именно для FPM PHP_INI_FPM="/etc/php/8.3/fpm/php.ini" echo "Настройка PHP-FPM в $PHP_INI_FPM..." 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" # Явно включаем opcache 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" cat > "$MYSQL_TMP_SCRIPT" << 'MYSQL_SCRIPT' 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'; FLUSH PRIVILEGES; DELETE FROM mysql.user WHERE user=''; DELETE FROM mysql.user WHERE user='root' AND host NOT IN ('localhost', '127.0.0.1', '::1'); DROP DATABASE IF EXISTS test; MYSQL_SCRIPT # Выполняем настройку через системный вызов if ! mysql -u root < "$MYSQL_TMP_SCRIPT"; then echo "ОШИБКА: Не удалось выполнить скрипт настройки MariaDB." rm -f "$MYSQL_TMP_SCRIPT" exit 1 fi rm -f "$MYSQL_TMP_SCRIPT" echo "База данных успешно настроена." # --- 7. ПЕРЕЗАПУСК СЛУЖБ И ФИНАЛЬНАЯ ПРОВЕРКА --- systemctl restart php8.3-fpm systemctl restart apache2 systemctl restart nginx systemctl enable apache2 nginx php8.3-fpm mariadb redis-server # --- ЗАВЕРШЕНИЕ --- IP_ADDR=$(hostname -I | awk '{print $1}') echo "" echo "" echo " Версия PHP: $(php --version | head -n1)" echo " Веб-директория: $WEBROOT" echo "" echo " Для проверки откройте в браузере:" echo " -> http://localhost/" echo " -> http://$IP_ADDR/" echo "" echo " Статус активных служб:" systemctl is-active apache2 nginx php8.3-fpm mariadb redis-server || echo "ПРЕДУПРЕЖДЕНИЕ: Некоторые службы неактивны." echo ""