Гид по технологиям

Развёртывание Flask с Gunicorn и Nginx на Ubuntu 22.04

• 7 min read • DevOps • Обновлено 28 Nov 2025
Flask с Gunicorn и Nginx на Ubuntu 22.04
Flask с Gunicorn и Nginx на Ubuntu 22.04

Создайте виртуальное окружение Python, установите Flask и Gunicorn, настройте Supervisor для управления процессами и включите Nginx как обратный прокси к UNIX-сокету Gunicorn. Статья объясняет пошагово команды, примеры конфигураций и даёт рекомендации по отладке, безопасности и масштабированию.

Введение

Flask — это лёгкий микрофреймворк на Python для создания веб‑приложений и API. Он использует Werkzeug и шаблонизатор Jinja2. Flask минималистичен: сам по себе не включает ORM, но предоставляет маршрутизацию URL, шаблоны и расширяемую архитектуру.

Gunicorn (“Green Unicorn”) — WSGI HTTP‑сервер с режимом предфоркинга рабочих процессов. Он идёт промежуточным звеном между вашим приложением и внешним веб‑сервером (например, Nginx). Часто пользуется небольшими ресурсами и прост в конфигурации.

Определения в одну строчку

  • Flask: микрофреймворк для Python.
  • Gunicorn: WSGI HTTP‑сервер для запуска приложения Python.
  • Supervisor: менеджер процессов для автоматического запуска и рестарта.
  • Nginx: высокопроизводительный веб‑сервер, используемый как обратный прокси.

В этом руководстве показано, как развернуть Flask‑приложение на Ubuntu 22.04 с Gunicorn, Supervisor и Nginx, а также даны рекомендации по безопасности, диагностике и настройке производительности.

Основные варианты использования

  • Лёгкое приложение API или сайт, где важна простота настройки.
  • Приложение, которое нужно запускать как сервис с авто‑рестартом.
  • Развёртывание на локальной машине или в VPS без контейнеризации.

Что вы получите в результате

  • Рабочее Flask‑приложение, обслуживаемое Gunicorn через UNIX‑сокет.
  • Supervisor, управляющий процессом Gunicorn.
  • Nginx в роли обратного прокси, принимающий внешние запросы и проксирующий их в сокет.

Преимущества такой архитектуры

  • Nginx обрабатывает статические файлы и SSL, разгружая приложение.
  • Gunicorn оптимизирован под многопроцессную обработку Python‑запросов.
  • Supervisor обеспечивает автоматический рестарт и централизованное логирование.

Схема стека: Flask, Gunicorn, Nginx на Ubuntu

Требования

  • Система Ubuntu 22.04 (Desktop или Server).
  • Пользователь с sudo‑привилегиями (можно использовать root, но для безопасности рекомендуется не работать постоянно под root).

Подготовка нового пользователя

Создайте отдельного системного пользователя для запуска приложения. В примере имя пользователя — james. Это рекомендованная практика: приложение работает от непривилегированного аккаунта.

sudo useradd -m -s /bin/bash james
sudo passwd james
sudo usermod -aG sudo james

Проверьте вход под новым пользователем и получение sudo:

su - james
sudo su

Создание нового пользователя james в Ubuntu

Теперь выйдите из root: нажмите Ctrl+D или выполните команду exit, чтобы вернуться к пользователю james.

Установка зависимостей

Обновите индекс пакетов и установите менеджер пакетов pip, модуль для виртуальных окружений, Nginx и Supervisor.

sudo apt update
sudo apt install python3-pip python3-venv nginx supervisor -y

После установки задайте python3 как альтернативу для команды python (опционально):

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10

Проверьте версии:

python --version
pip --version
python -m venv -h

Установка python3-pip и python3-venv Настройка python по умолчанию Установка Nginx и Supervisor

Создание окружения разработки

Создайте директорию проекта, назначьте владельца и создайте виртуальное окружение:

sudo mkdir -p /var/www/myapp
sudo chown -R james:james /var/www/myapp
sudo chmod 755 /var/www/myapp
cd /var/www/myapp
python -m venv myenv
source myenv/bin/activate

Под виртуальным окружением вы увидите префикс в приглашении командной строки, например (myenv) james@hostname.

Создание виртуального окружения myenv в /var/www/myapp

Установка Flask и Gunicorn

Находясь в активированном виртуальном окружении, установите зависимости:

pip install wheel
pip install flask gunicorn

Если планируете использовать файлы зависимостей, создайте requirements.txt для воспроизводимости:

pip freeze > requirements.txt

Установка Flask и Gunicorn в виртуальном окружении

Создание первого приложения Flask

В каталоге проекта создайте файл myapp.py и шаблон index.html.

Пример простого приложения (обратите внимание на корректный блок запуска):

# myapp.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def hello():
    return render_template('index.html')

if __name__ == '__main__':
    app.run(debug=True)

Создайте директорию шаблонов и файл шаблона:

mkdir -p templates
nano templates/index.html

