Развёртывание Flask с uWSGI и Nginx на Ubuntu 20.04

Flask — лёгкий веб‑фреймворк на Python, разработанный Армином Ронэкером. “Микро” означает, что в основе — компактное ядро, легко расширяемое сторонними библиотеками. Flask подходит для быстрого прототипирования и для production‑развёртываний в связке с uWSGI и Nginx.
Краткие определения:
- Flask: веб‑фреймворк для Python, простой и расширяемый.
- uWSGI: WSGI/HTTP сервер для запуска Python‑приложений в продакшне.
- Nginx: быстрый веб‑сервер и обратный прокси.
Что нужно иметь заранее
- Сервер с Ubuntu 20.04 (доступ по SSH).
- Домен, указывающий на IP сервера (например, flask.example.com).
- Пароль root или пользователь с sudo.
Важно: используйте непривилегированный пользователя (или www-data) для сервера приложений и храните приватные ключи в защищённом каталоге.
Начало работы — обновление пакетов
Обновите список пакетов и установите обновления:
apt-get update -yПосле обновления можно переходить дальше.
Установка зависимостей
Установим Nginx, инструменты сборки и Python‑пакеты для разработки:
apt-get install nginx python3-pip python3-dev python3-venv build-essential libssl-dev libffi-dev python3-setuptools -yПримечание: при необходимости замените python3 на конкретную версию в дистрибутиве.
Создание виртуального окружения
Виртуальное окружение изолирует зависимости вашего проекта.
Создайте каталог приложения и окружение:
mkdir /var/www/html/myappПерейдите в каталог и создайте виртуальное окружение:
cd /var/www/html/myapp
python3.8 -m venv myappenvАктивируйте окружение:
source myappenv/bin/activateПримечание: если у вас нет python3.8, используйте python3 или установленную версию.
Настройка простого Flask‑приложения
Установите Flask и uWSGI в активированном окружении:
pip install uwsgi flaskСоздайте файл приложения:
nano /var/www/html/myapp/myapp.pyДобавьте код:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hi This is My Flask Application
"
if __name__ == "__main__":
app.run(host='0.0.0.0')
Запустите приложение для быстрой проверки:
python /var/www/html/myapp/myapp.pyОжидаемый вывод:
* Serving Flask app "myapp" (lazy loading)
* Environment: production
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
Откройте в браузере http://your-server-ip:5000 — вы должны увидеть страницу приложения.

