Установка 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-releasesudo dnf install python3-pip python3-devel gccЕсли появится запрос подтверждения, введите y и нажмите Enter.

Установите Nginx и Supervisord:
sudo dnf install nginx supervisor
Запустите и включите Nginx:
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginxВы должны увидеть, что служба включена и запущена.

Запустите и включите Supervisord:
sudo systemctl start supervisord
sudo systemctl enable supervisord
sudo systemctl status 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
Создайте файл приложения 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')Сохраните файл.

Создайте директорию шаблонов и файл index.html:
mkdir -p templates
nano templates/index.htmlСодержимое index.html:
Hello Flask - Rocky Linux!
Запустите приложение в режиме разработки:
python3 myflask.pyПо умолчанию Flask слушает порт 5000. В другом терминале проверьте:
curl localhost:5000
Нажмите 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://

Остановите 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
Настройка 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
Добавьте запись в /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 для интеграции со стандартным мониторингом и журналированием.
Краткий план действий:
- Тестирование функциональности приложения.
- Настройка SSL и безопасности заголовков.
- Автоматизация развёртывания и тестирования.
Частые ошибки и быстрые решения
Ошибка: 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 и контейнеризацию.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента