Обслуживание приложений Flask с помощью Nginx и Gunicorn в Ubuntu

    Команда Simple-Server
    03.06.2026
    8 мин

    Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.

    Кратко о задаче

    Нам понадобится хост с предустановленной Ubuntu. Желательно создать на сервере обычного пользователя с правами sudo. Например, арендуйте готовую к эксплуатации удаленную машину у провайдера Simple-Server.

    1. Инсталлировать веб-сервер Nginx.
    2. Зарегистрировать домен.
    3. Настроить записи DNS:
    * А с указанием публичного IP в графе `your_domain`. * А аналогично, но с добавлением `www`.
    • А с указанием публичного IP в графе your_domain.
    • А аналогично, но с добавлением www.

    Желательно иметь представление о спецификации WSGI. Это поможет понять, как Gunicorn обменивается данными и командами с приложениями Flask.

    В рамках подготовки к работе постановим менеджер pip, с его помощью мы будем манипулировать компонентами Python. Плюс скачаем файлы, требуемые для создания ряда элементов Gunicorn. Но предварительно скачаем обновления пакетов и установим python3-pip, он нужен для организации среды разработки:

    sudo apt update sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools

    Зададим настройки виртуальной среде Python

    Виртуальные окружения позволяют разделять зависимости приложений, размещенных на одном сервере. Первый этап:

    sudo apt install python3-venv

    Вторым этапом сделаем родительскую директорию, где будем хранить весь проект Flask. И сразу перейдем в нее:

    mkdir ~/myproject cd ~/myproject

    Третьим этапом организуем непосредственно виртуальную среду Python:

    python3 -m venv myprojectenv

    Все используемые впоследствии файлы будут сохраняться в папке myprojectenv. Остается провести активацию:

    source myprojectenv/bin/activate

    Результат будет заметен по изменившемуся виду командной строки. Она примет такой вид:

    (myprojectenv)user@host:~/myproject$

    Настроим приложение Flask

    Следом загрузим**** Flask и Gunicorn:

    pip install gunicorn flask

    Теперь применим Flask для создания простейшей программы. Но важно учитывать, что данную микроструктуру чаще берут в качестве дополнительного модуля, т.к. в ней минимум инструментов из тех, что обычно актуальны при веб-разработке. В качестве примера создадим простой вариант под названием myproject.py:

    nano ~/myproject/myproject.py

    В указанный файл мы сохраним код программы. При запуске будет импортирован Flask и создан экземпляр объекта. Например, вот так:

    from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "<h >Hello!<h1>" if __name__ == "__main__": app.run(host='0.0.0.0')

    После внесения изменений закройте файл с сохранением. Теперь проверим работоспособность кода, но сначала настроим брандмауэр, чтобы тот разрешал трафик по порту 5000.

    Теперь система готова к тесту программного модуля Flask:

    Теперь откроем наш домен по IP с указанием порта:

    http://your_server_ip:5000

    В окне браузера увидим «Hello!». Завершим сессию и отключим сервер нажатием комбинации <Ctrl+C> (в терминале).

    Переходим к созданию файла, который послужит нам точкой входа в разрабатываемую программу. Он «подскажет» серверу Gunicorn, каким образом обмениваться данными с ним.

    Перенесем экземпляр Flask в только что созданный файл, после чего откроем его:

    from myproject import app if __name__ == "__main__": app.run()

    Перед продолжением работы убедимся, что сервер Gunicorn способен правильно обрабатывать нашу программу. Выполняется это передачей наименования точки входа без расширения и имени вызываемого элемента. Возьмем, например, wsgi:app. Еще в команде понадобится указать номер порта с интерфейсом:

    cd ~/myproject gunicorn --bind 0.0.0.0:5000 wsgi:app

    Перейдем в браузер и введем IP нашего сервера с портом под номером 5000:

    http://your_server_ip:5000

    Программа выдаст сообщение «Hello!». Завершим работу нажатием кнопок <Ctrl + C> в окне терминала. И отключим виртуальную среду:

    После этого все команды Python будут иметь отношение только к общей системной среде. Если работать с виртуальной придется постоянно, есть смысл запускать ее автоматически вместе с операционкой. С этой целью сгенерируем файл автозагрузки. Сначала создадим *.service и разместим в папке /etc/systemd/system:

    sudo nano /etc/systemd/system/myproject.service

    Первоначально [Unit], куда обычно вносят метаданные и зависимости, внесем описание службы и зададим условие инициализировать «виртуалку» после подтверждения наличия связи:

    [Unit] Description=Gunicorn instance to serve myproject After=network.target

    В блоке [Service] укажем аккаунт и группу, от имени которых будет запускаться процесс.

    [Unit] Description=Gunicorn instance to serve myproject After=network.target [Service] User=username Group=www-data

    Следующим шагом укажем переменную PATH, чтобы при активизации система сразу «понимала», где брать требуемые файлы (в «виртуалке»).

    [Unit] Description=Gunicorn instance to serve myproject After=network.target [Service] User=username Group=www-data WorkingDirectory=/home/username/myproject Environment="PATH=/home/username/myproject/myprojectenv/bin" ExecStart=/home/username/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app

    Следует учитывать, что для systemd нужно указывать полный путь к файлу Gunicorn, размещенному в «виртуалке».

    В итоге добавим раздел [Install] и внесем в него:

    [Unit] Description=Gunicorn instance to serve myproject After=network.target [Service] User=username Group=www-data WorkingDirectory=/home/username/myproject Environment="PATH=/home/username/myproject/myprojectenv/bin" ExecStart=/home/username/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app [Install] WantedBy=multi-user.target

    Все, файл systemd подготовлен. Закройте его с сохранением изменений. И можно запускать службу Guricorn (сразу настроим ее загрузку вместе с операционкой):

    sudo systemctl start myproject sudo systemctl enable myproject

    Остается проверить ее текущее состояние:

    sudo systemctl status myproject

    Переходим к работе с веб-сервером Nginx (Gunicorn не используется в качестве фронтенд-сервера, и обычно настраивается реверс-прокси. В нашем случае это будет Nginx). Сначала создадим файл с конфигурацией в директории с sites-available, назовем его myproject.

    sudo nano /etc/nginx/sites-available/myproject

    В нем укажем веб-серверу прослушивать порт 80 и использовать серверный блок при всех запросах нашего домена:

    server { listen 80; server_name your_domain www.your_domain; }

    Следом добавим location, где укажем proxy_params, определяющий параметры настраиваемого прокси.

    server { listen 80; server_name your_domain www.your_domain; location / { include proxy_params; proxy_pass http://unix:/home/username/myproject/myproject.sock; } }

    Закроем файл с сохранением изменений. И применим новую конфигурацию путем привязки к директории sites-enabled.

    sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

    Также добавим пользователя www-data в группу текущего пользователя. Для этого выполним:

    sudo usermod -a -G ${USER} www-data

    Проверим конфигурацию Nginx:

    И если все в порядке, перезапустим его:

    Завершим настройку внесением изменений в параметры брандмауэра. Например, правило насчет доступа через порт 5000 нам уже не понадобится, его можно смело удалять. Вместо него внесем другой, для открытия подключения к серверу Nginx:

    sudo ufw delete allow 5000 sudo ufw allow 'Nginx Full'

    Попробуйте зайти на наш сервер из браузера: http://your_domain. Программа выдаст сообщение «Hello!»

    Последняя задача в этом материале – установка SSL сертификата для защиты трафика. Мы рекомендуем получить бесплатный SSL Let’s Encrypt с помощью Certbot. Рекомендуемый способ установки Certbot — через snap, который уже предустановлен в Ubuntu.

    Подробную инструкцию по выпуску SSL можно найти в официальной документации Certbot.

    Выполните команду ниже, чтобы убедиться, что используется последняя версия snapd:

    sudo snap install core; sudo snap refresh core

    Если ранее вы устанавливали какие-то пакеты Certbot с помощью пакетного менеджера apt, удалите их командой:

    sudo apt-get remove certbot

    Установите Certbot через snap:

    sudo snap install --classic certbot

    Выполните следующее, чтобы убедиться, что команда certbot может быть запущена:

    sudo ln -s /snap/bin/certbot /usr/bin/certbot

    Выполните команду ниже, чтобы получить сертификат и автоматически внести необходимые изменений в конфигурацию Nginx:

    Certbot будет автоматически обновлять сертификат. Вы можете протестировать обновление, запустив команду:

    sudo certbot renew --dry-run

    После проверьте открытие домена https://your_domain в браузере. Помимо традиционного результата в виде сообщения «Hello!», должен появиться замочек, подтверждающий защиту сайта.


    Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.

    VPS для проекта

    VPS с root-доступом, NVMe и поддержкой 24/7 на Simple-Server.

    StarterVDS

    490

    в месяц

    1 ядро

    1 ГБ RAM

    20 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Безлимитный трафик
    Заказать VPS
    Рекомендуем

    PerformanceVDS

    1190

    в месяц

    2 ядра

    4 ГБ RAM

    60 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Базовая DDoS-защита
    Заказать VPS

    Нужна другая конфигурация или чистый VPS без панели?

    Все тарифы VPS

    Похожие статьи, которые могут быть вам интересны