
LAMP (Linux Apache MySQL/MariaDB PHP) — це класичний і надійний стек для веб-сайтів, API та багатьох популярних CMS-платформ. У цьому посібнику ви налаштуєте Apache, забезпечите безпеку MySQL, встановите модулі PHP, налаштуєте віртуальний хост Apache, перевірите зв’язок між PHP та базою даних, а також, за бажанням, увімкнете HTTPS за допомогою Let’s Encrypt.
Для виробничих проектів почніть зі стабільного VPS на базі Linux, який має достатню потужність процесора, оперативної пам’яті та дискової системи, щоб веб-сервер і база даних залишалися чуйними під навантаженням.
Порада: спочатку виконайте початкове оновлення. Це зменшить проблеми з інсталяцією та застосує виправлення безпеки.
sudo apt update && sudo apt -y upgrade
sudo apt install -y apache2
sudo systemctl enable --now apache2
# Quick checks
sudo systemctl status apache2 --no-pager
curl -I http://127.0.0.1

Ви повинні побачити HTTP/1.1 200 OK. Кореневим каталогом веб-сервера за замовчуванням зазвичай є /var/www/html/.
Якщо ви використовуєте UFW (Ubuntu/Debian), застосуйте політику «за замовчуванням забороняти вхідний трафік» і дозвольте лише необхідні порти. Завжди спочатку дозвольте SSH, щоб уникнути блокування доступу.
sudo apt install -y ufw
# Safe defaults
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Allow SSH first
sudo ufw allow OpenSSH
# Allow Apache ports
sudo ufw allow 'Apache Full'
# Enable and verify
sudo ufw enable
sudo ufw status verbose

Якщо ви не використовуєте UFW, переконайтеся, що порти 80/443 дозволені у хмарному брандмауері/групі безпеки вашого провайдера.
У Debian/Ubuntu mysql-server встановлює MySQL (часто з безпечною автентифікацією за замовчуванням). Якщо ви віддаєте перевагу MariaDB, ви можете встановити mariadb-server замість нього.
sudo apt install -y mysql-server
sudo systemctl enable --now mysql
# Security hardening wizard
sudo mysql_secure_installation
Рекомендовані відповіді в mysql_secure_installation:

Створіть виділену базу даних та виділеного користувача з лише необхідними привілеями. Уникайте використання облікового запису root MySQL у додатках.
sudo mysql
У консолі MySQL:
CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD_HERE';
GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Примітка щодо безпеки: для віддаленого доступу до бази даних використовуйте окремого користувача, наприклад 'appuser'@'%' лише якщо це дійсно необхідно, а потім обмежте доступ за допомогою правил брандмауера та налаштувань прив’язки MySQL. У більшості випадків зберігайте MySQL приватним та локальним.
Встановіть PHP та загальні модулі, які використовуються CMS та фреймворками. Ви можете додати більше пізніше, залежно від вашого додатка.
sudo apt install -y php libapache2-mod-php php-mysql php-cli php-curl php-xml php-mbstring php-zip php-gd php-intl
Створіть тимчасовий phpinfo() файл, щоб перевірити, чи працює PHP через Apache:
echo "" | sudo tee /var/www/html/info.php
Відкрийте http:// у браузері та переконайтеся, що сторінка завантажується. Потім видаліть файл (залишення його створює ризик для безпеки):
sudo rm -f /var/www/html/info.php

Для виробничого середовища найкраще створити окремий каталог для кожного домену та налаштувати виділений віртуальний хост.
# Replace example.com with your domain
sudo mkdir -p /var/www/example.com/public_html
sudo chown -R $USER:$USER /var/www/example.com
sudo chmod -R 755 /var/www/example.com
# Simple test page
echo "" > /var/www/example.com/public_html/index.php
Створіть файл конфігурації /etc/apache2/sites-available/example.com.conf:
sudo nano /etc/apache2/sites-available/example.com.conf
Приклад віртуального хосту:
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
Options FollowSymLinks
AllowOverride All
Require all granted
ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined

Примітка: AllowOverride All потрібен лише у випадку, якщо ви використовуєте .htaccess (перенаправлення, правила кешування тощо). Якщо це вам не потрібно, встановіть AllowOverride None для кращої продуктивності та безпеки.
sudo a2ensite example.com.conf
sudo a2enmod rewrite headers
# Optional: disable default site to avoid conflicts
# sudo a2dissite 000-default.conf
sudo apache2ctl configtest
sudo systemctl reload apache2

Тепер відкрийте свій домен (або IP-адресу сервера) і переконайтеся, що завантажується сторінка Hello from LAMP!
Створіть /var/www/example.com/public_html/dbtest.php (використовуйте ім’я вашої БД/користувача/пароль):
PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
echo "1";
} catch (Throwable $e) {
http_response_code(500);
echo "DB connection failed";
}
Відкрийте http://example.com/dbtest.php → ви повинні побачити 1. Потім видаліть файл (він призначений лише для тестування):
rm -f /var/www/example.com/public_html/dbtest.php

Якщо ваш домен вказує на сервер і порт 80 доступний, встановіть безкоштовний сертифікат за допомогою Certbot. Він також налаштує перенаправлення та автоматичне поновлення.
sudo apt update
sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache -d example.com -d www.example.com --redirect
--agree-tos -m admin@example.com --no-eff-email
# Test renewal
sudo certbot renew --dry-run
Відредагуйте конфігурацію Apache PHP (шлях залежить від версії): /etc/php/*/apache2/php.ini. Рекомендовані базові значення:
expose_php = Offmemory_limit = 256M (налаштуйте відповідно до навантаження вашого додатка)upload_max_filesize та post_max_size відповідно до вашої CMSdate.timezone = UTC (або вашому місцевому часовому поясу)sudo systemctl reload apache2
У системах на базі RHEL Apache httpd, БД зазвичай є MariaDB, а брандмауер зазвичай firewalld.
sudo dnf -y update
sudo dnf install -y httpd mariadb-server php php-mysqlnd php-cli php-gd php-mbstring php-xml php-opcache
sudo systemctl enable --now httpd mariadb
# Open firewall
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
# Check Apache
curl -I http://127.0.0.1
Конфігурації віртуальних хостів зазвичай розміщуються в /etc/httpd/conf.d/ (наприклад, /etc/httpd/conf.d/example.com.conf), після чого перезавантажується httpd.
info.php, dbtest.php) видалено.Потрібна стабільна платформа для Apache, MySQL та PHP? Почніть із надійного VPS на базі Linux та розгорніть чистий стек LAMP менш ніж за годину, виконавши наведені вище кроки.