Простой HTML:


    
        

Hello World!

Запустите приложение локально (только для разработки):

python myapp.py

По умолчанию Flask слушает на localhost:5000. Проверьте ответ с другой сессии:

curl http://127.0.0.1:5000/

Запуск приложения Flask на localhost:5000 Проверка ответа curl от приложения Flask

Остановите разработческий сервер Ctrl+C.

Подготовка WSGI точки входа для Gunicorn

Создайте файл wsgi.py, который экспортирует объект приложения для WSGI‑запуска:

# wsgi.py
from myapp import app

if __name__ == "__main__":
    app.run(debug=True)

Запуск с Gunicorn

Запустите Gunicorn вручную для тестирования:

gunicorn -w 4 --bind 0.0.0.0:8000 wsgi:app
  • -w 4 — 4 рабочих процесса. Рекомендуемая базовая формула: workers = (2 x CPU) + 1, но это эмпирическое правило.
  • –bind 0.0.0.0:8000 — привязка к порту 8000.

Откройте http://:8000/ и вы увидите страницу.

Запуск Gunicorn с 4 рабочими процессами

Нажмите Ctrl+C, чтобы остановить Gunicorn.

Управление Gunicorn через Supervisor

Supervisor удобен для управления процессами: автозапуск, рестарт, простые команды управления.

Создайте конфигурацию Supervisor: /etc/supervisor/conf.d/myapp.conf

[program:myapp]
command=/bin/bash -c 'source /var/www/myapp/myenv/bin/activate && exec gunicorn -w 3 --bind unix:/var/www/myapp/ipc.sock wsgi:app'
directory=/var/www/myapp
user=james
group=www-data
autostart=true
autorestart=true
stdout_logfile=/var/www/myapp/myapp.log
stderr_logfile=/var/www/myapp/error.log
stopsignal=TERM

Важные моменты:

  • Используем UNIX‑сокет для связи между Nginx и Gunicorn — это безопасно и быстро.
  • Права на сокет должен устанавливать процесс Gunicorn (проверьте владельца и группу).
  • stdout_logfile и stderr_logfile помогают собирать логи.

Перезапустите Supervisor и проверьте статус:

sudo systemctl restart supervisor
sudo supervisorctl status
sudo systemctl status supervisor

Проверка статуса Supervisor и процессов

Конфигурация Nginx как обратного прокси

Создайте серверный блок Nginx: /etc/nginx/sites-available/myapp.conf

server {
    listen 80;
    server_name www.myapp.local;

    location / {
        include proxy_params;
        proxy_pass http://unix:/var/www/myapp/ipc.sock;
    }
}

Активируйте конфигурацию и проверьте синтаксис:

sudo ln -s /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

На локальной машине добавьте хост в /etc/hosts:

192.168.5.28 www.myapp.local

Откройте http://www.myapp.local — вы должны увидеть страницу вашего приложения.

Nginx как обратный прокси для сокета Gunicorn

Альтернативы и варианты развёртывания

  • systemd вместо Supervisor: проще интегрировать с системными журналами и управлять сервисами.
  • uWSGI вместо Gunicorn: у uWSGI больше опций и плагинов, но он сложнее в конфигурации.
  • Docker/Kubernetes: для контейнерных развёртываний и оркестрации.

Тонкая настройка Gunicorn и производительность

Рекомендуемые параметры:

  • workers: (2 x CPU) + 1 — отправная точка.
  • threads: использовать при задачах ввода‑вывода; тестируйте.
  • timeout: по умолчанию 30s, при долгих запросах увеличьте.
  • keepalive: полезно при большом количестве коротких соединений.

Пример запуска с дополнительными опциями:

gunicorn -w 5 --threads 2 --timeout 60 --keep-alive 2 --bind unix:/var/www/myapp/ipc.sock wsgi:app

Профилируйте приложение и анализируйте логи перед увеличением количества воркеров.

Безопасность и разрешения

  • Владелец проекта должен быть непривилегированным пользователем (james).
  • Сокет /var/www/myapp/ipc.sock должен принадлежать пользователю и группе, совместимым с процессом Nginx (обычно www-data).
  • Ограничьте разрешения логов и конфигураций: chmod 640 для конфиденциальных файлов при необходимости.
  • Включайте TLS на уровне Nginx (см. раздел ниже про Let’s Encrypt), не теряйте секреты в репозитории.

SELinux/AppArmor

  • Для Ubuntu AppArmor обычно активен; при проблемах с доступом к сокету проверьте профиль AppArmor.
  • При использовании SELinux на других дистрибутивах проверьте корректные контексты для сокетов и бинарей.

Добавление HTTPS через Let’s Encrypt (быстрая инструкция)

  1. Установите certbot и плагин для nginx:
sudo apt install certbot python3-certbot-nginx -y
  1. Запустите автоматическое получение и настройку сертификата:
sudo certbot --nginx -d www.myapp.local
  1. Проверьте автоматическое обновление:
