http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html
这个快速入门指南将会向你展示如何部署简单的 WSGI 应用和普通 web 框架。
Python 在这里特指 CPython,如果你想用 PyPy 你需要使用专门的插件:,Jython 的支持正在开发中。
安装带 Python 支持的 uWSGI
uWSGI 是一个(巨大的) C 应用,所以你需要一个 C 编译器(比如 gcc 或者 clang)和 Python 开发版头文件。
在 Debian 系的发行版上一条
apt-get install build-essential python-dev
命令就够了。
你有多种方式来安装 uWSGI 的 Python 包:
-
pip install uwsgi
-
curl http://uwsgi.it/install
(这将会把 uWSGI 二进制文件安装到
下,你可以随意修改它)。
-
wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
tar zxvf uwsgi-latest.tar.gzmake
(make 完后你会在你的当前目录下得到一个
的二进制文件)。
通过你的发行版的包管理器安装是不能面面俱到的(不可能让所有人都开心),但是一般的规则都适用。
当你使用发行版提供的包来测试这个快速入门的时候,一件你可能想重视的事情就是很有可能 你的发行版是用模块化的方式构建的(每个特性都是一个不同的必须被加载的插件)。 为了完成这个快速入门,你必须在前面第一个例子的前面加上选项, 以及当 HTTP 路由被移除时加上
选项(这可能对你没什么用,继续阅读就好)。
第一个 WSGI 应用
让我们从一个简单的 “Hello World” 例子开始吧(这是在 Python 2.x 中,Python 3.x 需要 返回字节字符串,看下面):
(保存为)。
正如你看到的,它由一个单独的 Python 函数组成。它的名字是 “application”,这是 默认的函数名,uWSGI 的 Python 加载器将会搜索这个名字(但你当然可以修改它)。
Python 3.x 版本如下:
把它部署到 HTTP 端口 9090
现在运行 uWSGI 来启动一个会把请求传递给你的 WSGI 应用的 HTTP 服务器/路由器。
uwsgi --http :9090 --wsgi-file foobar.py
这就是全部了。
添加并发和监控
你想做的第一件事可能就是增加并发(uWSGI 默认启动一个单独的进程和一个单独的线程)。
你可以通过选项或者
(或者两个选项都使用)来增加更多的进程或者线程。
uwsgi --http :9090 --wsgi-file foobar.py --master --processes
这将会产生 4 个进程(每个进程 2 个线程),一个主进程(当你的进程死掉时会重新 spawn 一个新的)以及 HTTP 路由器(见前面)。
一个重要的任何就是监控。知道发生了什么在生产环境中是极其重要的。stats 子系统允许你 用 JSON 输出 uWSGI 的内部数据:
uwsgi --http :9090 --wsgi-file foobar.py --master --processes
向你的应用发送几个请求然后 telnet 到 9191 端口,你将得到大量有趣的信息。你可能想要使用 “uwsgitop” (使用你就能得到它),这是一个类似 top 的工具,用于监控应用实例。
放到一个完整的 web 服务器后
即使 uWSGI HTTP 路由器(router)是一个可靠的高性能服务器,你可能还是想把你的应用放到一完整的 web 服务器后。
uWSGI 通常和 HTTP,FastCGI,SCGI 以及它自己特有的协议 “uwsgi” (呃,名字不应该这么取的) 通信。 性能最高的协议显然是 uwsgi,并且早已被 nginx 和 Cherokee 支持 (同时 Apache 也有许多可用的模块)。
一个普通的 nginx 配置如下:
这个意思是说 “把每个请求传递到服务器绑定的端口 3031,并且使用 uwsgi 协议通信”。
现在我们可以 spawn 一个 uWSGI 进程来天然地以 uwsgi 协议通信:
uwsgi --socket
如果你运行,你将会看到少了一个进程。HTTP 路由器(router)已经从我们的 “workers” (分配给 uWSGI 的进程) 中被移除了,这些 worker 便是天然地用来以 uwsgi 协议形式通信的。
如果你的代理/web 服务器/路由器使用 HTTP 协议,你必须告诉 uWSGI 使用 HTTP 协议(这与通过 –http spawn 一个它自己的代理是不一样的):
uwsgi --http-socket
开机自启动 uWSGI
如果你打算打开 vi 写一个 init.d 脚本来启动 uWSGI,坐下来冷静一下然后先确保 你的系统没有提供一个更好(更现代化)的方式。
没一个发行版会选择一个启动系统 (,...),除此之外也有许多 进程管理工具(supervisord,god,monit,circus...)。
uWSGI 与上面列出的那些工具都集成得很好(我们希望如此),但是如果你想部署大量应用的话, 看看 uWSGI 的- 它或多或少是每个开发运维工程师的梦想。
部署 Django
Django 可能是使用得最多的 Python web 框架了。部署它非常简单(我们仍然使用 4 个进程,2 个线程的配置)。
假定你的 Django 项目在下:
uwsgi --socket
(通过选项我们可以移动一个特定的目录)。在 Django 中为了正确的加载模块这是必须的。
啊!这是什么鬼?!是的,你是对的,你是对的。。。处理这么长的命令行是不实际的,又蠢又容易出错。 不要怕! uWSGI 提供多种配置风格。在这个快速入门里我们将使用 .ini 文件。
更好一点了!
尽管运行它:
uwsgi yourfile.ini
如果(或者其他你的项目的名字) 这个文件不存在,你很有可能 使用的是老的版本的 Django (1.4 以下)。在这种情况下你需要配置更多一点的东西:
uwsgi --socket
或者,使用 .ini 文件:
老版(1.4 以下)的 Django 发行版需要设置,
和
(
使得我们可以访问
模块)。
部署 Flask
Flask 是一个流行的 Python web 微框架。
保存下面这个例子到:
<span class="n">app <span class="o">= <span class="n">Flask<span class="p">(<span class="vm">name<span class="p">)
<span class="nd">@app.route<span class="p">(<span class="s1">'/'<span class="p">)
<span class="k">def <span class="nf">index<span class="p">():
<span class="k">return <span class="s2">"I am app 1"
Flask 把它的 WSGI 函数(就是我们在之前快速入门里称作 “application” 即应用的东西)暴露成 “app”,所以 我们需要告诉 uWSGI 去使用它。 我们仍然使用 4 个进程/2 个线程,以及 uwsgi socket :
uwsgi --socket
(唯一增加的选项便是选项)。
部署 web2py
又是一个流行的选择。你可以选择把 web2py 的发行版源代码解压到一个目录然后写一个 uWSGI 配置文件:
script out of thedirectory.
我们再次使用 HTTP 路由器(router)。用你的浏览器访问 9090 端口然后你就可以看到 web2py 的欢迎页面了。
点击管理页面然后...哎呀,它需要 HTTPS。不要担心,uWSGI 路由器(router)可支持 HTTPS (确保你 有 OpenSSL 开发版的头文件:安装它们然后重新构建 uWSGI,build 系统会自动检测到它)。
First of all generate your key and certificate: 首先生成你的秘钥(key)和证书(certificate):
openssl genrsa -out foobar.key
现在你有两个文件(算上的话就是三个了),
和
。修改 uWSGI 配置:
重新运行 uWSGI 然后使用用你的浏览器连接到 9090 端口。
Python 线程小贴士
如果你没有使用线程启动 uWSGI,Python 的 GIL 将不会被开启,所以你的应用产生的线程 将永远不会运行。你可能不会喜欢这个选择,但是记住 uWSGI 是一个语言无关的服务器,所以它的 大部分选择都是尽可能维持它 “agnostic”。
但是不用担心,基本上不存在不能通过选项来改变的由 uWSGI 开发者决定的选项。
如果你想维持 Python 的线程支持同时应用又不启动多个线程,只需要加上选项 (或者
在 ini 风格配置文件中)。
Virtualenvs
uWSGI 可以被配置成在某个特定的 virtualenv 中搜索 Python 模块。
只要添加到你的选中中就可以了。
安全和可用性
永远不要使用 root 来运行 uWSGI 实例。你可以用和
选项来降低权限: