Веб-сервер, поставляемый с Flask, можно использовать для запуска и отладки в среде разработки.,Не подходит для развертывания в производственной среде.,Невозможно удовлетворить требования к производительности в Интернете.。когдаиспользоватьapp.run(host = '0.0.0.0',port=6000)
При запуске,flaskВ кадре будет раздел ВНИМАНИЕ: это сервер разработки. Не используйте его в производственном развертывании. Вместо этого используйте производственный сервер WSGI.
Давайте сначала представим несколько понятий, которые помогут понять важность использования развертывания сервера wsgi:
Gunicorn — это http-сервер Python WSGI. Здесь мы используем его в качестве сервера wsgi для развертывания программы flask.
pip install gunicorn
Как правило, он в основном используется для использования своей асинхронной рабочей модели, и необходимо установить соответствующий асинхронный модуль.
pip install greenlet # использовать async должен быть установлен
pip install eventlet # использоватьeventlet workers
pip install gevent # использоватьgevent workers
Команда Gunicorn запускает программу относительно просто. В качестве примера возьмем следующий файл main.py.
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)
Запустить команду:
gunicorn -w 5 -b 0.0.0.0:6000 -t 120 main:app
Для постоянной работы используйте nohup, и журнал операции будет храниться в журнале app.log в текущем каталоге.
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 секундУведомление:1、windowsСистема сообщит об ошибке:ModuleNotFoundError: No module named 'fcntl'
,Причина в том gunicorn Windows не поддерживается, в linux может работать нормально.
2. Если запрос на доступ происходит очень медленно после запуска flask, обычно это связано с несовместимостью версий Gunicorn и flask-socketio. Просто найдите соответствующую версию, я установил последнюю версию, и проблем не возникнет.
Если это производственная среда, важно настроить информацию журнала следующим образом:
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
просмотреть записанноебревноинформация。
myapp.py
изFlaskприложение,Включить доступ кратко и ошибка кратко:gunicorn --access-logfile access.log --error-logfile error.log myapp:app
myapp.py
изFlaskприложение,Запустите в режиме Guardian Process:gunicorn -D myapp:app
myapp.py
изFlaskприложение,Укажите файл конфигурации:gunicorn -c gunicorn.conf.py myapp:app
kill -HUP <хозяин Идентификатор процесса>
kill -TERM <хозяин Идентификатор процесса>
myapp.py
изFlaskприложение,Установите максимальное количество запросов на задание:gunicorn --max-requests 1000 myapp:app
myapp.py
изFlaskприложение,Установите диапазон колебания максимального количества запросов на задание:gunicorn --max-requests-jitter 50 myapp:app
myapp.py
изFlaskприложение,Установите префикс имени процесса задания:gunicorn --worker-tmp-dir /dev/shm myapp:app
myapp.py
изFlaskприложение,Установите временный каталог для рабочего процесса:gunicorn --worker-tmp-dir /dev/shm myapp:app
myapp.py
изFlaskприложение,Включите поддержку SSL:gunicorn --certfile=server.crt --keyfile=server.key myapp:app
myapp.py
изFlaskприложение,Установите уровень бревного логирования:gunicorn --log-level debug myapp:app
myapp.py
изFlaskприложение,Включите поддержку прокси-протокола:gunicorn --proxy-protocol myapp:app
myapp.py
изFlaskприложение,Установить ограничение размера заголовка запроса:gunicorn --limit-request-line 8190 myapp:app
myapp.py
изFlaskприложение,Установите ограничение на количество полей запроса:gunicorn --limit-request-fields 100 myapp:app
myapp.py
изFlaskприложение,Установить ограничение размера поля запроса:gunicorn --limit-request-field_size 8190 myapp:app
пожалуйста Уведомление,上面из命令中изmyapp:app
выражать您изприложение位于名为myapp.py
из文件中,иFlaskприложение实例из名称为app
。您需要根据您自己изприложение进行相应修改。
Создайте новый файл конфигурации config.py в корневом каталоге.
# Включить ли режим отладки
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
Запустить команду:
gunicorn -c config.py main:app
Следующая информация указывает на то, что запуск прошел успешно.
Подробное объяснение параметров файла конфигурации:
-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: Установите переменные среды;
Создайте новый файл конфигурации config.py в корневом каталоге.
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
Запустить команду:
gunicorn -c config.py main:app
См. использование работника: запуск режима gevent.
Также удобнее использовать Gunicorn для развертывания в Docker-контейнере. Просто напишите команду запуска в dockerfile.
Другие настраиваемые элементы: config.py.
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процесс。
использоватьps -ef | grep gunicorn
команда, чтобы узнатьgunicornвсепроцесс。
[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.
[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