Какие существуют основные способы развертывания Python-приложения на Linux?

«Какие существуют основные способы развертывания Python-приложения на Linux?» — вопрос из категории Devops, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Развертывание Python-приложения на Linux включает несколько подходов, от простых скриптов до контейнеризации. Выбор зависит от сложности проекта и требований к масштабируемости.

1. Связка Gunicorn + Nginx (Классический подход для веб-приложений)

Это надежная и производительная конфигурация. Gunicorn выступает в роли WSGI-сервера, который запускает ваше Python-приложение, а Nginx работает как reverse-proxy, принимая HTTP-запросы, отдавая статические файлы и перенаправляя динамические запросы к Gunicorn.

# Установка и запуск Gunicorn
pip install gunicorn
gunicorn --workers 4 --bind 0.0.0.0:8000 myproject.wsgi:application

2. Systemd для управления процессом

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

Пример файла службы /etc/systemd/system/myapp.service:

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

[Service]
User=sammy
Group=www-data
WorkingDirectory=/path/to/your/project
ExecStart=/path/to/your/venv/bin/gunicorn --workers 3 --bind unix:/path/to/your/project/myapp.sock myproject.wsgi:application

[Install]
WantedBy=multi-user.target

Команды для управления:

sudo systemctl start myapp
sudo systemctl enable myapp

3. Docker (Современный подход)

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

Пример Dockerfile:

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["gunicorn", "--bind", "0.0.0.0:8000", "myproject.wsgi:application"]

Сборка и запуск контейнера:

docker build -t my-python-app .
docker run -p 8000:8000 my-python-app