flask自带的web server仅仅能用于开发,因为它本身就不是一个web服务器,而是一个web 框架,这和tornado刚好是相反的。
这时候我们需要一个生产的部署方案,mod_wsgi已经是过去时了,uwsgi已经算是现在标准的python web 部署方案了。
uwsgi可以使你的服务以多进程,多线程执行,但因为python的线程是有GIL的,所以一般在每个worker进程里面只有一个线程,而且维护一个数据库连接就行了,也无需使用连接池。
uwsgi将会对每一个请求开进程,这种进程并不是那种让你觉得很浪费资源的fork,这是一种被成为prefork的技术。也就是多线程池,会预先生成若干个进程来处理请求。 下面我们就来部署一个这样的webserver。
安装uwsgi
先写一个最简单的flask服务程序吧
1 | #!/usr/bin/env python |
然后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
- 你的机器上有多个web server,它们都需要监听80端口,这个时候nginx就很有必要了
- uwsgi对静态资源的处理不是很好,这个时候就需要nginx了。
- nginx是一个更专业,更安全的服务器。
- nginx可以用来做负载均衡。
uwsgi配置
首先我们需要配置一个uwsgi配置。
1 | <uwsgi> |
nginx配置
接着是一个nginx配置
1 | server |
当然你需要把它include 到 主配置(nginx.conf的http部分)
更多内容还是要访问官方文档:
http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html