Nginx+gunicorn+Flask安装指南
Introduction
本文介绍如何使用Flask微框架在Ubuntu 15.10上搭建一个WEB应用,并使用guniconr Server来启动应用和设置Nginx作为前端反向代理。
关于WSGI的一些概念
gunicorn是一个运行于unix环境的遵循python WSGI规范的WEB Server。WSGI(web server gateway interfaces)是一种python中定义WEB应用/框架 与 WEB服务器/应用服务器之间通信规范的接口标准,旨在简化和规范上述部件间的通信,并使各部分易于替换。它定义了一组可用于其它协议之上的接口。
因此作为一种WSGI实现的gunicorn可以将HTTP请求转换为WSGI定义的python标准请求,可被同样遵循了WSGI规范的应用如django,flask接收处理,处理后的响应也同样可被逆向转换为http response并回到客户端。
nginx在此场景中则作为一个http request代理,将不uri或类型的请求发送至不同的web server处理,比如静态图片可由自己处理,而动态的数据库查询可交给flask应用来完成。
WHY Gunicorn
如果Flask也可以直接处理http请求,为何要使用WSGI的Gunicorn或者其它如uWSGI这样的管理服务呢?除了前面所提到的松耦合原因外,还因为其具有强大的worker进程管理能力,Gunicorn可以同时运行多个flask进程并为其分配来自客户端的请求,也可以自动重启中断的进程,从而提高了伸缩性和可用性。
安装依赖包
如果已经安装可以忽略
创建python虚拟环境
virtualevn可以为每个python应用创建虚拟环境,因此我们可以用来使flask应用与其它python文件隔离。
现在创建工程目录并进入,然后创建项目的虚拟python环境目录并激活
激活之后,提示符最前面会出现相应的(myprojectenv) 提示(myprojectenv)user@host:~/myproject$
。
创建Flask应用
安装Flask
继续在虚拟环境中执行
创建应用
使用文本编辑器创建一个内容如下的文件vi ~/myproject/myproject.py
:
运行python myproject.py
,在浏览器中访问http://127.0.0.1:5000可以见到"Hello There”字样。
测试成功后,可以ctrl+c关闭进程,进入下一步。
创建wsgi入口
接下来我们要创建一个应用的入口文件,通过它Gunicorn知道如何与应用交互。这里它也是一个简单的文本文件vi ~/myproject/wsgi.py
。
测试Gunicorn
可以只指定入口参数,这里我们还指定了服务地址:
此时使用浏览器同样应该能在本机的8000端口上看到同样的”Hello There”字样。测试成功之后,可以输入deactivate
退出virtualevn虚拟环境。
创建自启动脚本
本人Linux发行版为ubuntu 15.10,使用了systemd来管理自启动,使用脚本编写请按照自己的发行版格式,比如upstart等。
先给出完整的脚本内容
Restart=on-failure
保证进程中断会被自动重启Environment=PATH=/data/myproject/myprojectenv/bin
这里可以设置一些额外的环境变量WorkingDirectory
相当于chdirExecStart
最重要部分,需要在开机时运行的命令。这次我们使用了socket文件而不是网络端口来与nginx通信,这样可以避免每个进程占用一个端口。
最后[Install]
字段中的WantedBy=multi-user.target
类似upstart脚本中指定runlevel=[2345]的作用,保证脚本在开机时自动执行。
配置nginx请求代理规则
配置Nginx将特定的http请求转发到gunicorn创建的socket上,只需要在nginx的规则上增加一小部分即可。
其内容为
这里需要注意的是请确定nginx有权限访问socket文件,一般将其放置在/tmp目录即可。
将规则启用
启动之前,还可以测试配置文件是否正确
如果一切正常,就可以重启nginx了