Інсталяція стека LEMP в Ubuntu 20.04 та 22.04: покрокова інструкція

Програмний стек LEMP — це комплекс програмного забезпечення, який використовують для обслуговування динамічних вебсторінок та вебзастосунків, написаних на PHP. 

Абревіатура LEMP означає операційну систему Linux з вебсервером Nginx. Дані серверної частини зберігаються у базі даних MySQL, а динамічна обробка виконується PHP.

Про те, що потрібно знати, щоб встановити стек LEMP на сервер під управлінням Ubuntu 20.04 та 22.04, як налаштувати та запустити всі необхідні компоненти — поділимося в матеріалі.

Крок 1. Встановлюємо вебсервер Nginx

Для демонстрації вебсторінок відвідувачам сайту, будемо використовувати сучасний та ефективний вебсервер Nginx. Застосуємо диспетчер пакетів apt для отримання цього програмного забезпечення. Оскільки в цьому сеансі застосуємо apt вперше, потрібно оновити список пакетів сервера. Після цього можна користуватися apt install для встановлення Nginx:

sudo apt update

sudo apt install nginx

Для підтвердження установки потрібно вести Y. Після завершення інсталяції вебсервер Nginx буде активований і працюватиме на сервері Ubuntu 20.04. 

Зверни увагу, якщо у вас увімкнено брандмауер ufw, потрібно дозволити підключення до Nginx. Після встановлення Nginx реєструє кілька різних профілів програм UFW. Щоб перевірити, які з профілів UFW доступні, виконай:

sudo ufw app list

Available applications:

  Nginx Full

  Nginx HTTP

  Nginx HTTPS

  OpenSSH

Варто застосовувати більш обменежий профіль, який буде дозволяти налаштований трафік. Оскільки ти не налаштував SSL для свого сервера, необхідно лише дозволити трафік на порту 80.

Для цього введи:

sudo ufw allow 'Nginx HTTP'

Для перевірки зміни застосуй команду:

sudo ufw status

Результат покаже, що трафік HTTP тепер дозволено.

Після додавання нового правила брандмауера можеш перевірити, чи сервіс запущений, вказавши в браузері доменне ім’я сервера або публічну IP-адресу. Якщо у тебе немає доменного імені, що вказує на твій сервер, і ти не знаєш його публічну IP-адресу, можеш знайти його, ввівши в термінал команду:

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

Вона виведе кілька IP-адрес. Тож зможеш спробувати кожен із них відкрити у своєму браузері, а також перевірити зовнішню IP-адресу через консоль, ввівши команду:

curl -4 icanhazip.com

Після цього введи отриману адресу в браузер і ти потрапиш на сторінку Nginx за замовчуванням:

http://server_domain_or_IP

Якщо бачиш цю сторінку, вітаємо, бо це означає, що ти успішно встановив Nginx і активував трафік HTTP для свого вебсервера.

Крок 2. Інсталюємо MySQL

Тепер необхідно встановити СУБД, що може зберігати дані сайту та керувати ними. MySQL — популярна СУБД, що використовується в середовищах PHP. Використовуй apt для отримання та встановлення цього програмного забезпечення:

sudo apt install mysql-server

Щоб підтвердити встановлення, введи Y, а потім натисни ENTER.

Далі запускай скрипт безпеки, встановлений у MySQL. Він видалятиме деякі небезпечні налаштування за замовчуванням і блокуватиме доступ до системи керування бази даних. Щоб запустити інтерактивний скрипт, виконаємо команду:

sudo mysql_secure_installation

Скрипт запропонує налаштувати плагін VALIDATE PASSWORD PLUGIN.

Цю функцію слід активувати за наявності певних підстав. Якщо вона активована, MySQL відхилятиме паролі, що не відповідають певним критеріям, і показуватиме повідомлення про помилку. Залишити перевірку вимкненою досить безпечно, але для входу до бази даних завжди потрібно використовувати надійні унікальні паролі.

Обери Y для активації або будь-який інший варіант, щоб продовжити без активації цієї функції.

Далі потрібно вибрати рівень перевірки пароля. Якщо вкажеш найвищий рівень 2, система буде виводити повідомлення про помилку при спробі встановлення пароля, який не міститиме цифри, літери у верхньому та нижньому регістрі та спеціальні символи або міститиме поширені словникові слова.

