Развёртывание 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 обеспечивает автоматический рестарт и централизованное логирование.

Требования
- Система 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
Теперь выйдите из 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

Создание окружения разработки
Создайте директорию проекта, назначьте владельца и создайте виртуальное окружение:
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.

Установка Flask и Gunicorn
Находясь в активированном виртуальном окружении, установите зависимости:
pip install wheel
pip install flask gunicornЕсли планируете использовать файлы зависимостей, создайте requirements.txt для воспроизводимости:
pip freeze > requirements.txt
Создание первого приложения 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/

Остановите разработческий сервер 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://

Нажмите 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
Конфигурация 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 — вы должны увидеть страницу вашего приложения.

Альтернативы и варианты развёртывания
- 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 (быстрая инструкция)
- Установите certbot и плагин для nginx:
sudo apt install certbot python3-certbot-nginx -y- Запустите автоматическое получение и настройку сертификата:
sudo certbot --nginx -d www.myapp.local- Проверьте автоматическое обновление:
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 существует и имеет подходящие права.
- Логи приложения и ошибок создаются в указанных файлах.
План действий при инциденте
- Проверить доступность сервисов: sudo systemctl status nginx, sudo systemctl status supervisor.
- Проверить логи Nginx и логи приложения.
- Проверить наличие сокета и права на него.
- Попробовать перезапустить Supervisor: sudo systemctl restart supervisor; sudo supervisorctl restart myapp.
- При поражении сетевого уровня — проверить 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 перед продакшеном.
Краткая памятка: шаги развёртывания
- Создать пользователя и каталог проекта.
- Настроить виртуальное окружение и установить зависимости.
- Написать myapp.py и wsgi.py.
- Проверить запуск в dev режиме.
- Настроить Gunicorn и Supervisor.
- Настроить Nginx и протестировать доступ.
- Включить HTTPS и мониторинг.
Контакты и дополнительные ресурсы
Для проблем с производительностью используйте профилирование кода, логирование и нагрузочное тестирование. Для вопросов по безопасности — проверяйте зависимости и применяйте обновления безопасности регулярно.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента