1,目的
在生产环境下,可以通过Nginx+uwsgi+Flask部署Web服务,从而达到高并发高稳定性的要求。
如果要部署多个APP,可以采用单个Nginx,多个uwsgi+Flask的方式来实现,如下图所示。
2,安装过程
2.1,升级软件包
1 | sudo apt-get update |
2.2,安装virtualenv和python环境
1 | sudo apt-get install build-essential python-dev python-pip |
2.3,在virtualenv中部署flask app,并测试
- 创建存放网站的目录
1 | mkdir mysite |
- 配置virtualenv和安装flask
进入mysite目录,然后创建虚拟环境.env,激活虚拟环境,然后安装flask
1 | cd mysite |
- 在mysite目录下创建hello.py
1 | from flask import Flask |
需要注意的是,app.run()只是开发时测试使用,故需要放置在if __name__ == "__main__"
下,这样uwsgi才不会执行app.run()方法。而host需要设置为0.0.0.0,表示让flask监听机器的所有ip地址的8080端口。
- 启动测试
执行以下命令,可以启动Flask。通过浏览器访问192.168.1.32:8080/app1/,如果返回“Hello World!”,则证明启动OK。
1 | python hello.py |
2.4,在virtualenv中部署uwsgi,并测试
- 进入到Python虚拟环境,并安装uwsgi
1 | source .env/bin/activate # 进入Python虚拟环境,退出命令是deactivate |
- 创建uwsgi目录,做好目录规划如下
1 | (.env) kevin@orange:~/web/flask/mysite$ tree . |
- 修改uwsgi配置文件
1 | (.env) kevin@orange:~/web/flask/mysite$ vi uwsgi.ini |
配置参数的含义,可参考http://www.jianshu.com/p/c3b13b5ad3d7
常用命令
1 | uwsgi --ini uwsgi.ini # 启动 |
- 启动uwsgi(在虚拟环境下),并测试
1 | (.env) kevin@orange:~/web/flask/mysite$ uwsgi --ini uwsgi.ini |
2.5,安装nginx,并配置测试
- 安装nginx(不在python虚拟环境下)
1 | sudo apt-get install nginx |
- 编辑配置文件:/etc/nginx/conf.d/flask.conf
1 | server { |
- nginx启动测试
1 | kevin@orange:~/web/flask/mysite$ sudo service nginx start |
2.6,服务测试
- Http访问测试,一切OK
1 | kevin@Blue:~$ curl http://192.168.1.32:81/app1/flask/ |
- 浏览器访问测试,一切OK
3,服务监控
读取uwsgi实时状态
1
uwsgi --connect-and-read uwsgi/uwsgi.status
读取的结果是个json串,包括每个总的状态,每个work是状态,响应时间等,非常全面,也有一些开源的监控可以使用
实时动态查看状态 - uwsgitop
这里有个uwsgi官方制作的实用工具 uwsgitop, 下面看下效果。
1 | pip install uwsgitop |
4,参考资料
- 如何理解Nginx, WSGI, Flask之间的关系
http://blog.csdn.net/lihao21/article/details/52304119 - uWSGI的安装与配置
http://blog.csdn.net/chenggong2dm/article/details/43937433 - uWSGI实战之操作经验
http://blog.csdn.net/orangleliu/article/details/48437319 - nginx配置参考
http://wiki.nginx.org/HttpUwsgiModule#uwsgi_param - uwsgi安装参考
http://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html - uwsgi配置参考
http://uwsgi-docs.readthedocs.io/en/latest/Options.html#vacuum - Nginx+uWSGI
https://my.oschina.net/guol/blog/121418