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的包裹,而不是车轮。这两种方法都将包含对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 选项在端口8000的127.0.0.1上启动一个HTTP服务器。这个 --master 选项指定标准工作人员经理。这个 -p 选项启动4个工作进程;起始值可以是 CPU * 2 。这个 -w 选项告诉uWSGI如何导入您的应用程序

对外约束

UWSGI不应该使用本文档中所示的配置以超级用户身份运行,因为这会导致您的应用程序代码以超级用户身份运行,这是不安全的。但是,这意味着无法绑定到端口80或443。相反,像这样的反向代理 恩吉克斯ApacheHTTPD 应在uWSGI前面使用。以超级用户身份安全运行uWSGI是可能的,但这超出了本文档的范围。

UWSGI优化了与 Nginx uWSGIApache 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的不同 async/await 或ASGI服务器规范。您必须在自己的代码中实际使用gEvent,才能看到使用Worker的好处。

使用GEvent时,greenlet>=1.0是必需的,否则上下文局部变量,如 request 将不会像预期的那样工作。使用PyPy时,需要使用>=7.3.7的PyPy。

$ 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] ***