Gunicorn¶
Gunicorn - это чистый WSGI-сервер на языке Python с простой конфигурацией и несколькими рабочими реализациями для настройки производительности.
Как правило, он легко интегрируется с хостинговыми платформами.
Он не поддерживает Windows (но работает на WSL).
Его легко установить, так как он не требует дополнительных зависимостей или компиляции.
Он имеет встроенную поддержку async worker с использованием gevent или eventlet.
На этой странице изложены основы работы Gunicorn. Обязательно прочитайте его documentation и используйте gunicorn --help
, чтобы понять, какие возможности доступны.
Установка¶
Gunicorn легко установить, так как он не требует внешних зависимостей или компиляции. Он работает только в Windows под управлением WSL.
Создайте virtualenv, установите ваше приложение, затем установите gunicorn
.
$ cd hello-app
$ python -m venv venv
$ . venv/bin/activate
$ pip install . # install your application
$ pip install gunicorn
Бег¶
Единственный обязательный аргумент Gunicorn указывает ему, как загрузить ваше приложение Flask. Синтаксис таков: {module_import}:{app_variable}
. module_import
- это точечное имя импорта модуля с вашим приложением. app_variable
- это переменная приложения. Это также может быть вызов функции (с любыми аргументами), если вы используете паттерн фабрики приложений.
# equivalent to 'from hello import app'
$ gunicorn -w 4 'hello:app'
# equivalent to 'from hello import create_app; create_app()'
$ gunicorn -w 4 'hello:create_app()'
Starting gunicorn 20.1.0
Listening at: http://127.0.0.1:8000 (x)
Using worker: sync
Booting worker with pid: x
Booting worker with pid: x
Booting worker with pid: x
Booting worker with pid: x
Параметр -w
задает количество запускаемых процессов; начальное значение может быть CPU * 2
. По умолчанию используется только 1 рабочий, что, вероятно, не является тем, что вы хотите для рабочего типа по умолчанию.
По умолчанию журналы для каждого запроса не отображаются, показывается только рабочая информация и ошибки. Чтобы показать журналы доступа на stdout, используйте опцию --access-logfile=-
.
Внешнее связывание¶
Gunicorn не следует запускать от имени root, поскольку это приведет к тому, что код вашего приложения будет выполняться от имени root, что небезопасно. Однако это означает, что привязка к порту 80 или 443 невозможна. Вместо этого перед Gunicorn следует использовать обратный прокси-сервер, например nginx или Apache httpd.
Вы можете привязаться ко всем внешним IP на непривилегированном порту, используя опцию -b 0.0.0.0
. Не делайте этого при использовании обратного прокси, иначе прокси можно будет обойти.
$ gunicorn -w 4 -b 0.0.0.0 'hello:create_app()'
Listening at: http://0.0.0.0:8000 (x)
0.0.0.0
не является действительным адресом для перехода, вы должны использовать конкретный IP-адрес в браузере.
Async с помощью gevent или eventlet¶
Рабочий синхронизации по умолчанию подходит для многих случаев использования. Если вам нужна поддержка асинхронности, Gunicorn предоставляет рабочих, использующих gevent или eventlet. Это не то же самое, что async/await
в Python или спецификация сервера ASGI. Вы должны действительно использовать gevent/eventlet в своем собственном коде, чтобы увидеть какую-либо выгоду от использования рабочих.
При использовании gevent или eventlet требуется greenlet>=1.0, иначе контекстные локали, такие как request
, не будут работать так, как ожидается. При использовании PyPy требуется PyPy>=7.3.7.
Чтобы использовать gevent:
$ gunicorn -k gevent 'hello:create_app()'
Starting gunicorn 20.1.0
Listening at: http://127.0.0.1:8000 (x)
Using worker: gevent
Booting worker with pid: x
Чтобы использовать eventlet:
$ gunicorn -k eventlet 'hello:create_app()'
Starting gunicorn 20.1.0
Listening at: http://127.0.0.1:8000 (x)
Using worker: eventlet
Booting worker with pid: x