Незалежно від того, чи будеш використовувати плагін VALIDATE PASSWORD PLUGIN, твій сервер запропонує вибрати та підтвердити пароль для користувача root в MySQL. Не потрібно плутати його із системним користувачем root. Користувач root бази даних — це користувач з правами адміністратора, який має всі права на роботу з системою управління бази даних. Хоча в MySQL метод автентифікації користувача root за замовчуванням не вимагає використання пароля навіть за його наявності, але задай надійний пароль для забезпечення додаткового захисту.

Для всіх інших питань потрібно вибирати Y та натискати ENTER у кожному діалозі. Вибравши ці опції, ти видалиш ряд анонімних користувачів і тестову базу даних. Відключиш можливість віддаленого входу користувача root і завантажеш нові правила, щоб внесені зміни негайно активувалися MySQL.

Після цього перевір можливість входу в консоль MySQL:

sudo mysql

Відтак встановиться підключення до сервера MySQL за допомогою користувача root бази даних із правами адміністратора, який виводиться в результаті використання sudo при запуску цієї команди.

Для додаткової безпеки рекомендується мати спеціальні облікові записи користувачів з меншими привілеями, особливо якщо плануєш використовувати кілька баз даних на сервері.

Крок 3. Працюємо над PHP

Отже, що ми маємо? Ти встановив Nginx для обслуговування свого контенту та MySQL для зберігання та керування даними. Тепер можеш інсталювати PHP для обробки коду та генерації динамічного контенту для вебсервера.

Щоб встановити два пакети — php-fpm та php-mysql скористайся наступною командою:

sudo apt install php-fpm php-mysql

Під час надходження запиту введи Y та ENTER для підтвердження установки.

Крок 4. Налаштування Nginx для використання процесора PHP

На Ubuntu 20.04 за замовчуванням є один серверний блок, налаштований для виведення документів із директорії /var/www/html. Хоча це добре працює для окремого сайту, при розміщенні кількох сайтів це може завдавати незручностей. 

Замість зміни /var/www/html ми створимо всередині /var/www структуру директорій для нашого сайту your_domain, залишивши /var/www/html як директорія за замовчуванням для виведення у випадку, якщо запит клієнта не відповідає жодним іншим сайтам.

Створи кореневу вебдиректорію для your_domain таким чином:

sudo mkdir /var/www/your_domain

Потім необхідно призначити права володіння директорію за допомогою змінного середовища $USER, яке буде використовуватися для поточного системного користувача:

sudo chown -R $USER:$USER /var/www/your_domain

Після цього відкрий новий файл конфігурації в директорії Nginx sites-available за допомогою будь-якого редактора командного рядка. Ми будемо використовувати nano:

sudo nano /etc/nginx/sites-available/your_domain

В результаті створили новий порожній файл. Встав наступну шаблонну конфігурацію:

server {

    listen 80;

    server_name your_domain www.your_domain;

    root /var/www/your_domain;

    index index.html index.htm index.php;

    location / {

        try_files $uri $uri/ =404;

    }

    location ~ \.php$ {

        include snippets/fastcgi-php.conf;

        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;

     }

    location ~ /\.ht {

        deny all;

    }

}

Залишимо для тебе описи дії цих директив та блоків розташування:

  • listen визначає, що прослуховуватиме порт Nginx. У цьому випадку він прослуховуватиме порт 80, який використовується за замовчуванням для протоколу HTTP.
  • root — визначає кореневу директорію документа, де зберігаються файли, які обслуговує цей сайт.
  • index — задає для Nginx пріоритет обслуговування файлів індексу для цього сайту. Досить часто вказують файли index.html, які мають найвищий пріоритет у порівнянні з файлами index.php, щоб забезпечити швидке налаштування початкової сторінки у програмах PHP. Можеш змінювати ці налаштування залежно від потреб твоєї програми.
  • server_name — визначає, на які доменні імена та/або IP-адреси має реагувати ваш серверний блок. Ця директива повинна вказувати на доменне ім’я або публічну IP-адресу твого сервера.
  • location / — перший блок розташування включає директиву try_files, яка перевіряє наявність файлів чи директорій, які відповідають запиту URI. Якщо Nginx не зможе знайти відповідний ресурс, буде помилка 404.
  • location ~ \.php$ — цей блок розташування відповідає за фактичну обробку PHP за допомогою вказівки Nginx на конфігураційний файл fastcgi-php.conf і файл php7.4-fpm.sock, який оголошує, який сокет асоційований з php-fpm.
  • location ~ /\.ht — останній блок розташування відповідає за файли .htaccess, які Nginx не обробляє. При додаванні директиви deny all, якщо будь-який із файлів .htaccess потрапить до кореневої директорії документа, то вони не будуть відображатись відвідувачам.

Коли закінчиш редагування, збережи та закрий файл. Якщо використовуєш nano, можна ввести CTRL+X, а потім Y та ENTER для підтвердження.

Далі варто активувати новий конфігураційний файл сайту за допомогою символьного посилання на файл конфігурації з директорії Nginx sites-enabled:

sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

Тоді Nginx буде використовувати цю конфігурацію після перезавантаження. Ти можеш протестувати конфігурацію на наявність помилок синтаксису за допомогою команди:

sudo nginx -t

Якщо є якісь помилки, перед тим, як продовжити, повернись до файлу конфігурації та перевір його зміст. Потім перезавантаж Nginx для внесення необхідних змін:

sudo systemctl reload nginx

Тепер твій новий сайт активний, але коренева вебдиректорія /var/www/your_domain все ще порожня. Створи файл index.html у цьому місці, щоб переконатися, що вебсервер добре працює:

nano /var/www/your_domain/index.html

Далі необхідно розмістити у файлі:

<html>

  <head>

    <title>your_domain website</title>

  </head>

  <body>

    <h1>Hello World!</h1>

    <p>This is the landing page of <strong>your_domain</strong>.</p>

  </body>

</html>

Відкрий браузер і отримай доступ до доменного імені сервера або IP-адреси, як зазначено в директиві server_name у файлі конфігурації серверного блоку:

http://server_domain_or_IP

Ти можеш залишити цей файл як тимчасову початкову сторінку для своєї програми, поки не налаштуєш файл index.php для його заміни. Як тільки зробиш це, не забудь видалити або перейменувати файл index.html з кореневої директорії документів, оскільки він за дефолтом матиме пріоритет перед файлом index.php.

Крок 5. Займаємося інсталяцією стека на Ubuntu 22.04

Коли ти ознайомився з попереднім «варіантом» інсталяції, то тепер покажемо, як це зробити на Ubuntu 22.04. 

  • Оновлюємо Ubuntu

Перед встановленням LEMP стека оновлюємо пакети Ubuntu. Для цього потрібно відкрити термінал та виконати команди:

sudo apt update

sudo apt upgrade

  • Встановлюємо Nginx

Nginx є вебсервером, який дозволяє обслуговувати статичний та динамічний контент. Для встановлення Nginx виконайте такі команди:

sudo apt install nginx

sudo systemctl start nginx

sudo systemctl enable nginx

Після встановлення Nginx можна перевірити роботу вебсервера, відкривши веббраузер і вводити в адресному рядку IP-адресу сервера Ubuntu. Ти маєш побачити сторінку привітання Nginx.

  • Інсталяція MySQL

MySQL є реляційною базою даних, яка використовується для зберігання даних вебзастосунків. Для встановлення MySQL виконай такі команди:

sudo apt install mysql-server

sudo systemctl start mysql

sudo systemctl enable mysql

Далі потрібно налаштувати базу даних та користувача:

sudo mysql_secure_installation

  • Працюємо над PHP 7.4

PHP є скриптовою мовою, яка використовується для створення динамічних вебсторінок. У нашому випадку ми встановимо PHP для роботи в режимі FastCGI:

sudo apt install php-fpm php-mysql

sudo systemctl start php7.4-fpm

sudo systemctl enable php7.4-fpm

  • Налаштовуємо Nginx

Після встановлення всіх компонентів LEMP стека потрібно налаштувати Nginx для роботи з PHP. Для цього потрібно відкрити файл конфігурації Nginx:

sudo nano /etc/nginx/sites-available/default

У цьому файлі потрібно знайти блок-сервер і додати наступні рядки всередині блоку:

location ~ \.php$ {

   include snippets/fastcgi-php.conf;

   fastcgi_pass unix:/run/php/php7.4-fpm.sock;

}

Після внесення змін перезапусти Nginx:

sudo systemctl restart nginx

  • Як перевірити LEMP стек?

Для цього можна створити простий PHP-скрипт та перевірити його роботу через веббраузер.

1) Створи файл index.php у директорії /var/www/html/ за допомогою команди:

sudo nano /var/www/html/index.php

2) Встав наступний код у файл index.php:

<?php phpinfo(); ?>

3) Збережи та закрий файл.

