- Home »

Запуск Flask-приложений с Gunicorn и Nginx на Ubuntu 24.04
В этой статье разберёмся, как быстро и без боли развернуть Flask-приложение на Ubuntu 24.04 с помощью связки Gunicorn и Nginx. Почему это важно? Flask — один из самых популярных Python-фреймворков для веба, а Gunicorn и Nginx — проверенные временем инструменты для продакшн-развёртывания. Если вы когда-либо пытались запускать Flask через встроенный сервер, то знаете: для реального трафика этого мало. Здесь вы найдёте не только пошаговую инструкцию, но и разбор, почему всё устроено именно так, как это работает под капотом, и какие грабли можно встретить на пути. Будет и немного гиковских лайфхаков, и сравнения с альтернативами. Всё, чтобы вы могли быстро поднять свой проект и не тратить часы на гугление и отладку.
Как это работает: архитектура и взаимодействие компонентов
Давайте разложим по полочкам, что происходит, когда вы запускаете Flask-приложение в продакшене. Flask — это микрофреймворк, и его встроенный сервер (Werkzeug) не предназначен для работы под нагрузкой. Он хорош для разработки, но не для продакшна: нет поддержки многопоточности, нет защиты от DoS, нет graceful reload. Поэтому на передний план выходит Gunicorn — WSGI-сервер, который умеет запускать несколько воркеров, обрабатывать множество запросов параллельно и вообще вести себя как взрослый.
Но и Gunicorn — не серебряная пуля. Он не умеет отдавать статику (картинки, CSS, JS) быстро и безопасно, не занимается SSL-терминацией, не умеет балансировать нагрузку между несколькими приложениями. Для этого нужен фронтенд-прокси — и тут появляется Nginx. Он принимает все входящие запросы, раздаёт статику, занимается SSL, а запросы к вашему приложению прокидывает на Gunicorn через сокет или порт.
- Flask — бизнес-логика, API, обработка данных.
- Gunicorn — WSGI-сервер, запускает Flask, управляет воркерами.
- Nginx — фронтенд-прокси, SSL, отдача статики, балансировка.
В итоге получаем надёжную, масштабируемую и быструю схему, которую используют тысячи проектов — от pet-проектов до крупных SaaS.
Как быстро и просто всё настроить: пошаговая инструкция
Переходим к практике. Всё ниже — для Ubuntu 24.04 (но подойдёт и для 22.04, 20.04 с минимальными изменениями). Предполагается, что у вас уже есть VPS или выделенный сервер (если нет — заказать VPS или выделенный сервер).
-
Установка Python, pip, venv
sudo apt update
sudo apt install python3 python3-pip python3-venv -y
-
Создание виртуального окружения и установка зависимостей
python3 -m venv venv
source venv/bin/activate
pip install flask gunicorn
-
Создаём простое Flask-приложение
cat > app.py <<EOF
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, Flask on Gunicorn!"
EOF
-
Проверяем запуск через Gunicorn
gunicorn --bind 0.0.0.0:8000 app:app
Откройтеhttp://your_server_ip:8000
— должно работать. -
Настраиваем systemd для автозапуска Gunicorn
sudo nano /etc/systemd/system/gunicorn.service
Вставьте:[Unit] Description=gunicorn daemon After=network.target [Service] User=ubuntu Group=www-data WorkingDirectory=/home/ubuntu/your_project_folder Environment="PATH=/home/ubuntu/your_project_folder/venv/bin" ExecStart=/home/ubuntu/your_project_folder/venv/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/your_project_folder/gunicorn.sock app:app [Install] WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl status gunicorn
-
Установка и настройка Nginx
sudo apt install nginx -y
sudo nano /etc/nginx/sites-available/flask
Пример конфига:server { listen 80; server_name your_domain_or_ip; location / { proxy_pass http://unix:/home/ubuntu/your_project_folder/gunicorn.sock; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /static { alias /home/ubuntu/your_project_folder/static; } }
sudo ln -s /etc/nginx/sites-available/flask /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
-
Проверяем работу
Откройтеhttp://your_domain_or_ip
— должно работать через Nginx.
Примеры, схемы, практические советы
- Положительный кейс: Flask-приложение на Gunicorn + Nginx выдерживает 1000+ одновременных соединений без падений, статика отдаётся мгновенно, SSL работает из коробки.
- Отрицательный кейс: Flask на встроенном сервере — при 50+ соединениях начинает тормозить, возможны падения, нет логирования ошибок, нет graceful reload.
Схема | Плюсы | Минусы | Когда использовать |
---|---|---|---|
Flask (встроенный сервер) | Быстро для разработки, минимум настроек | Нет продакшн-фич, низкая производительность, нет безопасности | Только для локальной разработки |
Flask + Gunicorn | Многопроцессность, стабильность, логирование | Нет SSL, плохо отдаёт статику | API, внутренние сервисы без SSL/статики |
Flask + Gunicorn + Nginx | SSL, отдача статики, балансировка, безопасность | Чуть сложнее настройка | Продакшн, публичные сервисы |
Похожие решения, альтернативы и утилиты
- uWSGI — альтернатива Gunicorn, чуть сложнее в настройке, но гибче. Документация
- Waitress — простой WSGI-сервер для Windows и Linux. Документация
- Apache + mod_wsgi — старый добрый Apache, но сложнее и тяжелее, чем Nginx.
- Docker — можно завернуть всё в контейнеры, но это отдельная тема.
- supervisor — для управления процессами, если не хочется systemd.
Статистика и сравнение с другими решениями
- Gunicorn + Nginx — стандарт де-факто для Python-приложений, используется в 70% продакшн-проектов (по опросам Stack Overflow и Python Software Foundation).
- uWSGI — чуть менее популярен, но часто используется в крупных проектах с кастомными настройками.
- Waitress — выбор для простых проектов и Windows-серверов.
- Flask + встроенный сервер — только для разработки, не рекомендуется для продакшна.
Интересные факты и нестандартные способы использования
- Gunicorn поддерживает hot reload воркеров без остановки сервиса — удобно для zero-downtime деплоя.
- Nginx можно использовать как реверс-прокси не только для Python, но и для Node.js, Go, PHP — универсальный инструмент.
- Можно запускать несколько Flask-приложений на одном сервере, прокидывая разные сокеты через Nginx.
- Gunicorn поддерживает разные worker-классы: sync, gevent, eventlet — можно подобрать под свои задачи (например, для WebSocket).
- В связке с systemd можно реализовать автоматический рестарт при падении приложения или обновлении кода.
Новые возможности: автоматизация и скрипты
С такой архитектурой легко автоматизировать деплой через Ansible, Fabric, bash-скрипты. Можно быстро масштабировать приложение, просто увеличив количество воркеров Gunicorn или подняв несколько инстансов на разных портах/сокетах. Nginx позволяет балансировать нагрузку между ними, а systemd — следить за состоянием процессов.
- Быстрый rollback: просто переключить сокет или порт в конфиге Nginx.
- Zero-downtime деплой: перезапускать Gunicorn воркеры по одному, не теряя соединений.
- Мониторинг: логирование ошибок и запросов через systemd и Nginx.
- Безопасность: ограничение доступа к приложению через firewall, SSL-терминация на Nginx.
Выводы и рекомендации
Связка Flask + Gunicorn + Nginx — это золотой стандарт для развёртывания Python-приложений в продакшене. Она даёт стабильность, масштабируемость, безопасность и гибкость. Даже если вы только начинаете, настройка не займёт много времени, а результат будет радовать и в плане производительности, и в плане удобства обслуживания. Не забывайте про автоматизацию — с systemd и Nginx можно строить сложные схемы деплоя и масштабирования. Если нужен VPS или выделенный сервер для таких задач — выбирайте VPS или выделенный сервер под свои нужды.
Официальные ссылки для самостоятельного изучения:
Если остались вопросы — смело пишите в комментарии, делитесь своими кейсами и лайфхаками. Flask + Gunicorn + Nginx — это не только про надёжность, но и про удовольствие от работы с сервером!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.