Развертывание приложений Python с помощью Gunicorn

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

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

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

    Для начала необходимо обновить все пакеты. Когда вы создаете новый экземпляр виртуальной машины стоит обновить ОС и её пакеты до последней версии, чтобы защитить вашу виртуальную машину от эксплойтов, а также использовать самый новый функционал ОС.

    Для обновления системы воспользуемся пакетным менеджером apt (advanced packaging tool) — утилитой для установки, обновления и удаления программных пакетов в операционных системах Linux.

    Обновление происходит с помощью команды:

    Установка Python и сопутствующих компонентов

    В Ubuntu последняя версия интерпретатора Python доступна по умолчанию. Проверим версию с помощью команды:

    Создание виртуальной среды Python

    Настроим виртуальную среду. Это позволит нашему проекту иметь свои собственные зависимости, отдельные от тех, что есть у других проектов. Устанавливаем пакет virtualenv, который позволит создавать виртуальные среды:

    sudo apt-get install python3-venv python3-dev

    Создаём папку для нашего проекта и перейдем в нее:

    Создаём виртуальную среду:

    В папке нашего проекта должно быть два объекта — app и venv.

    Проверить это можно с помощью стандартной для Linux систем команды для просмотра содержимого каталога:

    Виртуальную среду необходимо активировать, чтобы все последующие компоненты устанавливались для проекта локально:

    Установка и настройка Gunicorn

    Gunicorn (Green Unicorn) — это HTTP-сервер Python WSGI для UNIX. Сервер Gunicorn легко совместим с различными веб-фреймворками, быстрый, прост в реализации, требует мало ресурсов сервера.

    Установка Python Gunicorn:

    WSGI (Web Server Gateway Interface) — стандарт взаимодействия между Python-программой, выполняющейся на стороне сервера, и самим веб-сервером, например Nginx.

    WSGI-сервер вызывается приложением, которое позволяет нам запускать программный код в рамках обработки запросов. Обычно программный код предоставляется как объект с именем application в модуле Python, доступном для сервера. Стандартно в файле wsgi.py содержится такое вызываемое приложение.

    Для примера создадим такой файл с помощью текстового редактора nano:

    И поместим в него простой пример кода:

    from aiohttp import web async def index(request): return web.Response(text="Welcome home!") app = web.Application() app.router.add_get('/', index)

    В коде выше импортируется aiohttp. Библиотека aiohttp предоставляет асинхронный HTTP-клиент, построенный поверх asyncio. HTTP-запросы — классический пример того, что хорошо подходит для асинхронности, поскольку они предполагают ожидание ответа от сервера, в течение которого было бы удобно и эффективно выполнять другой код. Данная библиотека предоставляет возможность отправлять запросы последовательно, но не дожидаясь первого ответа, прежде чем отправлять новый. Удобно запускать серверы aiohttp за Nginx.

    Запустить сервер можно с помощью команды построенной по шаблону:

    gunicorn [OPTIONS] [WSGI_APP]

    Где [WSGI_APP] состоит из $(MODULE_NAME):$(VARIABLE_NAME), a [OPTIONS] — набор параметров для настройки Gunicorn.

    Простейшая команда будет выглядеть так:

    Если потребуется перезапустить Gunicorn можно использовать команду restart gunicorn:

    sudo systemctl restart gunicorn

    Systemd — менеджер системных служб, который позволяет строго управлять процессами, ресурсами и разрешениями. Создадим сокет, который systemd будет прослушивать и автоматически запускать Gunicorn в ответ на трафик.

    Добавим конфигурации для службы и сокета соответственно:

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

    В этот файл с помощью текстового редактора добавим следующее:

    [Unit] Description=gunicorn daemon Requires=gunicorn.socket After=network.target [Service] Type=notify User=someuser Group=someuser RuntimeDirectory=gunicorn WorkingDirectory=/home/someuser/myapp ExecStart=/путь/до/исполняемого/файла/gunicorn wsgi:app ExecReload=/bin/kill -s HUP $MAINPID KillMode=mixed TimeoutStopSec=5 PrivateTmp=true [Install] WantedBy=multi-user.target

    В строке ExecStart необходимо указать путь до исполняемого файла gunicorn в виртуальном окружении. Вероятно, он будет выглядеть примерно так: /home/someuser/myapp/venv/bin/gunicorn.

    А в /etc/systemd/system/gunicorn.socket добавим:

    [Unit] Description=gunicorn socket [Socket] ListenStream=/run/gunicorn.sock SocketUser=www-data [Install] WantedBy=sockets.target

    Включаем и запускаем сокет:

    systemctl enable --now gunicorn.socket

    Рассмотрим полезные параметры Gunicorn в Python 3. Все возможные параметры можно посмотреть в официальной документации.

    -b BIND, --bind=BIND — указание серверного сокета. Можно указать в форматах: $(HOST), $(HOST):$(PORT).

    gunicorn --bind=127.0.0.1:8080 wsgi:app

    Эта команда запустит наше приложение локально на порту 8080.

    -w WORKERS, --workers=WORKERS — количество рабочих процессов. Обычно это число должно составлять от 2 до 4 на ядро сервера.

    gunicorn --workers=2 wsgi:app

    -k WORKERCLASS, --worker-class=WORKERCLASS — тип рабочего процесса для запуска.

    sync — тип процесса по умолчанию. Это самый простой тип — синхронный рабочий процесс, который обрабатывает один запрос за раз. Другие типы может потребоваться устанавливать как зависимости.

    Доступные асинхронные рабочие процессы основаны на Greenlets (через Eventlet и Gevent). Greenlets — это реализация совместной многопоточности для Python. Соответствующие параметры — eventlet и gevent.

    Мы будем использовать асинхронный тип процесса, совместимый с aiohttp:

    gunicorn wsgi:app --bind localhost:8080 --worker-class aiohttp.GunicornWebWorker

    Также возможно использовать флаг --access-logfile, чтобы разрешить заполнение журнала доступа.

    gunicorn wsgi:app --access-logfile access.log

    С помощью такой команды можно указать журнал для логирования ошибок:

    gunicorn wsgi:app --error-logfile error.log

    Степень детализации выходных данных журнала ошибок можно установить с помощью флага --log-level.

    При работе с логами в Gunicorn доступны следующие уровни:

    • debug
    • info
    • warning
    • error
    • critical

    По умолчанию установлен уровень info, отрезающий информацию, относящуюся к debug.

    Установка и настройка Nginx

    Запустим команду для установки Nginx:

    Давайте проверим сможет ли демон Nginx подключиться к созданному ранее сокету:

    sudo -u www-data curl --unix-socket /run/gunicorn.sock http

    Таким образом служба Gunicorn будет автоматически запущена, и мы увидим HTML-код от сервера в терминале.

    Настройка Nginx происходит путем добавления конфигурационных файлов для виртуальных хостов.

    Стоит хранить конфигурацию каждого прокси в директории /etc/nginx/sites-available.

    Запуск каждого из прокси серверов осуществляется через создание ссылки на него в директорию /etc/nginx/sites-enabled. При запуске Nginx автоматически пробегается по этой директории и включает нужные прокси сервера.

    Таким образом, создадим конфигурационный файл:

    sudo nano /etc/nginx/sites-available/myconfig.conf

    Далее создадим ссылку через команду:

    sudo ln -s /etc/nginx/sites-available/myconfig.conf /etc/nginx/sites-enabled

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

    Сначала проверим корректность синтаксиса в файле:


    Нужен сервер для практики? Арендуйте 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

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