uWSGI¶
uWSGI - это быстрый, скомпилированный серверный пакет с обширной конфигурацией и возможностями, выходящими за рамки базового сервера.
Он может быть очень производительным благодаря тому, что является скомпилированной программой.
Он сложен в настройке за пределами базового приложения и имеет так много опций, что новичкам может быть трудно в нем разобраться.
Он не поддерживает Windows (но работает на WSL).
В некоторых случаях для его установки требуется компилятор.
На этой странице описаны основы работы с uWSGI. Обязательно прочитайте документацию к нему, чтобы понять, какие функции доступны.
Установка¶
У uWSGI есть несколько способов установки. Наиболее простым является установка пакета pyuwsgi
, который предоставляет предварительно скомпилированные колеса для распространенных платформ. Однако он не обеспечивает поддержку SSL, которую можно обеспечить с помощью обратного прокси.
Создайте virtualenv, установите ваше приложение, затем установите pyuwsgi
.
$ cd hello-app
$ python -m venv venv
$ . venv/bin/activate
$ pip install . # install your application
$ pip install pyuwsgi
Если у вас есть компилятор, вы можете установить пакет uwsgi
вместо него. Или установите пакет pyuwsgi
из sdist вместо wheel. Любой из этих способов включает поддержку SSL.
$ pip install uwsgi
# or
$ pip install --no-binary pyuwsgi pyuwsgi
Бег¶
Самый простой способ запустить uWSGI - это указать ему запустить HTTP-сервер и импортировать ваше приложение.
$ uwsgi --http 127.0.0.1:8000 --master -p 4 -w hello:app
*** Starting uWSGI 2.0.20 (64bit) on [x] ***
*** Operational MODE: preforking ***
mounting hello:app on /
spawned uWSGI master process (pid: x)
spawned uWSGI worker 1 (pid: x, cores: 1)
spawned uWSGI worker 2 (pid: x, cores: 1)
spawned uWSGI worker 3 (pid: x, cores: 1)
spawned uWSGI worker 4 (pid: x, cores: 1)
spawned uWSGI http 1 (pid: x)
Если вы используете шаблон фабрики приложений, вам нужно будет создать небольшой файл Python для создания приложения, а затем указать uWSGI на него.
from hello import create_app
app = create_app()
$ uwsgi --http 127.0.0.1:8000 --master -p 4 -w wsgi:app
Опция --http
запускает HTTP-сервер на 127.0.0.1 порт 8000. Опция --master
задает стандартный менеджер рабочих процессов. Опция -p
запускает 4 рабочих процесса; начальное значение может быть CPU * 2
. Опция -w
указывает uWSGI, как импортировать ваше приложение
Внешнее связывание¶
uWSGI не следует запускать от имени root с конфигурацией, показанной в этом документе, поскольку это приведет к тому, что код вашего приложения будет запускаться от имени root, что небезопасно. Однако это означает, что привязка к порту 80 или 443 невозможна. Вместо этого перед uWSGI следует использовать обратный прокси, например nginx или Apache httpd. Существует возможность безопасного запуска uWSGI от имени root, но это выходит за рамки данного документа.
uWSGI оптимизировал интеграцию с Nginx uWSGI и Apache mod_proxy_uwsgi, и, возможно, с другими серверами, вместо использования стандартного HTTP-прокси. Эта настройка выходит за рамки данного документа, смотрите ссылки для получения дополнительной информации.
Вы можете привязаться ко всем внешним IP на непривилегированном порту, используя опцию --http 0.0.0.0:8000
. Не делайте этого при использовании обратного прокси, иначе прокси можно будет обойти.
$ uwsgi --http 0.0.0.0:8000 --master -p 4 -w wsgi:app
0.0.0.0
не является действительным адресом для перехода, вы должны использовать конкретный IP-адрес в браузере.
Async с gevent¶
Рабочий синхронизации по умолчанию подходит для многих случаев использования. Если вам нужна поддержка асинхронности, uWSGI предоставляет рабочий gevent. Это не то же самое, что async/await
в Python или спецификация сервера ASGI. Вы должны действительно использовать gevent в своем собственном коде, чтобы увидеть какую-либо выгоду от использования рабочего.
При использовании gevent требуется greenlet>=1.0, иначе контекстные локали, такие как request
, не будут работать так, как ожидается. При использовании PyPy требуется PyPy>=7.3.7.
$ uwsgi --http 127.0.0.1:8000 --master --gevent 100 -w wsgi:app
*** Starting uWSGI 2.0.20 (64bit) on [x] ***
*** Operational MODE: async ***
mounting hello:app on /
spawned uWSGI master process (pid: x)
spawned uWSGI worker 1 (pid: x, cores: 100)
spawned uWSGI http 1 (pid: x)
*** running gevent loop engine [addr:x] ***