Дізнайтеся, як контейнеризувати ваш Flask проєкт, розгорнути кілька екземплярів і використовувати NGINX для безперебійного розподілу трафіку.
💡 Вступ
Ласкаво просимо в світ досліджень!
Сьогодні ми зануримося в захоплюючий експеримент з використанням NGINX як балансувальника навантаження, щоб побачити, як ми можемо розподіляти трафік між кількома екземплярами додатка. Для тих, хто тут новий, я регулярно пишу блоги про проєкти DevOps, експериментуючи з різними інструментами та технологіями. Якщо ви зацікавлені в розгортанні проєктів у хмарі, ознайомтеся з моїм останнім блогом про Як розгорнути Flask проєкт на AWS Elastic Beanstalk.
У цьому проєкті ми повернемося до того ж проєкту Flask портфоліо і зробимо крок вперед. Ось що ми будемо робити:
1. Створимо три Docker-образи проєкту з невеликими змінами (змінимо колір навігаційної панелі) і назвемо їх _v1_
, _v2_
і _v3_
.
2. Використаємо файл Docker Compose для запуску цих трьох версій додатка на окремих портах.
3. Встановимо NGINX, змінимо його конфігураційний файл і використовуємо його як балансувальник навантаження для рівномірного розподілу трафіку між цими версіями.
💡 Попередні вимоги
Перш ніж розпочати проєкт, давайте переконаємося, що у нас є все необхідне:
- Базові знання Docker і Docker Compose: Якщо ви новачок в цих інструментах, не переживайте! Docker дозволяє контейнеризувати додатки, а Docker Compose допомагає легко керувати багатоконтейнерними налаштуваннями.
💡 Розуміння NGINX як балансувальника навантаження
Перш ніж приступити до практичного демонстраційного прикладу, давайте коротко розглянемо, що таке NGINX і як він працює як балансувальник навантаження.
Простими словами, NGINX — це сервер зворотного проксі, який обробляє HTTP-запити і дозволяє нам розміщувати веб-додатки на сервері. Одна з його ключових можливостей — діяти як балансувальник навантаження, спрямовуючи вхідний трафік до кількох серверів для кращого управління навантаженням, покращення продуктивності та ефективності.
Методи балансування навантаження в NGINX
- Round-Robin (за замовчуванням): Розподіляє запити по черзі і циклічно між серверами в групі.
- Найменше з’єднань: Спрямовує трафік на сервер з найменшою кількістю активних з’єднань.
- Інші: NGINX підтримує більш складні методи, орієнтовані на специфічні потреби.
Додаткові можливості NGINX
- Кешування: Тимчасово зберігає дані для покращення продуктивності шляхом зменшення необхідності їх постійного запиту.
- Проксі: Діє як єдина точка входу для доступу в інтернет, забезпечуючи безпеку всіх підключених серверів за допомогою HTTPS. Це зменшує рівень ризику, консолідує безпеку та централізує журнали й моніторинг.
- Компресія: Компресує великі файли (наприклад, відео високої якості), щоб зекономити пропускну здатність і покращити час завантаження.
Також підтримується сегментація, розбиття великих файлів на менші частини для ефективного стрімінгу.
Конфігурації NGINX зберігаються у файлі nginx.conf
, зазвичай розташованому в /etc/nginx/
.
Чому вибрати NGINX замість Apache?
- Продуктивність: NGINX швидший і легший.
- Статичні файли: Він найкраще підходить для обслуговування статичних файлів і роботи високопродуктивних веб-серверів.
- Простота: Конфігурації прості та зручні для управління.
Досить теорії! Давайте перейдемо до демонстрації і реалізуємо наше налаштування.
💡 Створення проєкту
Тепер давайте займемося практикою! Дотримуйтесь цих кроків, щоб створити та налаштувати ваше Flask портфоліо.
Крок 1: Клонування репозиторію
Почніть з того, щоб перейти до мого репозиторію на GitHub, ebs-demo, і клонувати проєкт:
git clone https://github.com/Pravesh-Sudha/ebs-demo.git
Цей репозиторій містить базовий Flask портфоліо проєкт разом з Dockerfile
, щоб створити Docker образ додатка.
Крок 2: Створення Docker образів
Перейдіть у директорію проєкту:
cd ebs-demo
Створіть першу версію (v1
) додатка за допомогою команди docker build
:
docker build -t /flask-portfolio-app:v1 .
Це створить Docker образ з іменем flask-portfolio-app:v1
.
Тепер створимо ще дві версії: v2
і v3
з деякими змінами. Ось як:
- Відкрийте файл
static/style.css
в директорії проєкту. - У секції Navbar змініть колір
background
на інший для кожної версії.
Тепер створіть додаткові версії:
docker build -t /flask-portfolio-app:v2 .
docker build -t /flask-portfolio-app:v3 .
Не забудьте знову змінити колір background
перед створенням v3
, щоб кожна версія мала унікальний вигляд.
Крок 3: Завантаження образів на DockerHub
Після того, як ви створили три версії, увійдіть у DockerHub:
docker login
Введіть ваші ім’я користувача та пароль для DockerHub (або PAT токен).
Завантажте образи на ваш DockerHub акаунт:
docker push /flask-portfolio-app:v1
docker push /flask-portfolio-app:v2
docker push /flask-portfolio-app:v3
Крок 4: Запуск додатків за допомогою Docker Compose
Тепер, коли образи завантажено, давайте використаємо файл docker-compose.yaml
у директорії проєкту, щоб запустити всі три версії одночасно:
- Відкрийте файл
docker-compose.yaml
.
2.
Також підтримується сегментація, що дозволяє розбивати великі файли на менші частини для ефективного стрімінгу.
Конфігурації NGINX зберігаються у файлі nginx.conf
, який зазвичай розташований у /etc/nginx/
.
Чому вибрати NGINX замість Apache?
- Продуктивність: NGINX швидший і легший.
- Статичні файли: Він найкраще підходить для обслуговування статичних файлів і роботи високопродуктивних веб-серверів.
- Простота: Конфігурації прості та зручні для управління.
Досить теорії! Давайте перейдемо до демонстрації і реалізуємо наше налаштування.
💡 Створення проєкту
Тепер давайте займемося практикою! Дотримуйтесь цих кроків, щоб створити та налаштувати ваше Flask портфоліо.
Крок 1: Клонування репозиторію
Почніть з того, щоб перейти до мого репозиторію на GitHub, ebs-demo, і клонувати проєкт:
git clone https://github.com/Pravesh-Sudha/ebs-demo.git
Цей репозиторій містить базовий Flask портфоліо проєкт разом з Dockerfile
, щоб створити Docker образ додатка.
Крок 2: Створення Docker образів
Перейдіть у директорію проєкту:
cd ebs-demo
Створіть першу версію (v1
) додатка за допомогою команди docker build
:
docker build -t /flask-portfolio-app:v1 .
Це створить Docker образ з іменем flask-portfolio-app:v1
.
Тепер створимо ще дві версії: v2
і v3
з деякими змінами. Ось як:
- Відкрийте файл
static/style.css
в директорії проєкту. - У секції Navbar змініть колір
background
на інший для кожної версії.
Тепер створіть додаткові версії:
docker build -t /flask-portfolio-app:v2 .
docker build -t /flask-portfolio-app:v3 .
Не забудьте знову змінити колір background
перед створенням v3
, щоб кожна версія мала унікальний вигляд.
Крок 3: Завантаження образів на DockerHub
Після того, як ви створили три версії, увійдіть у DockerHub:
docker login
Введіть ваші ім’я користувача та пароль для DockerHub (або PAT токен).
Завантажте образи на ваш DockerHub акаунт:
docker push /flask-portfolio-app:v1
docker push /flask-portfolio-app:v2
docker push /flask-portfolio-app:v3
Крок 4: Запуск додатків за допомогою Docker Compose
Тепер, коли образи завантажено, давайте використаємо файл docker-compose.yaml
у директорії проєкту, щоб запустити всі три версії одночасно:
- Відкрийте файл
docker-compose.yaml
. - Оновіть імена образів, щоб вони відповідали вашим DockerHub образам (
/flask-portfolio-app:v1
,v2
,v3
).
Запустіть усі три додатки одночасно:
docker-compose up
Ви побачите три різні версії вашого додатка, що працюють на різних портах:
- Версія 1:
http://localhost:5000
- Версія 2:
http://localhost:5001
- Версія 3:
http://localhost:5002
💡 Встановлення та налаштування NGINX для балансування навантаження
Тепер, коли ми маємо три Flask додатки, що працюють на різних портах, саме час налаштувати NGINX як балансувальник навантаження, щоб розподіляти трафік між цими інстанціями.
Крок 1: Встановлення NGINX
Залежно від вашої операційної системи, використовуйте наступні команди для встановлення NGINX:
- Для macOS:
brew install nginx
- Для Linux:
sudo apt install nginx -y
Крок 2: Знайдіть файл конфігурації NGINX
Після встановлення знайдіть стандартний файл nginx.conf
, використовуючи команду:
nginx -h
Виведення покаже місце розташування файлу конфігурації. Перейдіть до цієї директорії, щоб відредагувати файл nginx.conf
.
Крок 3: Оновіть файл nginx.conf
Замість вмісту файлу nginx.conf
вставте наступну конфігурацію:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
# Визначте кластер Flask серверів
upstream flask_cluster {
server 127.0.0.1:5000;
server 127.0.0.1:5001;
server 127.0.0.1:5002;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://flask_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
Що робить ця конфігурація?
upstream flask_cluster
: Це визначає три Flask додатки, що працюють на127.0.0.1:5000
,5001
і5002
.listen 8080
: Встановлює сервер NGINX на прослуховування порту 8080.proxy_pass
: Перенаправляє запити наflask_cluster
.- Заголовки: Директиви
proxy_set_header
гарантують, що дані клієнта, як-от хост і IP-адреса, зберігаються, коли запити передаються Flask серверам.
Крок 4: Перезапуск NGINX
Після оновлення конфігурації збережіть файл і перезапустіть NGINX, щоб застосувати зміни:
nginx -s reload
Крок 5: Перевірка налаштувань
Переконайтеся, що ваші Docker контейнери працюють, використовуючи команду:
docker-compose up
Тепер перейдіть на http://localhost:8080
у вашому браузері. NGINX буде балансувати трафік між трьома версіями вашого Flask додатка, безперешкодно розподіляючи запити між v1
, v2
і v3
. Кожного разу, коли ви перезавантажите сторінку, ви побачите іншу версію.
Перевірте результат у цьому посту!
💡 Висновок
Вітаємо! 🎉 Ви успішно налаштували балансоване навантаження для Flask портфоліо проєкту за допомогою Docker контейнерів та NGINX. Ось що ми досягли в цьому проєкті:
- Створили три версії Flask додатка з незначними візуальними відмінностями.
- Контейнеризували додатки за допомогою Docker і завантажили образи на Docker Hub.
- Використали Docker Compose для запуску трьох інстанцій додатка на різних портах.
- Налаштували NGINX як балансувальник навантаження для розподілу трафіку між цими інстанціями.
Цей практичний проєкт демонструє можливості поєднання Docker та NGINX для створення масштабованих, високопродуктивних додатків.
Функція балансування навантаження гарантує ефективний розподіл трафіку між кількома інстанціями, покращуючи надійність додатка та користувацький досвід.
Не соромтеся експериментувати далі, налаштовуючи конфігурацію NGINX, вивчаючи передові алгоритми балансування навантаження або інтегруючи HTTPS для безпечних з'єднань.
Якщо вам сподобався цей блог, обов'язково перегляньте мої інші публікації про проєкти DevOps та інструменти. Продовжуємо вчитися та створювати!
🚀 Для отримання більше корисних блогів, підписуйтеся на мене в Hashnode, X(Twitter) та LinkedIn.
До зустрічі, щасливого кодування! 🚀
Перекладено з: Scaling Flask with Docker: Deploying a Portfolio Project with NGINX Load Balancing