Pulpcode

捕获,搅碎,拼接,吞咽

0%

使用uwsgi和nginx部署flask环境

flask自带的web server仅仅能用于开发,因为它本身就不是一个web服务器,而是一个web 框架,这和tornado刚好是相反的。

这时候我们需要一个生产的部署方案,mod_wsgi已经是过去时了,uwsgi已经算是现在标准的python web 部署方案了。

uwsgi可以使你的服务以多进程,多线程执行,但因为python的线程是有GIL的,所以一般在每个worker进程里面只有一个线程,而且维护一个数据库连接就行了,也无需使用连接池。

uwsgi将会对每一个请求开进程,这种进程并不是那种让你觉得很浪费资源的fork,这是一种被成为prefork的技术。也就是多线程池,会预先生成若干个进程来处理请求。 下面我们就来部署一个这样的webserver。

安装uwsgi

先写一个最简单的flask服务程序吧

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python
# encoding: utf-8

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello World!'

if __name__ == '__main__':
app.run()

然后pip安装 uwsgi,

1
pip install uwsgi

现在我们直接可以用uwsgi来运行我们的程序了。

1
uwsgi --http :8888 --module main --callable app

这样服务就开启了,你可以使用如下方式访问:

1
curl http://localhost:8888

需要注意的是,还可以添加其它参数:比如–processes=10,将会有10个工作进程。
而threads将开启线程操作模式。你必须指定每个工作进程的线程数:–processes 4 –threads 2

但是实际上,我们的并不直接暴露uwsgi服务,而是在它前面还有一个nginx。

nginx

为什么要nginx

  1. 你的机器上有多个web server,它们都需要监听80端口,这个时候nginx就很有必要了
  2. uwsgi对静态资源的处理不是很好,这个时候就需要nginx了。
  3. nginx是一个更专业,更安全的服务器。
  4. nginx可以用来做负载均衡。

uwsgi配置

首先我们需要配置一个uwsgi配置。

1
2
3
4
5
6
7
8
9
10
<uwsgi>
<chdir>项目根目录</chdir>
<module>模块名</module>
<callable>启动服务入口</callable>
<socket>socket文件</socket>
<master/>
<processes>进程数</processes>
<memory-report/>
</uwsgi>

nginx配置

接着是一个nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server
{
listen 8888;# 我们web应用的端口
server_name localhost;
root /etc/uwsgi; # uwsgi配置文件路径。
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9090;# uwsgi服务的端口是9090,而非我们的web应用
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

当然你需要把它include 到 主配置(nginx.conf的http部分)

更多内容还是要访问官方文档:
http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html