uWSGI

uWSGI 是一款快速、已编译的服务器套件,其配置和功能远远超出了基本服务器。

  • 由于它是一个已编译程序,因此性能非常高。

  • 除了基本应用程序之外,它的配置很复杂,而且选项太多,初学者可能难以理解。

  • 它不支持 Windows(但在 WSL 上运行)。

  • 在某些情况下,它需要一个编译器才能安装。

此页面概述了运行 uWSGI 的基础知识。务必阅读其文档以了解有哪些可用功能。

安装

uWSGI 有多种安装方法。最直接的方法是安装 pyuwsgi 包,它为常见平台提供了预编译的轮子。但是,它不提供 SSL 支持,可以使用反向代理来提供 SSL 支持。

创建一个虚拟环境,安装应用程序,然后安装 pyuwsgi

$ cd hello-app
$ python -m venv .venv
$ . .venv/bin/activate
$ pip install .  # install your application
$ pip install pyuwsgi

如果您有可用的编译器,则可以安装 uwsgi 包。或者从 sdist 而不是轮子安装 pyuwsgi 包。这两种方法都将包括 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.py
from hello import create_app

app = create_app()
$ uwsgi --http 127.0.0.1:8000 --master -p 4 -w wsgi:app

--http 选项在 127.0.0.1 端口 8000 上启动一个 HTTP 服务器。 --master 选项指定标准工作程序管理器。 -p 选项启动 4 个工作程序进程;一个起始值可以是 CPU * 2-w 选项告诉 uWSGI 如何导入您的应用程序

外部绑定

不应使用此文档中所示的配置以 root 身份运行 uWSGI,因为它会导致您的应用程序代码以 root 身份运行,这是不安全的。但是,这意味着无法绑定到端口 80 或 443。相反,应在 uWSGI 之前使用反向代理,例如 nginxApache httpd。可以安全地以 root 身份运行 uWSGI,但这超出了本文档的范围。

uWSGI 已针对 Nginx uWSGIApache mod_proxy_uwsgi 进行了优化集成,而不是使用标准 HTTP 代理。该配置超出了本文档的范围,有关更多信息,请参阅链接。

您可以使用 --http 0.0.0.0:8000 选项绑定到非特权端口上的所有外部 IP。在使用反向代理设置时不要这样做,否则将有可能绕过代理。

$ uwsgi --http 0.0.0.0:8000 --master -p 4 -w wsgi:app

0.0.0.0 不是有效的导航地址,您将在浏览器中使用特定的 IP 地址。

使用 gevent 进行异步

默认同步工作进程适用于许多用例。如果您需要异步支持,uWSGI 提供了一个 gevent 工作进程。这与 Python 的 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] ***