4) Відкрий веббраузер і введи IP-адресу сервера Ubuntu в адресному рядку: http://твій_ip/index.php. Перед тобою має з’явитися сторінка з інформацією про версію PHP, його налаштування та встановлені розширення.

    Приклади конфігурації

    • Конфігурація Nginx для використання SSL

    Для використання SSL необхідно згенерувати самопідписаний сертифікат та додати його до конфігурації Nginx. Ось приклад конфігурації для сайту, що працює на SSL:

    server {

       listen 443 ssl;

       server_name example.com;

       ssl_certificate /path/to/cert.pem;

       ssl_certificate_key /path/to/key.pem;

       location / {

           root /var/www/html;

           index index.html index.htm index.php;

       }

       location ~ \.php$ {

           include snippets/fastcgi-php.conf;

           fastcgi_pass unix:/run/php/php7.4-fpm.sock;

       }

    }

    • Конфігурація Nginx для використання кешу:

    Для збільшення швидкості роботи сайту можна використовувати кеш Nginx, наприклад:

    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache_zone:10m inactive=60m;

    proxy_cache_key "$scheme$request_method$host$request_uri";

    proxy_cache_valid 200 60m;

    proxy_cache_valid 404 1m;

    server {

       listen 80;

       server_name example.com;

       location / {

           proxy_pass http://localhost:8080;

           proxy_set_header Host $host;

           proxy_cache_bypass $http_cache_control;

           add_header X-Cache-Status $upstream_cache_status;

       }

    }

    Конфігурація MySQL для оптимізації RAM

    Конфігурація MySQL для оптимізації використання RAM є одним з важливих завдань при налаштуванні бази даних на сервері. Правильна конфігурація дозволить використовувати ресурси сервера ефективно та скоротити час відповіді бази даних:

    [mysqld]

    key_buffer_size = 16M

    max_allowed_packet = 64M

    thread_stack = 192K

    thread_cache_size = 8

    query_cache_limit = 1M

    query_cache_size = 16M

    innodb_buffer_pool_size = 256M

    innodb_log_buffer_size = 8M

    innodb_flush_log_at_trx_commit = 2

    Розберемо кожний рядок у цій конфігурації:

    • key_buffer_size = 16M: Це розмір буфера індексів для MyISAM таблиць. Збільшення цього значення може покращити продуктивність під час використання таблиць MyISAM.
    • max_allowed_packet = 64M: Це максимальний розмір пакета, який може бути надісланий або отриманий через з’єднання MySQL. Встановлення вищого значення може дозволити надсилати великі обсяги даних, зокрема великі запити або файли.
    • thread_stack = 192K: Це розмір стека потоку. Він визначає, скільки оперативної пам’яті виділяється кожному потоку MySQL. Встановлення цього значення допоможе керувати використанням пам’яті.
    • thread_cache_size = 8: Це кількість потоків, які будуть збережені в кеші для повторного використання. Це може зменшити навантаження на сервер, оскільки MySQL не створюватиме нових потоків при кожному запиті.
    • query_cache_limit = 1M: Це максимальний розмір запиту кешу. Встановлення низького значення допоможе уникнути переповнення кешу запитів.
    • query_cache_size=16M: Це розмір кешу запитів. Цей параметр визначає, скільки пам’яті буде виділено для зберігання результатів запитів у кеші.
    • innodb_buffer_pool_size = 256M: Це розмір буфера пулу пам’яті для InnoDB. Збільшення цього значення може покращити продуктивність під час використання InnoDB.
    • innodb_log_buffer_size = 8M: Це розмір буфера журналу для InnoDB. Він визначає, скільки оперативної пам’яті виділяється для буфера журналу. Встановлення вищого значення може покращити продуктивність під час використання InnoDB.
    • innodb_flush_log_at_trx_commit = 2: Цей параметр визначає, як часто InnoDB повинен записувати дані в журнал при транзакції. Значення «2» означає, що дані записуватимуться кожну секунду, що допоможе поліпшити продуктивність.

    Перш ніж застосовувати таку конфігурацію, потрібно враховувати особливості твоєї програми. Також слід пам’ятати, що ефективна конфігурація залежить від багатьох факторів, таких як розмір бази даних, кількість запитів тощо.

    Ось і все! Ми розібралися з інсталяцією Nginx, MySQL, PHP (LEMP) Ubuntu 20.04 та 22.04. Хочеш освоїти стек LEMP? Залишай заявку на курс АДМІНІСТРУВАННЯ ВЕБСЕРВЕРІВ НА LINUX.

    Залишити відповідь

    Дякуємо, що поділились