Підготовка
- VPS з Ubuntu 20.04/22.04/24.04 або Debian 11/12.
- Користувач з sudo, доступ по SSH.
- Домен (опціонально) і відкритий порт 80/443 в панелі провайдера.
Apache: установка, автозапуск і перевірка
sudo apt update && sudo apt -y upgrade
sudo apt -y install apache2
sudo systemctl enable --now apache2
curl -I http://127.0.0.1
Очікуємо заголовки HTTP/1.1 200 OK. Сторінка за замовчуванням знаходиться в /var/www/html/.
Брандмауер UFW для HTTP/HTTPS і статус служби
sudo systemctl status apache2 --no-pager
sudo ufw allow 'Apache Full' # відкриває 80 и 443
sudo ufw enable
sudo ufw status
Якщо UFW не використовуєш — переконайся, що 80/443 дозволені в хмарному фаєрволі провайдера.
MySQL Server: установка і базовий захист
sudo apt -y install mysql-server
sudo systemctl enable --now mysql
sudo mysql_secure_installation
Відповідаємо безпечно:
- Увімкнути перевірку надійності паролів (Yes).
- Видалити анонімних користувачів (Yes).
- Заборонити віддалений вхід root (Yes).
- Видалити тестову базу (Yes).
- Перезавантажити привілеї (Yes).
Створюємо базу та користувача для додатка
sudo mysql -u root -p
У консолі MySQL:
CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'S3cureP@ss!';
GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Для віддаленого доступу вказуй хост: “appuser”@’%’ і налаштовуй bind-address/фаєрвол ізольовано.
PHP: установка модулів і тестова сторінка
sudo apt -y install php libapache2-mod-php php-mysql php-cli php-curl php-xml php-zip
php -v
echo '' | sudo tee /var/www/html/info.php
Відкрий у браузері http://<IP>/info.php — побачиш сторінку phpinfo() (потім видали її).
Продакшн-директорія і віртуальний хост Apache
Створимо структуру сайту і файл конфігурації:
sudo mkdir -p /var/www/example.com/public_html
sudo chown -R $USER:$USER /var/www/example.com
sudo nano /var/www/example.com/public_html/index.php
index.php (перевірка PHP):
Створи конфіг /etc/apache2/sites-available/example.com.conf:
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
AllowOverride All
Require all granted
ErrorLog ${APACHE_LOG_DIR}/example_error.log
CustomLog ${APACHE_LOG_DIR}/example_access.log combined
AllowOverride All потрібен, якщо використовуєш .htaccess (перезаписи, кешування тощо).
Активуємо сайт, mod_rewrite і перечитуємо конфіг
sudo a2ensite example.com.conf
sudo a2dissite 000-default.conf
sudo a2enmod rewrite
sudo apache2ctl configtest # Syntax OK
sudo systemctl reload apache2
Перевір сайт за доменом або IP: має відкритися Hello from LAMP!.
Перевірка зв’язку PHP ↔ MySQL (PDO)
Створи /var/www/example.com/public_html/dbtest.php:
PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
echo $pdo->query('SELECT 1')->fetchColumn();
} catch (Throwable $e) { echo $e->getMessage(); }
Відкрий http://example.com/dbtest.php → побачиш 1.
HTTPS за 2 хвилини (бонус)
Якщо домен дивиться на сервер — ставимо безкоштовний сертифікат:
sudo apt -y install certbot python3-certbot-apache
sudo certbot --apache -d example.com -d www.example.com
Certbot автоматично увімкне HTTPS та автооновлення.
Налаштування PHP для продакшну (коротко)
Відредагуй /etc/php/*/apache2/php.ini:
- expose_php = Off
- memory_limit = 256M (за навантаженням)
- upload_max_filesize і post_max_size під твою CMS
- date.timezone = Europe/Kyiv
- Перезапусти Apache: sudo systemctl reload apache2.
Аналоги для AlmaLinux/Rocky/CentOS (RHEL)
sudo dnf -y install httpd mariadb-server php php-mysqlnd php-cli php-xml php-zip php-curl
sudo systemctl enable --now httpd mariadb
sudo mysql_secure_installation
# дальше — те же шаги: создать БД/пользователя, vhost в /etc/httpd/conf.d/site.conf,
# включить firewalld: sudo firewall-cmd --add-service=http --add-service=https --permanent && sudo firewall-cmd --reload
Чек-лист запуску LAMP
- Apache працює, 80/443 відкриті, mod_rewrite увімкнено.
- MySQL захищений, створено appdb і користувача appuser.
- PHP встановлено з необхідними модулями, info.php видалено.
- Віртуальний хост активовано, AllowOverride All налаштовано.
- dbtest.php повертає 1 (PDO працює).
- HTTPS увімкнено (якщо є домен), cron/auto-renew активний.
