Встановлення та налаштування Apache+PHP+MariaDB у Debian
Встановлення та налаштування Apache+PHP+MariaDB у Debian

Встановлення та налаштування Apache+PHP+MariaDB у Debian

Read 6 minutes

LAMP — це стек для веб-розробки. Debian 13 "Trixie" включає PHP 8.4 та MariaDB 11.8. Усі команди виконуються від імені root або з використанням sudo.

Передумови

Якщо у вас чиста система, цей розділ можна пропустити та перейти до встановлення Apache.

Якщо веб-компоненти вже встановлені, виконайте наступні команди для безпеки:

Створення резервної копії наявних конфігурацій

<code>mkdir -p /backup; dirs=""
[ -d /etc/apache2 ] && dirs+="/etc/apache2 "
[ -d /etc/mysql ] && dirs+="/etc/mysql "
[ -d /var/www ] && dirs+="/var/www "
[ -ն "$dirs" ] && tar -czf /backup/lamp_$(date +%F).tar.gz $dirs
</code>

Оновлення системи та перевірка портів

<code>apt update && apt full-upgrade -y
ss -tuln | grep -E ':(80|443)\s' || echo "Порти 80/443 вільні"
systemctl is-active nginx >/dev/null && { systemctl stop nginx; systemctl disable nginx; }
</code>

Ці команди:

  • Створюють резервну копію лише наявних конфігурацій
  • Перевіряють доступність портів 80/443
  • Зупиняють Nginx, якщо він встановлений (щоб уникнути конфлікту з Apache)

Встановлення Apache

<code>apt install apache2 -y
systemctl enable apache2 --now
a2enmod rewrite ssl headers expires deflate
systemctl reload apache2
</code>

Тест: Відкрийте IP-адресу вашого сервера в браузері:

<code>hostname -I | awk '{print $1}'
</code>

Налаштування брандмауера

<code>apt install ufw -y
SSH_PORT=$(ss -tuln | grep -w ssh | grep -oP '0.0.0.0:\K[0-9]+|:::\K[0-9]+' | head -1)
ufw allow ${SSH_PORT:-22}
ufw allow 80,443/tcp
ufw --force enable
</code>

Віртуальний хост

Створення директорії та тестової сторінки

<code>mkdir -p /var/www/helloworld.net && chown -R www-data:www-data /var/www/helloworld.net && chmod -R 755 /var/www/helloworld.net
cat > /var/www/helloworld.net/index.html << 'EOF'
<!DOCTYPE html><html lang="uk"><head><meta charset="UTF-8"><title>Привіт, світ!</title></head><body><h1>Привіт, світ! - Debian 13</h1></body></html>
EOF
</code>

Конфігурація

Створіть файл /etc/apache2/sites-available/helloworld.net.conf:

<code><VirtualHost *:80>
    ServerName helloworld.net
    ServerAlias www.helloworld.net
    DocumentRoot /var/www/helloworld.net
    ErrorLog ${APACHE_LOG_DIR}/helloworld.net.error.log
    CustomLog ${APACHE_LOG_DIR}/helloworld.net.access.log combined
    <Directory /var/www/helloworld.net>
        Options +FollowSymLinks -Indexes
        AllowOverride All
        Require all granted
    </Directory>
    Header set X-Content-Type-Options nosniff
    Header set X-Frame-Options DENY
</VirtualHost>
</code>

Активація

<code>a2dissite 000-default.conf 2>/dev/null
a2ensite helloworld.net.conf
apache2ctl configtest && systemctl reload apache2
</code>

Тест: Відвідайте http://helloworld.net

Встановлення PHP 8.4

<code>apt install php8.4 php8.4-fpm php8.4-mysql php8.4-cli php8.4-common php8.4-curl php8.4-gd php8.4-mbstring php8.4-xml php8.4-zip -y
a2enmod proxy_fcgi setenvif
a2enconf php8.4-fpm
systemctl enable php8.4-fpm --now
systemctl reload apache2
</code>

Тестування PHP

Створіть файл /var/www/helloworld.net/test.php:

<code><?php
echo "<h1>PHP ".phpversion()."</h1><p>Сервер: ".php_uname()."</p><p>Час: ".date('Y-m-d H:i:s')."</p><h3>Розширення:</h3><ul>";
foreach(['mysqli','curl','gd','mbstring','xml'] as $ext) echo "<li>$ext: ".(extension_loaded($ext)?"✅":"❌")."</li>";
echo "</ul>";
?>
</code>

Тест: Відвідайте http://helloworld.net/test.php

