Інсталяція стека 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.