До основного вмісту

Встановлення LEMP стеку на VDS (Ubuntu)

VDS / VPS · 18.02.2025 · 4 хв читання
Ілюстрація до статті «Встановлення LEMP стеку на VDS (Ubuntu)»

LEMP — зв'язка Linux, Nginx (вимовляється «engine-x», звідси літера E), MySQL і PHP. На відміну від LAMP з Apache, Nginx обробляє статику і проксує динамічні запити в PHP-FPM окремим сокетом — це менше споживання пам'яті на багато одночасних з'єднань і вимагає явного налаштування мосту між Nginx і PHP.

Встановлення LEMP на Ubuntu 22.04

Порядок важливий лише формально — компоненти незалежні, але зручніше ставити вебсервер першим, щоб одразу бачити, що порт 80 відповідає.

1. Встановлення Nginx

apt update
apt install nginx -y
systemctl enable nginx
systemctl start nginx

# Перевірка: має відповісти заголовок Server: nginx
curl -I http://localhost

2. Встановлення MySQL

apt install mysql-server -y
mysql_secure_installation

Майстер mysql_secure_installation задає пароль root, вимикає анонімних користувачів, забороняє віддалений вхід під root і видаляє тестову базу — усі чотири кроки варто підтверджувати позитивно на продакшн-сервері.

3. Встановлення PHP

apt install php8.2-fpm php8.2-mysql php8.2-curl php8.2-gd php8.2-mbstring php8.2-xml php8.2-zip -y

# Перевірити, що демон FPM запущено і він слухає сокет
systemctl status php8.2-fpm
ls -l /run/php/php8.2-fpm.sock

Модулі підбираються під завдання: php8.2-mysql потрібен для підключення до бази, php8.2-mbstring — для коректної роботи з UTF-8 у CMS на кшталт WordPress, php8.2-gd — для обробки зображень. Перелік конкретних модулів для популярних застосунків зазвичай вказано в їхній документації.

4. Налаштування Nginx для PHP

Відредагуйте /etc/nginx/sites-available/default або створіть окремий конфіг для сайту:

server {
    listen 80;
    server_name yourdomain.com;
    root /var/www/yourdomain.com;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ /\.ht {
        deny all;
    }
}

Директива fastcgi_pass вказує на unix-сокет PHP-FPM — той самий шлях, що показала команда ls із попереднього кроку. Якщо сокет називається інакше (наприклад, заданий TCP-порт 127.0.0.1:9000 у пулі FPM), потрібно вказати саме його.

5. Перезапустіть Nginx

nginx -t && systemctl reload nginx

Перевірка синтаксису командою nginx -t перед reload — не формальність: вона відрізняє помилку в конфігу від реальної проблеми після перезапуску, коли сайт раптом не відкривається.

Розбір типових помилок

502 Bad Gateway — Nginx прийняв запит, але не зміг отримати відповідь від PHP-FPM. Причини зазвичай дві: сокет із fastcgi_pass не збігається з реальним шляхом сокета FPM, або сам процес php8.2-fpm не запущено. Перевіряється командою systemctl status php8.2-fpm і логом /var/log/nginx/error.log, де буде рядок на кшталт connect() to unix:/run/php/php8.2-fpm.sock failed (2: No such file or directory).

Завантаження PHP-файлу замість його виконання у браузері означає, що блок location ~ \.php$ не спрацював — зазвичай через одруківку в регулярному виразі або відсутність fastcgi_params у підключених директивах.

Порівняння LEMP і LAMP

ПараметрLEMP (Nginx)LAMP (Apache)
Модель обробки запитівПодієва, один процес на тисячі з'єднаньПроцеси або потоки на з'єднання (mod_php) або через FPM
Пам'ять на багато з'єднаньНижча за високої конкурентностіВища за mod_php, порівнянна зі зв'язкою з FPM
.htaccessНе підтримується, правила переносяться в конфіг сайтуПідтримується «з коробки»
Поріг входуВищий, потрібно явно налаштовувати зв'язку з PHPНижчий, mod_php працює одразу

Коли LEMP не підходить

  • Застосунок або його інструкція з хостингу жорстко покладається на .htaccess для перевизначення правил на рівні директорії — у Nginx такого механізму немає, усі правила централізовані в конфігу сайту.
  • На сервері вже працює панель керування, яка сама генерує конфігурацію Apache (наприклад, звична зв'язка з cPanel) — змішувати два вебсервери на одному порту без явного проксування не варто.
  • Команда звикла налагоджувати через .htaccess і не має доступу до перезавантаження Nginx (наприклад, на спільному хостингу) — LEMP передбачає контроль над конфігом сервера, а не лише над файлами сайту.

Перевірка результату

  1. Створіть тестовий файл info.php зі вмістом <?php phpinfo(); у корені сайту і відкрийте його в браузері — має відобразитися сторінка конфігурації PHP, а не її вихідний код.
  2. Видаліть info.php одразу після перевірки — ця сторінка розкриває версії ПЗ і шляхи на сервері, лишати її в продакшні не можна.
  3. Перевірте підключення PHP до MySQL: mysql -u root -p -e "SELECT VERSION();" і аналогічний запит через тестовий PHP-скрипт із mysqli або PDO.
  4. Переконайтеся, що всі три сервіси піднімаються автоматично після перезавантаження: systemctl is-enabled nginx mysql php8.2-fpm має повернути enabled для кожного.

Подальше налаштування віртуального хоста, gzip і кешування статики розібрано в статті про налаштування Nginx для сайту на VDS, а прив'язка домену до TLS — у статті про встановлення SSL через Certbot.

Чи була стаття корисною?
← Назад до бази знань Поставити питання підтримці