Встановлення MariaDB

<code>apt install mariadb-server mariadb-client -y
systemctl enable mariadb --now
mysql_secure_installation
</code>

MariaDB 11.8 за замовчуванням використовує unix_socket для root. Рекомендовані відповіді у майстрі:

  • N — не змінювати пароль root
  • Y — видалити анонімних користувачів
  • Y — заборонити віддалений вхід для root
  • Y — видалити тестову базу даних
  • Y — перезавантажити таблиці привілеїв

Тестування підключення до бази даних

<code>WEBAPP_PASSWORD="secure_webapp_$(date +%s)_$(openssl rand -hex 6)"
mysql -e "CREATE DATABASE test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'webapp'@'localhost' IDENTIFIED BY '$WEBAPP_PASSWORD'; GRANT ALL ON test_db.* TO 'webapp'@'localhost'; FLUSH PRIVILEGES;"
echo "$WEBAPP_PASSWORD" > /root/.webapp_password
chmod 600 /root/.webapp_password
</code>

Створіть файл config.php:

<code><?php
$webapp_password = trim(file_get_contents('/root/.webapp_password'));
$conn = new mysqli('localhost', 'webapp', $webapp_password, 'test_db');
?>
</code>

Створіть файл db_test.php для перевірки:

<code><?php
require_once 'config.php';
if($conn->connect_error) die("Помилка бази даних: {$conn->connect_error}");
echo "<h2>✅ MariaDB</h2><p>Версія: {$conn->server_info}</p>";
?>
</code>

Тест: Відвідайте http://helloworld.net/db_test.php

Встановлення phpMyAdmin

<code>apt install phpmyadmin -y
</code>

Створіть віртуальний хост /etc/apache2/sites-available/phpmyadmin.conf:

<code><VirtualHost *:80>
    ServerName phpmyadmin.local
    DocumentRoot /usr/share/phpmyadmin
    <Directory /usr/share/phpmyadmin>
        Options +FollowSymLinks -Indexes
        AllowOverride All
        Require all granted
        <Files "config.inc.php">Require all denied</Files>
    </Directory>
</VirtualHost>
</code>
<code>a2ensite phpmyadmin.conf
systemctl reload apache2
</code>

Доступ: http://phpmyadmin.local

Оптимізація

Apache

<code>a2enmod cache cache_disk expires
systemctl reload apache2
</code>

MariaDB

Додайте до /etc/mysql/mariadb.conf.d/50-server.cnf:

<code>[mysqld]
innodb_buffer_pool_size=128M
innodb_log_file_size=32M
max_connections=100
slow_query_log=1
long_query_time=2
</code>

HTTPS із Let's Encrypt

<code>apt install certbot python3-certbot-apache -y
certbot --apache -d helloworld.net -d www.helloworld.net
</code>

Моніторинг і журнали

Створіть файл status.php:

<code><?php
header('Content-Type: application/json; charset=utf-8');
echo json_encode(['status'=>'ok','time'=>date('Y-m-d H:i:s')], JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);
?>
</code>

Додатковий захист (для продакшену)

Для середовищ розробки та тестування цей розділ можна пропустити — базового захисту UFW достатньо.

Для продакшен-середовищ рекомендується додатковий захист:

Fail2Ban

<code>apt install fail2ban -y
systemctl enable fail2ban --now
</code>

Створіть конфігурацію /etc/fail2ban/jail.local:

<code>[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3

[sshd]
enabled = true

[apache-auth]
enabled = true
port = http,https

[apache-badbots]
enabled = true
port = http,https

[apache-noscript]
enabled = true
port = http,https

[apache-overflows]
enabled = true
port = http,https
</code>
<code>systemctl restart fail2ban
fail2ban-client status
</code>

Діагностика

Створіть скрипт /usr/local/bin/lamp-check:

<code>#!/bin/bash
echo "=== Статус LAMP ==="
systemctl status apache2 mariadb php8.4-fpm
echo "=== Статус веб ==="
curl -s http://helloworld.net/status.php | jq .
</code>
<code>chmod +x /usr/local/bin/lamp-check
</code>

Оновлення та обслуговування

<code>apt install unattended-upgrades -y
</code>

Створіть завдання cron для щотижневого обслуговування:

<code>echo "0 2 * * 0 apt update && apt upgrade -y && mysqlcheck --all-databases --optimize -u root" >> /etc/crontab
</code>

Готово!

LAMP на Debian 13 з PHP 8.4 та MariaDB 11.8 встановлено, оптимізовано та захищено!
```

VPSServerIT