[1269] Использование Gunicorn для развертывания проектов flask.
[1269] Использование Gunicorn для развертывания проектов flask.

1. Введение

Веб-сервер, поставляемый с Flask, можно использовать для запуска и отладки в среде разработки.,Не подходит для развертывания в производственной среде.,Невозможно удовлетворить требования к производительности в Интернете.。когдаиспользоватьapp.run(host = '0.0.0.0',port=6000)При запуске,flaskВ кадре будет раздел ВНИМАНИЕ: это сервер разработки. Не используйте его в производственном развертывании. Вместо этого используйте производственный сервер WSGI.

Давайте сначала представим несколько понятий, которые помогут понять важность использования развертывания сервера wsgi:

  • WSGI: Полное название — Web Server Gateway Interface (интерфейс шлюза веб-сервера). Это спецификация. Это интерфейс между веб-серверами и веб-приложениями. Он действует как мост между веб-сервером и платформой веб-приложения.
  • uwsgi: протокол передачи, используемый для определения типа передаваемой информации.
  • uWSGI: это веб-сервер, реализующий WSGI протокола uwsgi.

Gunicorn — это http-сервер Python WSGI. Здесь мы используем его в качестве сервера wsgi для развертывания программы flask.

2. Установка модуля

Язык кода:javascript
копировать
pip install gunicorn

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

Язык кода:javascript
копировать
pip install greenlet # использовать async должен быть установлен
pip install eventlet # использоватьeventlet workers
pip install gevent   # использоватьgevent workers

3. Команда запуска

3.1 Конфигурация параметров Gunicorn в командной строке

Команда Gunicorn запускает программу относительно просто. В качестве примера возьмем следующий файл main.py.

Язык кода:javascript
копировать
from flask import Flask

app = Flask(__name__)

@app.route('/',methods=['GET'])
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=6000)

Запустить команду:

Язык кода:javascript
копировать
gunicorn -w 5 -b 0.0.0.0:6000 -t 120 main:app

Для постоянной работы используйте nohup, и журнал операции будет храниться в журнале app.log в текущем каталоге.

Язык кода:javascript
копировать
nohup python -m gunicorn -w 5 -b 0.0.0.0:6000 -t 120 main:app > app.log 2>&1 &

Объясните значение параметров:

  • -w:выражать Количество рабочих мест процесса
  • -b :Адрес доступа и порт
  • -t:настраиватьтайм-аут120Второй,По умолчанию 30 секунд
  • main: колба запускает имя файла Python
  • приложение: имя объекта Flask, созданное в скрипте.

Уведомление:1、windowsСистема сообщит об ошибке:ModuleNotFoundError: No module named 'fcntl',Причина в том gunicorn Windows не поддерживается, в linux может работать нормально.

2. Если запрос на доступ происходит очень медленно после запуска flask, обычно это связано с несовместимостью версий Gunicorn и flask-socketio. Просто найдите соответствующую версию, я установил последнюю версию, и проблем не возникнет.

Если это производственная среда, важно настроить информацию журнала следующим образом:

Язык кода:javascript
копировать
gunicorn -w 4 -b 0.0.0.0:8080 --access-logfile access.log --error-logfile error.log app:app -D

-Dвыражать将gunicornЗапуск в фоновом режиме,может пройтиtail -f access.logилиtail -f error.logпросмотреть записанноебревноинформация。

3.2 Некоторые другие примеры команд Gunicorn
  • Запустите программу под названиемmyapp.pyизFlaskприложение,Включить доступ кратко и ошибка кратко:
Язык кода:javascript
копировать
gunicorn --access-logfile access.log --error-logfile error.log myapp:app
  • Запустите программу под названиемmyapp.pyизFlaskприложение,Запустите в режиме Guardian Process:
Язык кода:javascript
копировать
gunicorn -D myapp:app
  • Запустите программу под названиемmyapp.pyизFlaskприложение,Укажите файл конфигурации:
Язык кода:javascript
копировать
gunicorn -c gunicorn.conf.py myapp:app
  • Перезагрузите работающий экземпляр Gunicorn (мягкий перезапуск):
Язык кода:javascript
копировать
kill -HUP <хозяин Идентификатор процесса>
  • Остановите работающий экземпляр Gunicorn (мягкая остановка):
Язык кода:javascript
копировать
kill -TERM <хозяин Идентификатор процесса>
  • Запустите программу под названиемmyapp.pyизFlaskприложение,Установите максимальное количество запросов на задание:
Язык кода:javascript
копировать
gunicorn --max-requests 1000 myapp:app
  • Запустите программу под названиемmyapp.pyизFlaskприложение,Установите диапазон колебания максимального количества запросов на задание:
Язык кода:javascript
копировать
gunicorn --max-requests-jitter 50 myapp:app
  • Запустите программу под названиемmyapp.pyизFlaskприложение,Установите префикс имени процесса задания:
Язык кода:javascript
копировать
gunicorn --worker-tmp-dir /dev/shm myapp:app
  • Запустите программу под названиемmyapp.pyизFlaskприложение,Установите временный каталог для рабочего процесса:
