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

Установка Flask с Gunicorn и Nginx на Rocky Linux

• 7 min read • DevOps • Обновлено 26 Nov 2025
Flask с Gunicorn и Nginx на Rocky Linux
Flask с Gunicorn и Nginx на Rocky Linux

Этот пошаговый гид показывает, как развернуть Python-приложение на Flask с Gunicorn и Nginx на Rocky Linux (v8 или v9). Вы создадите виртуальное окружение, установите зависимости, настроите Supervisord для управления процессом, прокси Nginx через UNIX-сокет и проверите работоспособность приложения. В конце — список проверок, рекомендации по безопасности и типичные ошибки с решениями.

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

Что такое Flask, Gunicorn и Supervisord

  • Flask — лёгкий веб-фреймворк на Python. Простой, расширяемый, не включает ORM по умолчанию. Термин: ORM — объектно-реляционное отображение, используемое для работы с БД.
  • Gunicorn — WSGI HTTP-сервер с предфорковым (pre-fork) режимом рабочих процессов. Работает быстро и экономно с ресурсами.
  • Supervisord — демон для управления процессами (автоперезапуск, логирование, автозагрузка).

Основные цели этого руководства

  • Установить зависимости: Python, pip, Nginx, Supervisord.
  • Создать пользователя для приложения и виртуальное окружение.
  • Запустить простое приложение Flask локально и с Gunicorn.
  • Настроить Supervisord для автозапуска Gunicorn через UNIX-сокет.
  • Настроить Nginx как обратный прокси к UNIX-сокету.

Пререквизиты

  • Сервер с Rocky Linux (v8 или v9).
  • Пользователь с sudo-привилегиями.
  • Локальный домен для тестирования (например, www.myflask.local) или доступ по IP.

Установка зависимостей

Сначала установите EPEL, Python-пакеты, компилятор, Nginx и Supervisord.

sudo dnf install epel-release
sudo dnf install python3-pip python3-devel gcc

Если появится запрос подтверждения, введите y и нажмите Enter.

Установка pip и компилятора

Установите Nginx и Supervisord:

sudo dnf install nginx supervisor

Установка Nginx и Supervisord

Запустите и включите Nginx:

sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx

Вы должны увидеть, что служба включена и запущена.

Проверка статуса Nginx

Запустите и включите Supervisord:

sudo systemctl start supervisord
sudo systemctl enable supervisord
sudo systemctl status supervisord

Проверка статуса Supervisord

Создание пользователя для приложения

Рекомендуется запускать веб-приложение от непривилегированного пользователя.

sudo useradd -m -s /bin/bash alice
sudo passwd alice

Добавьте пользователя в группу wheel для возможности sudo:

sudo usermod -aG wheel alice

Проверьте вход под новым пользователем:

su - alice
sudo su

Вы должны получить root-окружение после sudo.

Создание пользователя

Настройка виртуального окружения Python

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

su - alice
sudo mkdir -p /var/www/myflask
sudo chown -R alice:alice /var/www/myflask
sudo chmod 755 /var/www/myflask
cd /var/www/myflask
python3 -m venv myenv

Активируйте окружение:

source myenv/bin/activate

Подсказка: при активном виртуальном окружении приглашение shell изменится и будет содержать (myenv).

Чтобы выйти из окружения:

deactivate

Виртуальное окружение

Установка Flask и Gunicorn

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

cd /var/www/myflask
source myenv/bin/activate
pip3 install --upgrade pip
pip3 install flask gunicorn

Установка Flask и Gunicorn

Создание простого приложения Flask

Создайте файл приложения myflask.py:

nano myflask.py

Вставьте код:

# myflask.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def hello():
    return render_template('index.html')

if __name__ == "__main__":
    app.run(host='0.0.0.0')

Сохраните файл.

Создание Flask-приложения

Создайте директорию шаблонов и файл index.html:

mkdir -p templates
nano templates/index.html

Содержимое index.html:


    
        

Hello Flask - Rocky Linux!

Запустите приложение в режиме разработки:

python3 myflask.py

По умолчанию Flask слушает порт 5000. В другом терминале проверьте:

curl localhost:5000

Проверка Flask

Нажмите Ctrl+C, чтобы остановить сервер разработки.

Настройка Gunicorn и Supervisord

Создайте WSGI-обёртку wsgi.py рядом с myflask.py:

nano wsgi.py

Вставьте код:

from myflask import app

if __name__ == "__main__":
    app.run(debug=True)

Запустите приложение под Gunicorn для теста:

gunicorn -w 4 --bind 0.0.0.0:8000 wsgi:app

Откройте http://:8000 и убедитесь, что страница отображается.

