Добавлен Apache, перенастроена БД
This commit is contained in:
319
install.sh
319
install.sh
@@ -1,82 +1,319 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
# Скрипт для автоматической установки и настройки LEMP (Nginx, MariaDB, PHP-FPM 8.3)
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
# --- 1. ПРОВЕРКА СИСТЕМЫ И ПРАВ ---
|
||||||
|
|
||||||
if [[ $EUID -ne 0 ]]; then
|
if [[ $EUID -ne 0 ]]; then
|
||||||
echo "Запустите скрипт с sudo"
|
echo "Ошибка: Запустите этот скрипт с правами суперпользователя (используйте sudo)."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Определение дистрибутива..."
|
|
||||||
if [ -f /etc/os-release ]; then
|
if [ -f /etc/os-release ]; then
|
||||||
. /etc/os-release
|
. /etc/os-release
|
||||||
DISTRO="$ID"
|
DISTRO="$ID"
|
||||||
FAMILY="$ID_LIKE"
|
FAMILY="$ID_LIKE"
|
||||||
|
VERSION_ID="${VERSION_ID:-unknown}"
|
||||||
else
|
else
|
||||||
echo "Не удалось определить дистрибутив"
|
echo "Ошибка: Не удалось определить дистрибутив."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Дистрибутив: $DISTRO"
|
echo "Определен дистрибутив: $DISTRO (Семейство: ${FAMILY:-$DISTRO}, Версия: $VERSION_ID)"
|
||||||
echo "Семейство: $FAMILY"
|
|
||||||
echo "Установка..."
|
|
||||||
|
|
||||||
if echo "$DISTRO $FAMILY" | grep -qi "rhel\|fedora\|centos"; then
|
# --- 2. УСТАНОВКА ДЛЯ DEBIAN-ПОДОБНЫХ СИСТЕМ (Debian, Ubuntu) ---
|
||||||
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
|
|
||||||
|
|
||||||
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 update -y
|
||||||
apt install -y nginx mariadb-server php-fpm php-mysql \
|
apt install -y software-properties-common lsb-release ca-certificates curl wget gnupg2
|
||||||
php-curl php-gd php-mbstring php-xml php-zip php-opcache \
|
|
||||||
php-intl php-bcmath php-json \
|
# Добавление PPA ondrej/php для гарантированной установки PHP 8.3
|
||||||
redis-server libreoffice apache2
|
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
|
else
|
||||||
echo "Скрипт не поддерживает этот дистрибутив"
|
echo "ОШИБКА: Ваш дистрибутив '$DISTRO' не поддерживается этим скриптом. Поддерживаются только Debian/Ubuntu."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
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" <<EOF
|
||||||
|
<VirtualHost *:8080>
|
||||||
|
DocumentRoot $WEBROOT
|
||||||
|
<Directory $WEBROOT>
|
||||||
|
Options -Indexes +FollowSymLinks
|
||||||
|
AllowOverride All
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
<FilesMatch \.php$>
|
||||||
|
SetHandler "proxy:unix:/var/run/php/php8.3-fpm.sock|fcgi://localhost"
|
||||||
|
</FilesMatch>
|
||||||
|
|
||||||
|
ErrorLog \${APACHE_LOG_DIR}/error.log
|
||||||
|
CustomLog \${APACHE_LOG_DIR}/access.log combined
|
||||||
|
</VirtualHost>
|
||||||
|
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" <<EOF
|
||||||
server {
|
server {
|
||||||
listen 80 default_server;
|
listen 80 default_server;
|
||||||
listen [::]:80 default_server;
|
listen [::]:80 default_server;
|
||||||
root /var/www/html;
|
|
||||||
index index.php index.html;
|
|
||||||
server_name _;
|
server_name _;
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
try_files $uri $uri/ =404;
|
proxy_pass http://127.0.0.1:8080;
|
||||||
|
proxy_set_header Host \$host;
|
||||||
|
proxy_set_header X-Real-IP \$remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto \$scheme;
|
||||||
}
|
}
|
||||||
|
|
||||||
location ~ \.php$ {
|
location ~ \.php$ {
|
||||||
fastcgi_pass 127.0.0.1:9000;
|
return 404;
|
||||||
fastcgi_index index.php;
|
|
||||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
|
||||||
include fastcgi_params;
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~ /\.ht {
|
|
||||||
deny all;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
mkdir -p /var/www/html
|
a2enmod proxy_fcgi rewrite
|
||||||
chown -R nginx:nginx /var/www/html 2>/dev/null || chown -R www-data:www-data /var/www/html
|
systemctl restart apache2
|
||||||
chmod -R 755 /var/www/html
|
|
||||||
|
|
||||||
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
|
# Проверка конфигурации Nginx
|
||||||
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
|
if ! nginx -t; then
|
||||||
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
|
echo "ОШИБКА: Конфигурация Nginx содержит ошибки."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
nginx -t
|
# --- 4. СОЗДАНИЕ ВЕБ-ФАЙЛОВ ---
|
||||||
|
|
||||||
|
# Файлы db_config.php и index.php остаются такими же, как в предыдущей версии.
|
||||||
|
# Создаем db_config.php
|
||||||
|
cat > "$WEBROOT/db_config.php" << 'EOF'
|
||||||
|
<?php
|
||||||
|
$db_host = 'localhost';
|
||||||
|
$db_user = 'root';
|
||||||
|
$db_pass = 'muJh9tNY8sg0';
|
||||||
|
$db_name = 'ALTCor';
|
||||||
|
|
||||||
|
define('OFFICE', '/usr/bin/libreoffice');
|
||||||
|
define('DB_CHARSET', 'utf8mb4');
|
||||||
|
?>
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Создаем index.php
|
||||||
|
cat > "$WEBROOT/index.php" << 'EOF'
|
||||||
|
<?php
|
||||||
|
require_once __DIR__ . '/db_config.php';
|
||||||
|
|
||||||
|
// Проверка версии PHP
|
||||||
|
$php_version = phpversion();
|
||||||
|
$is_php83 = version_compare($php_version, '8.3.0', '>=') && 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'];
|
||||||
|
|
||||||
|
?>
|
||||||
|
<!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>
|
||||||
|
<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; } /* Nginx green */
|
||||||
|
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; }
|
||||||
|
strong { color: #2d3748; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<h1>Статус сервера LEMP</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>
|
||||||
|
|
||||||
|
<h2>Расширения PHP</h2>
|
||||||
|
<div class="grid">
|
||||||
|
<?php foreach ($extensions as $ext => $loaded): ?>
|
||||||
|
<div class="grid-item <?= $loaded ? 'ok' : 'missing' ?>">
|
||||||
|
<?= htmlspecialchars($ext) ?>: <?= $loaded ? '✓' : '✗' ?>
|
||||||
|
</div>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<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'] ?? 'Неизвестно' ?><br>
|
||||||
|
<strong>Web SAPI:</strong> <?= php_sapi_name() ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
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 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 ""
|
||||||
|
|||||||
Reference in New Issue
Block a user