Язык кода:javascript
копировать
gunicorn --worker-tmp-dir /dev/shm myapp:app
  • Запустите программу под названиемmyapp.pyизFlaskприложение,Включите поддержку SSL:
Язык кода:javascript
копировать
gunicorn --certfile=server.crt --keyfile=server.key myapp:app
  • Запустите программу под названиемmyapp.pyизFlaskприложение,Установите уровень бревного логирования:
Язык кода:javascript
копировать
gunicorn --log-level debug myapp:app
  • Запустите программу под названиемmyapp.pyизFlaskприложение,Включите поддержку прокси-протокола:
Язык кода:javascript
копировать
gunicorn --proxy-protocol myapp:app
  • Запустите программу под названиемmyapp.pyизFlaskприложение,Установить ограничение размера заголовка запроса:
Язык кода:javascript
копировать
gunicorn --limit-request-line 8190 myapp:app
  • Запустите программу под названиемmyapp.pyизFlaskприложение,Установите ограничение на количество полей запроса:
Язык кода:javascript
копировать
gunicorn --limit-request-fields 100 myapp:app
  • Запустите программу под названиемmyapp.pyизFlaskприложение,Установить ограничение размера поля запроса:
Язык кода:javascript
копировать
gunicorn --limit-request-field_size 8190 myapp:app

пожалуйста Уведомление,上面из命令中изmyapp:appвыражать您изприложение位于名为myapp.pyиз文件中,иFlaskприложение实例из名称为app。您需要根据您自己изприложение进行相应修改。

3.3 Файл конфигурации параметров Gunicorn
3.3.1 Режим «Процесс + поток»

Создайте новый файл конфигурации config.py в корневом каталоге.

Язык кода:javascript
копировать
# Включить ли режим отладки
debug = True
# Адрес доступа
bind = "0.0.0.0:6000"
# Количество рабочих мест процесса
workers = 2
# Количество рабочих потоков
threads = 2
# тайм-аут
timeout = 600
# Выходной уровень бревно
loglevel = 'debug'
# Магазин бревно путь
pidfile = "log/gunicorn.pid"
# Магазин бревно путь
accesslog = "log/access.log"
# Магазин бревно путь
errorlog = "log/debug.log"
# gunicorn + В сценарии аппланировщика решите проблему многократного выполнения запланированных задач несколькими работниками.
preload_app = True

Запустить команду:

Язык кода:javascript
копировать
gunicorn -c config.py main:app

Следующая информация указывает на то, что запуск прошел успешно.

Подробное объяснение параметров файла конфигурации:

Язык кода:javascript
копировать
-c CONFIG    : CONFIG — путь к файлу конфигурации, запускаемый через файл конфигурации производственной среды;

-b ADDRESS   : АДРЕС, IP плюс порт, привязанный к работающему хосту;

-w INT, --workers INT: количество задач, используемых для обработки, положительное целое число, значение по умолчанию — 1;

-k STRTING, --worker-class STRING: Чтобы использовать рабочий режим использования, по умолчанию асинхронный асинхронный, вы можете скачать eventletиgevent и указать

--threads INT:处理пожалуйста求из Количество рабочих потоков,использовать指定数量из线程运行每个worker。является положительным целым числом,По умолчанию — 1.

--worker-connections INT: Максимальное количество одновременных клиентов. По умолчанию это значение равно 1000.

--backlog int: максимальное количество ожидающих соединений, т. е. количество клиентов, ожидающих обслуживания. Значение по умолчанию — 2048, обычно не изменяется;

-p FILE, --pid ФАЙЛ: установите имя файла pid. Если оно не установлено, файл pid не будет создан.

--access-logfile FILE   :  Доступ к каталогу бревно для записи

--access-logformat STRING: Доступ к краткому формату для записи

--error-logfile FILE, --log-file FILE  :  Каталог файлов, в которые бревно должны записываться ошибки.

--log-level LEVEL   :   Ошибка бревно выходного уровня.

--limit-request-line INT   :  Максимальный размер количества строк в заголовке HTTP-запроса. Этот параметр используется для ограничения разрешенного размера строк HTTP-запроса. По умолчанию это значение равно 4094. Значение представляет собой число от 0 до 8190.

--limit-request-fields INT   :  Ограничьте количество полей заголовка запроса в HTTP-запросах. Это поле используется для ограничения количества полей заголовка запроса для предотвращения DDOS-атак. По умолчанию это значение равно 100 и не может превышать 32768.

--limit-request-field-size INT  :  Ограничить размер заголовков HTTP-запросов. По умолчанию это значение составляет 8190 байт. Значение является целым числом или 0. Когда значение равно 0, это означает, что не будет ограничений на размер заголовка запроса.

-t INT, --timeout INT: По истечении этого количества секунд задание будет прекращено и перезапущено. Обычно устанавливается на 30 секунд;

--daemon: Запускаться ли в качестве защитного процесса, значение по умолчанию — false;