Нажмите CTRL+C в терминале, чтобы остановить тестовый сервер.
Создание WSGI‑точки входа и тест uWSGI
Создайте wsgi.py, который импортирует экземпляр приложения:
nano /var/www/html/myapp/wsgi.pyДобавьте:
from myapp import app
if __name__ == "__main__":
app.run()
Проверьте, что uWSGI может обслужить приложение (из виртуального окружения или глобально, если uwsgi доступен):
uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi:appОткройте http://your-server-ip:5000 для проверки. Остановка — CTRL+C.
Затем выйдите из виртуального окружения:
deactivateКонфигурация uWSGI через ini
Создайте конфигурационный файл uWSGI:
nano /var/www/html/myapp/myapp.iniДобавьте:
[uwsgi]
module = wsgi:app
master = true
processes = 5
socket = myapp.sock
chmod-socket = 660
vacuum = true
die-on-term = true
Пояснения:
- module — модуль и объект WSGI (wsgi:app означает wsgi.py и переменная app).
- socket и chmod-socket — создают unix-сокет с нужными правами.
- vacuum удаляет сокет при остановке.
Создание systemd‑сервиса для uWSGI
Чтобы управлять приложением, создадим systemd‑юнит:
nano /etc/systemd/system/myapp.serviceВставьте:
[Unit]
Description=uWSGI instance to serve myapp
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/html/myapp
Environment="PATH=/var/www/html/myapp/myappenv/bin"
ExecStart=/var/www/html/myapp/myappenv/bin/uwsgi --ini myapp.ini
[Install]
WantedBy=multi-user.target
Примените изменения и перезапустите systemd:
systemctl daemon-reloadУстановите владельца и права:
chown -R www-data:www-data /var/www/html/myapp
chmod -R 775 /var/www/html/myappЗапустите и включите сервис при старте:
systemctl start myapp
systemctl enable myappПроверьте статус:
systemctl status myappОжидаемый пример вывода покажет активный процесс uWSGI с несколькими воркерами.
Настройка Nginx как обратного прокси
Создайте конфигурацию сайта:
nano /etc/nginx/sites-available/flask.confДобавьте:
server {
listen 80;
server_name flask.example.com;
location / {
include uwsgi_params;
uwsgi_pass unix:/var/www/html/myapp/myapp.sock;
}
}
Проверьте синтаксис Nginx и активируйте сайт:
nginx -t
ln -s /etc/nginx/sites-available/flask.conf /etc/nginx/sites-enabled/
systemctl restart nginxТеперь Nginx перенаправляет запросы на unix‑сокет uWSGI.
Защита сайта бесплатным SSL от Let’s Encrypt
Установите Certbot для Nginx и запросите сертификат:
apt-get install python3-certbot-nginx -y
certbot --nginx -d flask.example.comВ процессе вводите рабочий e‑mail и соглашайтесь с условиями. Certbot предложит опцию перенаправления HTTP на HTTPS — для нового сайта рекомендуется выбрать перенаправление.
После успешной установки сертификата вы увидите путь к файлам сертификата, инструкции по обновлению (certbot renew) и рекомендации по резервному копированию каталога /etc/letsencrypt.
Важные примечания и рекомендации
- Используйте unix‑сокеты (uwsgi_pass unix:…) для лучшей производительности и безопасности на одном хосте.
- Для нескольких приложений используйте разные soket‑файлы и systemd‑юниты.
- Регулярно обновляйте пакеты и обновляйте виртуальное окружение.
Критерии приёмки
- Приложение отвечает по HTTPS на flask.example.com.
- systemd‑сервис myapp активен и автозапускается после перезагрузки.
- Логи Nginx и uWSGI не содержат критических ошибок при старте.
- Разделение прав: файлы принадлежат www-data и имеют безопасные права.
Методика развертывания (мини‑методология)
- Подготовка сервера: обновление и установка зависимостей.
- Создание окружения и установка зависимостей проекта.
- Локальная проверка приложения на 0.0.0.0:5000.
- Настройка uWSGI (wsgi + ini) и тестирование сокета.
- Создание systemd‑юнита и запуск как службы.
- Конфигурация Nginx и проверка через HTTP.
- Установка Certbot и перевод на HTTPS.
- Тестирование и мониторинг.
Используйте этот порядок и возвращайтесь к предыдущим шагам при ошибках.
Чек-листы по ролям
Администратор (Sysadmin):
- Проверил доступы по SSH и резервное копирование.
- Установил Nginx, Certbot и зависимости системы.
- Настроил systemd и права доступа.
Разработчик (Developer):
- Подготовил requirements, протестировал приложение локально.
- Обновил wsgi.py и проверил совместимость зависимостей.
Оператор (SRE):
- Настроил мониторинг процессов uWSGI.
- Проверил SSL‑конфигурацию и настройку автоматического продления certbot.
Быстрый справочник / сниппеты
- Перезапустить uWSGI‑сервис:
systemctl restart myapp- Просмотреть логи uWSGI через journal:
journalctl -u myapp -f- Ручное обновление сертификатов (тест):
certbot renew --dry-run- Проверка прав на сокет:
ls -l /var/www/html/myapp/myapp.sockБезопасность и жёсткие настройки
- Запускайте uWSGI от пользователя www-data. Не запускайте от root.
- Ограничьте доступ к сокету через права (chmod-socket = 660) и владельца.
- Настройте firewall (ufw) — разрешите только порты 22, 80, 443.
Пример UFW:
ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw enable- Регулярно применяйте обновления безопасности (apt upgrade).
- Защитите директории /etc/letsencrypt и /var/www/html от несанкционированного доступа.
План восстановления и отладочный runbook
Симптом: сайт недоступен по HTTPS.
- Проверить статус systemd uWSGI:
systemctl status myapp- Проверить логи uWSGI:
journalctl -u myapp -n 200- Проверить Nginx и синтаксис конфигурации:
nginx -t
systemctl restart nginx
journalctl -u nginx -n 200Если сокет отсутствует — проверить права и что uWSGI запущен.
Если проблема в SSL — выполнить certbot renew –dry-run и изучить вывод.
Откат: если недавние правки в /etc/nginx приводят к ошибке, верните предыдущую конфигурацию из бэкапа и перезапустите nginx.
Тесты и критерии приёмки
- GET / возвращает HTTP 200 и HTML, содержащий текст “My Flask Application”.
- systemctl status myapp показывает Active: active (running).
- nginx -t возвращает success.
- certbot renew –dry-run проходит без ошибок.
Глоссарий — 1 строка для ключевых терминов
- WSGI: интерфейс между веб‑сервером и Python‑приложением.
- uWSGI: сервер, реализующий WSGI и управляющий воркерами.
- virtualenv: изолированное окружение Python.
- systemd: системный менеджер служб в Linux.
Частые ошибки и когда этот подход не подходит
Когда не подходит:
- Для сервисов с высокочастотными подключениями (WebSocket) может потребоваться дополнительная настройка uWSGI или использование других серверов (Gunicorn + managers).
- На хостингах без поддержки unix‑сокетов или без доступа к systemd (shared hosting) потребуется другая схема развёртывания.
Типичные ошибки:
- Неверные права на сокет — Nginx не может присоединиться.
- Неправильный путь в ExecStart systemd — сервис не стартует.
- Certbot не может пройти http‑01 challenge — проверьте DNS и доступность порта 80.
Итог
Поздравляем — вы настроили Flask‑приложение под uWSGI и Nginx, оформили systemd‑юнит и включили HTTPS через Let’s Encrypt. Дальше рекомендуем подключить логирование, мониторинг работоспособности и автоматическое обновление сертификатов.
Важно: проверяйте конфигурации на тестовом сервере перед применением в продакшне.
Краткое резюме и шаги далее — в блоке “Что дальше” ниже.
Что дальше:
- Настройте логирование (rotate) для uWSGI и Nginx.
- Подумайте о CI/CD для автоматического деплоя.
- Настройте бэкапы и мониторинг (Prometheus/Grafana или облачные сервисы).
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента