
Встановлення та налаштування Apache+PHP+MariaDB у Debian
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 встановлено, оптимізовано та захищено!
```
Content
- Передумови
- Встановлення Apache
- Налаштування брандмауера
- Віртуальний хост
- Встановлення PHP 8.4
- Тестування PHP
- Встановлення MariaDB
- Тестування підключення до бази даних
- Встановлення phpMyAdmin
- Оптимізація
- HTTPS із Let's Encrypt
- Моніторинг і журнали
- Додатковий захист (для продакшену)
- Діагностика
- Оновлення та обслуговування
- Готово!