--chdir: Переключайте каталоги перед загрузкой приложения;

--graceful-timeout INT: по умолчанию это значение равно 30, и задания, которые все еще активны после таймаута (начиная с момента получения сигнала перезапуска), обычно будут принудительно уничтожены по умолчанию;

--keep-alive INT: количество секунд ожидания запросов на поддерживающее соединение, значение по умолчанию — 2. Обычно устанавливается от 1 до 5 секунд.

--reload: значение по умолчанию — ложь. Эта настройка предназначена для разработки и приведет к перезапуску задания при каждом изменении приложения.

--spew: печатать каждый оператор, выполняемый сервером, по умолчанию — False. Этот выбор является атомарным, то есть либо печатается все, либо ничего;

--check-config   : Отобразить текущую конфигурацию. Значение по умолчанию — False, что означает, что она отображается.

-e ENV, --env ENV: Установите переменные среды;
3.3.2 Режим процесса + сопрограммы

Создайте новый файл конфигурации config.py в корневом каталоге.

Язык кода:javascript
копировать
from gevent import monkey
monkey.patch_all()

# Включить ли режим отладки
debug = True
# Адрес доступа
bind = "0.0.0.0:6000"
# Количество рабочих мест процесса
workers = 2
# Установить режим сопрограммы
worker_class="gevent"  
# Максимальное количество одновременных клиентов. По умолчанию это значение равно 1000. Данная настройка повлияет на режим работы geventиeventlet.
worker_connections=500
# тайм-аут
timeout = 600
# Выходной уровень бревно
loglevel = 'debug'
# Магазин бревно путь
pidfile = "log/gunicorn.pid"
# Магазин бревно путь
accesslog = "log/access.log"
# Магазин бревно путь
errorlog = "log/debug.log"
# gunicorn + В сценарии аппланировщика решите проблему многократного выполнения запланированных задач несколькими работниками.
preload_app = True

Запустить команду:

Язык кода:javascript
копировать
gunicorn -c config.py main:app

См. использование работника: запуск режима gevent.

Также удобнее использовать Gunicorn для развертывания в Docker-контейнере. Просто напишите команду запуска в dockerfile.

Другие настраиваемые элементы: config.py.

Язык кода:javascript
копировать
import logging
import logging.handlers
import os
import multiprocessing
import gevent.monkey
gevent.monkey.patch_all()

bind = '0.0.0.0:8080'  # Привязанный IP имеет номер порта
chdir = '/home/flaskProject'  # Рабочий каталог назначения, на который Gunicorn хочет переключиться.
timeout = 60  # тайм-аут
worker_class = 'gevent'  # использоватьgeventмодель,Также использоватьсинхронизацию режим, по умолчанию — режим синхронизации
workers = multiprocessing.cpu_count() * 2 + 1  # Количество запущенных процессов
loglevel = "info"  # уровень бревно, этот уровень бревно относится к уровню ошибки бревно, и уровень доступа бревно не может быть установлен
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'  # Установите Gunicorn для доступа к формату бревно, ошибка бревно не может быть установлена
pidfile = "gunicorn.pid"
accesslog = "access.log"
errorlog = "error.log"
daemon = True  # Стоит ли работать в фоновом режиме

启动后项目из目录下会生成access.log,error.logиgunicorn.pidтри файла,gunicorn.pidсохранено вgunicornизхозяинпроцессPIDЧисло,может пройтиcat gunicorn.pidПроверять,Когда хочешь остановить пистолет,прямойkill процесс Число即可杀死всеgunicornпроцесс。

4. Завершите процесс обслуживания пистолета.

использоватьps -ef | grep gunicornкоманда, чтобы узнатьgunicornвсепроцесс。

Язык кода:javascript
копировать
[root@VM_0_12_centos ~]# ps -ef | grep gunicorn
root     16843 23035  0 Oct14 ?        00:00:02 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app
root     22445 23035  0 Oct04 ?        00:00:15 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app
root     22581 23035  0 Oct11 ?        00:00:05 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app
root     23035     1  0 Sep27 ?        00:04:11 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app

а затем использовать kill -9 Идентификатор процесса команда для завершения процесса. Обратите внимание, что мы можем просто найти основной процесс и завершить его, и дочерний процесс соответственно завершится. В приведенном выше примере номер основного процесса — 23035.

Язык кода:javascript
копировать
[root@VM_0_12_centos ~]# kill -9 23035
[root@VM_0_12_centos ~]# ps -ef | grep gunicorn

После завершения процесса,подожди несколько секунд,Сноваиспользоватьps -ef | grep gunicornПроверять,Обнаружено, что все процессы служб Gunicorn были уничтожены.

Ссылка: https://www.cnblogs.com/shenh/p/16824903.html. https://blog.csdn.net/Woodrow1994/article/details/113831985 https://zhuanlan.zhihu.com/p/618533248 https://zhuanlan.zhihu.com/p/488458470 http://www.manongjc.com/detail/12-nhpgmgnknsiysxf.html

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose