From 2f00a9972188002f904e25cac9a284db28769419 Mon Sep 17 00:00:00 2001 From: hosh1 Date: Sat, 9 Aug 2025 21:32:42 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20Apache,=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B5=D0=BD=D0=B0=20=D0=91=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install.sh | 319 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 278 insertions(+), 41 deletions(-) diff --git a/install.sh b/install.sh index 546fdb0..de5d478 100644 --- a/install.sh +++ b/install.sh @@ -1,82 +1,319 @@ #!/bin/bash +# Скрипт для автоматической установки и настройки LEMP (Nginx, MariaDB, PHP-FPM 8.3) set -e +# --- 1. ПРОВЕРКА СИСТЕМЫ И ПРАВ --- + if [[ $EUID -ne 0 ]]; then - echo "Запустите скрипт с sudo" + echo "Ошибка: Запустите этот скрипт с правами суперпользователя (используйте sudo)." exit 1 fi -echo "Определение дистрибутива..." if [ -f /etc/os-release ]; then . /etc/os-release DISTRO="$ID" FAMILY="$ID_LIKE" + VERSION_ID="${VERSION_ID:-unknown}" else - echo "Не удалось определить дистрибутив" + echo "Ошибка: Не удалось определить дистрибутив." exit 1 fi -echo "Дистрибутив: $DISTRO" -echo "Семейство: $FAMILY" -echo "Установка..." +echo "Определен дистрибутив: $DISTRO (Семейство: ${FAMILY:-$DISTRO}, Версия: $VERSION_ID)" -if echo "$DISTRO $FAMILY" | grep -qi "rhel\|fedora\|centos"; then - dnf update -y - dnf install -y nginx mariadb-server mariadb php php-fpm php-mysqlnd \ - php-curl php-gd php-mbstring php-xml php-zip php-opcache \ - php-intl php-bcmath php-json \ - redis-server libreoffice apache2 +# --- 2. УСТАНОВКА ДЛЯ DEBIAN-ПОДОБНЫХ СИСТЕМ (Debian, Ubuntu) --- - systemctl enable --now nginx mariadb php-fpm +if echo "$DISTRO $FAMILY" | grep -qi "debian\|ubuntu"; then + echo "Начало установки LEMP для Debian-подобной системы..." -elif echo "$DISTRO $FAMILY" | grep -qi "debian"; then apt update -y - apt install -y nginx mariadb-server php-fpm php-mysql \ - php-curl php-gd php-mbstring php-xml php-zip php-opcache \ - php-intl php-bcmath php-json \ - redis-server libreoffice apache2 + 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 - systemctl enable --now nginx mariadb php7.4-fpm redis 2>/dev/null || true else - echo "Скрипт не поддерживает этот дистрибутив" + echo "ОШИБКА: Ваш дистрибутив '$DISTRO' не поддерживается этим скриптом. Поддерживаются только Debian/Ubuntu." exit 1 fi -cat > /etc/nginx/conf.d/default.conf << 'EOF' +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" </dev/null || chown -R www-data:www-data /var/www/html -chmod -R 755 /var/www/html +a2enmod proxy_fcgi rewrite +systemctl restart apache2 -sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/' /etc/php/*/php.ini 2>/dev/null || sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/' /etc/php.ini -sed -i 's/upload_max_filesize = .*/upload_max_filesize = 64M/' /etc/php/*/php.ini 2>/dev/null || sed -i 's/upload_max_filesize = .*/upload_max_filesize = 64M/' /etc/php.ini -sed -i 's/post_max_size = .*/post_max_size = 64M/' /etc/php/*/php.ini 2>/dev/null || sed -i 's/post_max_size = .*/post_max_size = 64M/' /etc/php.ini +# Проверка конфигурации Nginx +if ! nginx -t; then + echo "ОШИБКА: Конфигурация Nginx содержит ошибки." + exit 1 +fi -nginx -t +# --- 4. СОЗДАНИЕ ВЕБ-ФАЙЛОВ --- + +# Файлы db_config.php и index.php остаются такими же, как в предыдущей версии. +# Создаем db_config.php +cat > "$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 restart php-fpm 2>/dev/null || systemctl restart php*-fpm -echo "Установка завершена" +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 ""