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

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

• 6 min read • DevOps • Обновлено 28 Nov 2025
Развёртывание Flask с uWSGI и Nginx
Развёртывание Flask с uWSGI и Nginx

Иллюстрация архитектуры Flask + uWSGI + Nginx

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

Скрин приложения Flask в браузере

Нажмите 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 и имеют безопасные права.

Методика развертывания (мини‑методология)

  1. Подготовка сервера: обновление и установка зависимостей.
  2. Создание окружения и установка зависимостей проекта.
  3. Локальная проверка приложения на 0.0.0.0:5000.
  4. Настройка uWSGI (wsgi + ini) и тестирование сокета.
  5. Создание systemd‑юнита и запуск как службы.
  6. Конфигурация Nginx и проверка через HTTP.
  7. Установка Certbot и перевод на HTTPS.
  8. Тестирование и мониторинг.

Используйте этот порядок и возвращайтесь к предыдущим шагам при ошибках.

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

Администратор (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.

  1. Проверить статус systemd uWSGI:
systemctl status myapp
  1. Проверить логи uWSGI:
journalctl -u myapp -n 200
  1. Проверить Nginx и синтаксис конфигурации:
nginx -t
systemctl restart nginx
journalctl -u nginx -n 200
  1. Если сокет отсутствует — проверить права и что uWSGI запущен.

  2. Если проблема в 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 или облачные сервисы).
Поделиться: 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 быстро