Запуск Gunicorn

Остановите Gunicorn (Ctrl+C) и продолжите настройку Supervisord.

Создайте конфигурацию Supervisord: /etc/supervisord.d/flaskapp.ini

sudo nano /etc/supervisord.d/flaskapp.ini

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

[program:myflask]
command=/bin/bash -c 'source /var/www/myflask/myenv/bin/activate; gunicorn -w 3 --bind unix:/var/www/myflask/ipc.sock wsgi:app'
directory=/var/www/myflask
user=alice
group=www-data
autostart=true
autorestart=true
stdout_logfile=/var/www/myflask/myflask.log
stderr_logfile=/var/www/myflask/error.log

Обратите внимание: путь к сокету — /var/www/myflask/ipc.sock. Права и владелец сокета важны для доступа Nginx.

Перезапустите Supervisord и проверьте статус:

sudo systemctl restart supervisord
sudo systemctl status supervisord
sudo supervisorctl status

Supervisord с конфигурацией приложения

Настройка Nginx как обратного прокси

Создайте файл конфигурации: /etc/nginx/conf.d/flaskapp.conf

sudo nano /etc/nginx/conf.d/flaskapp.conf

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

server {
    listen 80;
    server_name www.myflask.local;

    location / {
        include uwsgi_params;
        proxy_pass http://unix:/var/www/myflask/ipc.sock;
    }
}

Проверьте конфигурацию и перезапустите Nginx:

sudo nginx -t
sudo systemctl restart nginx

Настройка Nginx как обратного прокси

Добавьте запись в /etc/hosts на локальной машине (или в тестовом окружении):

sudo nano /etc/hosts

Добавьте строку:

192.168.5.28 www.myflask.local

Откройте http://www.myflask.local в браузере — вы должны увидеть страницу приложения.

Проверки и отладка

Полезные команды для проверки и логов:

  • Просмотр статуса сервисов:
sudo systemctl status nginx
sudo systemctl status supervisord
  • Просмотр процессов Gunicorn (если запускали вручную):
ps aux | grep gunicorn
  • Логи Supervisord:
sudo tail -n 200 /var/www/myflask/myflask.log
sudo tail -n 200 /var/www/myflask/error.log
  • Логи Nginx:
sudo tail -n 200 /var/log/nginx/error.log
sudo tail -n 200 /var/log/nginx/access.log

Типичные проблемы и их решения:

  • Nginx возвращает 502 Bad Gateway: проверьте, создан ли UNIX-сокет и доступны ли права для пользователя nginx на этот сокет. Проверьте пути в конфиге Supervisord и Gunicorn.
  • Gunicorn не запускается: проверьте, активирована ли виртуальная среда в команде Supervisord и корректен ли путь к wsgi:app.
  • Приложение работает в dev-сервере, но не через Gunicorn: убедитесь, что зависимости установлены в виртуальном окружении, а не в системном Python.

Рекомендации по безопасности и производительности

  • SSL/TLS: для публичного сервера настройте HTTPS (например, Let’s Encrypt) и перенаправление с HTTP на HTTPS.
  • Права и владельцы: сокет и лог-файлы должны принадлежать пользователю и группе, указанным в конфигурации Supervisord. Не запускайте приложение от root.
  • SELinux: на Rocky Linux SELinux может быть в режиме enforcing. Проверьте контекст сокета и разрешения. Для тестовой среды можно переключить в permissive, но в продакшене лучше создать политики SELinux.

Пример проверки SELinux:

sestatus
# Для временного переключения (только для тестирования):
sudo setenforce 0
  • Firewall: откройте только нужные порты (HTTP/HTTPS). При использовании UNIX-сокета внешний порт для приложения не требуется.
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
  • Количество воркеров Gunicorn: правило эмпирическое — (2 x CPU) + 1. Для малых тестовых сред 2–4 воркера достаточно.

Альтернативы и когда что выбирать

  • Supervisord vs systemd: systemd уже встроен и часто предпочтителен для продакшна (стандартные средства управления, журналы через journalctl). Supervisord проще для процессов на пользователей и в контейнерах.
  • Gunicorn vs uWSGI: Gunicorn проще в настройке и хорошо работает со стандартными Python WSGI-приложениями; uWSGI более функционален и гибок, но сложнее в конфигурации.
  • UNIX-сокет vs TCP: UNIX-сокет даёт чуть меньшую нагрузку и безопаснее (только локальный доступ), TCP удобен при распределении между машинами.

Контрольные списки по ролям

Для разработчика:

  • Код запускается локально через python3 myflask.py.
  • Все зависимости в requirements.txt.
  • Приложение возвращает 200 на корневой путь.

Для системного администратора:

  • Gunicorn запущен через Supervisord/systemd.
  • Nginx корректно проксирует UNIX-сокет.
  • SELinux/Firewall правильно настроены.
  • Логи ротация настроена (logrotate).

Для инженера безопасности:

  • HTTPS настроен и сертификаты обновляются автоматически.
  • Параметры CORS и заголовки безопасности (Content-Security-Policy, X-Frame-Options) прописаны в Nginx.

Критерии приёмки

  • Приложение доступно по http://www.myflask.local и выдаёт страницу index.html.
  • supervisorctl status показывает процесс myflask со статусом RUNNING/OK.
  • Nginx не возвращает 502/504 при стандартном доступе.
  • Логи приложений не содержат необработанных исключений при базовом запросе.

Тесты и проверка работоспособности

  • Тест доступности:
curl -I http://www.myflask.local

Ожидаемый ответ: HTTP/1.1 200 OK.

  • Тест поведения при перезапуске Supervisord:
sudo systemctl restart supervisord
sudo supervisorctl status

Ожидается, что процесс должен быть в состоянии RUNNING.

Миграция с других дистрибутивов

  • С CentOS/Ubuntu: пути и имена пакетов сходны, но в Debian/Ubuntu пакет Supervisor может называться supervisor, а системные команды и системные юниты отличаются. Для systemd-конфигурации используйте unit-файлы вместо /etc/supervisord.d.
  • SELinux: на CentOS/Rocky/Zayt и аналогичных проверьте контексты; на Ubuntu SELinux обычно отключён.

Советы по эксплуатации

  • Настройте logrotate для /var/www/myflask/*.log, чтобы логи не занимали диск.
  • Разделяйте среды: dev, staging, prod. Для prod используйте отдельного пользователя и окружение.
  • Автоматизируйте развёртывание (Ansible, Fabric, CI/CD), чтобы избежать ручных шагов.

Итог и следующие шаги

Поздравляем — вы развернули Flask-приложение с Gunicorn и Nginx и настроили Supervisord для управления процессом. Для перехода в продакшен рекомендуем:

  • Настроить HTTPS и HTTP->HTTPS редирект.
  • Настроить ротацию логов и мониторинг (Prometheus, Grafana, Sentry).
  • Рассмотреть использование systemd вместо Supervisord для интеграции со стандартным мониторингом и журналированием.

Краткий план действий:

  1. Тестирование функциональности приложения.
  2. Настройка SSL и безопасности заголовков.
  3. Автоматизация развёртывания и тестирования.

Частые ошибки и быстрые решения

  • Ошибка: permission denied при подключении к unix-сокету. Решение: установите владельца/группу сокета в соответствии с Nginx (обычно nginx или www-data) или измените umask/права при запуске Gunicorn.

  • Ошибка: supervisorctl не видит конфигурацию. Решение: убедитесь, что файл в /etc/supervisord.d имеет расширение .ini и что вы перезапустили сервис supervisord.

  • Ошибка: приложение не импортируется при запуске Gunicorn. Решение: проверьте PYTHONPATH и рабочий каталог в конфигурации Supervisord; используйте абсолютные пути.

Факто-бокс

  • Порты по умолчанию: Flask dev — 5000; Gunicorn (как в примере) — 8000; Nginx — 80/443.
  • Тип размещения: UNIX-сокеты обеспечивают локальное безопасное соединение между Gunicorn и Nginx.
  • Рекомендация по воркерам Gunicorn: (2 × CPU) + 1 — правило для эмпирического подбора.

Список полезных команд

  • Управление Nginx:
sudo systemctl restart nginx
sudo nginx -t
  • Управление supervisord:
sudo systemctl restart supervisord
sudo supervisorctl status
sudo supervisorctl tail -f myflask stdout
  • Просмотр log файлов:
sudo tail -f /var/www/myflask/myflask.log
sudo tail -f /var/log/nginx/error.log

Заключение

Вы успешно установили и настроили стек: Flask → Gunicorn → UNIX-сокет → Supervisord → Nginx. Далее можно интегрировать SSL, CI/CD, мониторинг и масштабировать число воркеров в зависимости от нагрузки.

Ключевые моменты:

  • Используйте виртуальное окружение и запускайте приложение от непривилегированного пользователя.
  • Gunicorn + UNIX-сокет + Nginx — простая и надёжная комбинация для большинства веб-приложений на Python.
  • Supervisord удобен для управления процессами в простых инфраструктурах; для крупной инфраструктуры рассмотрите systemd и контейнеризацию.
Поделиться: 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 быстро