sudo systemctl status certbot.timer
sudo certbot renew --dry-run

Если домен не публичный (локальная сеть), используйте самоподписанный сертификат или проксируйте через публичный обратный прокси.

Диагностика и типовые ошибки

  • Nginx 502 Bad Gateway: проверьте, что Gunicorn создаёт сокет и что путь совпадает.
  • Права отказаны при доступе к сокету: проверьте владельца и права.
  • Supervisor не запускает процесс: проверьте команды в конфиге и лог Supervisor (/var/log/supervisor/).
  • Приложение работает в dev‑режиме: отключите debug=True в продакшене.

Полезные команды для отладки

sudo tail -f /var/www/myapp/myapp.log /var/www/myapp/error.log
sudo journalctl -u nginx -f
sudo supervisorctl tail -f myapp stdout
ss -lpn | grep gunicorn

Критерии приёмки

  • Приложение возвращает корректный HTTP 200 по адресу http://www.myapp.local.
  • Процесс myapp отображается в sudo supervisorctl status как RUNNING.
  • Nginx проверка конфигурации nginx -t возвращает “syntax is ok”.
  • Сокет /var/www/myapp/ipc.sock существует и имеет подходящие права.
  • Логи приложения и ошибок создаются в указанных файлах.

План действий при инциденте

  1. Проверить доступность сервисов: sudo systemctl status nginx, sudo systemctl status supervisor.
  2. Проверить логи Nginx и логи приложения.
  3. Проверить наличие сокета и права на него.
  4. Попробовать перезапустить Supervisor: sudo systemctl restart supervisor; sudo supervisorctl restart myapp.
  5. При поражении сетевого уровня — проверить firewall/ufw: sudo ufw status.

Чек-листы по ролям

Разработчик:

  • Убедиться, что в коде нет debug=True в продакшне.
  • Добавить обработку ошибок и логирование.
  • Подготовить requirements.txt.

Системный администратор:

  • Настроить Supervisor/systemd.
  • Проверить права и владельцев файлов.
  • Настроить HTTPS и ротацию логов.

Инженер по безопасности:

  • Проверить доступы к сокету.
  • Настроить брандмауэр и ограничения доступа.
  • Просмотреть зависимости на уязвимости.

Тесты и критерии приёмки

  • Smoke тест: curl http://www.myapp.local/ — должен вернуть HTML.
  • Нагрузочный тест: прогнать несколько одновременных запросов и мониторить CPU/память.
  • Тесты логирования: убедиться в наличии записей в stdout и stderr логах.

Шаблоны и конфигурации (быстрая шпаргалка)

Пример supervisor конфигурации:

[program:myapp]
command=/bin/bash -c 'source /var/www/myapp/myenv/bin/activate && exec gunicorn -w 3 --bind unix:/var/www/myapp/ipc.sock wsgi:app'
directory=/var/www/myapp
user=james
group=www-data
autostart=true
autorestart=true
stdout_logfile=/var/www/myapp/myapp.log
stderr_logfile=/var/www/myapp/error.log
stopsignal=TERM

Пример nginx конфигурации:

server {
    listen 80;
    server_name www.myapp.local;

    location / {
        include proxy_params;
        proxy_pass http://unix:/var/www/myapp/ipc.sock;
    }
}

Когда этот подход не подходит

  • Для высоконагруженных приложений с миллионами запросов в сутки потребуется горизонтальное масштабирование, балансировка нагрузки и кластеризация.
  • Для сложных деплоёв с множеством зависимостей и окружений предпочтительнее контейнеризация и оркестрация (Docker + Kubernetes).

Рекомендации по миграции и совместимости

  • При переходе с Python 2 на Python 3 убедитесь, что все зависимости совместимы.
  • При миграции с uWSGI на Gunicorn протестируйте рабочие процессы и время отклика.

Резюме

Вы развёрнули Flask‑приложение на Ubuntu 22.04 с Gunicorn, Supervisor и Nginx. Теперь приложение может автоматически перезапускаться, логироваться и обслуживаться через безопасный обратный прокси. Дальше — настройка HTTPS, мониторинга и масштабирования в зависимости от нагрузки.

Важное

  • Не используйте debug=True в продакшн.
  • Контролируйте права на сокет и логи.
  • Тестируйте изменения конфигурации на staging перед продакшеном.

Краткая памятка: шаги развёртывания

  1. Создать пользователя и каталог проекта.
  2. Настроить виртуальное окружение и установить зависимости.
  3. Написать myapp.py и wsgi.py.
  4. Проверить запуск в dev режиме.
  5. Настроить Gunicorn и Supervisor.
  6. Настроить Nginx и протестировать доступ.
  7. Включить HTTPS и мониторинг.

Контакты и дополнительные ресурсы

Для проблем с производительностью используйте профилирование кода, логирование и нагрузочное тестирование. Для вопросов по безопасности — проверяйте зависимости и применяйте обновления безопасности регулярно.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро