uWSGI
uWSGI — это быстрый, компилируемый серверный пакет с расширенной конфигурацией и возможностями, выходящими за рамки базового сервера.
- Он может быть очень производительным благодаря тому, что является компилируемой программой.
- Он сложен в настройке за пределами базового приложения и имеет так много опций, что новичкам может быть трудно его понять.
- Он не поддерживает Windows (но работает в WSL).
- В некоторых случаях требуется компилятор для установки.
Эта страница описывает основы запуска uWSGI. Обязательно ознакомьтесь с его документацией, чтобы понять доступные функции.
Установка
uWSGI имеет несколько способов установки. Наиболее простой способ — установить пакет pyuwsgi, который предоставляет предварительно скомпилированные wheel-пакеты для распространенных платформ. Однако он не поддерживает SSL, который можно обеспечить с помощью обратного прокси-сервера.
Создайте виртуальное окружение, установите своё приложение, затем установите 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 на него.
wsgi.pyfrom 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 будет невозможна. Вместо этого следует использовать обратный прокси-сервер, такой как nginx или Apache httpd, перед uWSGI. Безопасный запуск 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-адрес в своём браузере.
Асинхронность с gevent
Стандартный синхронный рабочий процесс подходит для многих случаев использования. Если вам нужна асинхронная поддержка, uWSGI предоставляет рабочий процесс gevent. Это не то же самое, что Python's async/await, или спецификация 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] ***
© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/2.2.x/deploying/uwsgi/