nginx+uwsgi+flask 简单部署记录备忘
nginx & uwsgi & flask三者的关系
先看下这个结构图
图中的几个地方解释:
nginx : 前端服务器 就是第一级 用来直接接受用户请求的http服务器。 一般收到请求常见的处理是转发给本机的cgi(不管是古老的cgi还是fast cgi还是wsgi协议)处理或者转发给其他机器上的nginx继续路由处理。
cgi / fast cgi /wsgi 协议层: 本质上都是类似cgi的东西,本质就是规定了前端服务器(nginx)如何和cgi服务沟通。 其中fast cgi是现在比较常见的改良版cgi(具体先不展开)。 wsgi是python专用的一个cgi协议(虽然感觉就是python版的fast cgi,据说性能吊打fast cgi 我差点就信了- , - )。
uwsgi : 一个wsgi协议的实现。 入口是一个可执行程序。常用命令有三个
1 uWSGI 启动(以这个ini配置开始运行):
uwsgi --ini xxx.ini
2 uwsgi 重启:
uwsgi --reload xxx.pid
3 uwsgi 停止:
uwsgi --stop xxx.pid
通过这个东西,我们只要准备一个ini文件和一个符合规范的py入口文件就可以起来一个wsgi协议的cgi或者http服务器了。可以作为cgi(后端服务器)也可以直接作为http服务器
flask : 这个是web编程框架。 本质上uwsgi + py入口文件就可以搞完了。但是flask只是封装了一些东西(写uwsgi的py入口文件的时候加载这个包会更方便一些),比如web框架层的复杂路由规则处理(每次都在nginx那里配了reload不是很麻烦嘛~),比如支持一些其他的扩展啥的。 但是本质还是封装,核心Flask这个类的重写了call方法,使其可以作为py入口文件被uwsgi使用而已。下面会再说到.
先从uwsgi开始
首先pip安装uwsgi,然后敲 which uwsgi 你会看到uwsgi的位置
这个就是uwsgi了 ,怎么用呢。
要开始用uwsgi起一个cgi或者http服务。 你需要准备2个东西。
一个是启动一个uwsgi的配置文件(本篇使用ini)
一个是启动一个uwsgi的py入口文件,里面需要包含一个包含2个参数的方法(不配置的话方法名默认是application, 这个可以改 后面再看)
先看配置文件,简单注释了下
其中 如果你起来是做cgi和nginx配合的就配置socket 如果是独立做http服务就配置http项
wsgi-file 就是你的py入口文件
其他看注释 = =
uwsgi的配置项有很多,详情可以看文档
官方文档
https://uwsgi-docs.readthedocs.io/en/latest/Configuration.html
中文文档
https://www.bookstack.cn/read/uwsgi-docs-2.0-zh/e7d161bfa19cced5.md
再看py文件
py文件是有规范的.比如这个
就是要有一个方法,像上面那个ini没有配置入口方法名,这里的默认名字就是application
return就是你吐回去的http报文了,这里测试随便写个字符串测试用的。
启动
uwsgi --ini xxx.ini 上面提到的这个命令即可 xxx.ini 就是你的配置文件,启动参数都配在里面了。
然后如果你是用http方式启动的话,你可以直接浏览器拼ip:port访问了
如果你是配socket项 接着往下走
nginx部分
首先安装nginx
然后你需要一个配置,比如这样的
这里nginx用的1234端口
启动参数同样在配置里了,比较重要的就是一些log目录,还有2个uwsgi的路由配置
上图 /hhh 表示: 本机ip:1234/hhh 的url都转发给对应配置的wsgi,其中include部分是一个路径,nginx安装完后/etc/nginx/这个目录下会给你备好 fastcgi_params , uwsgi_params 之类的几个文本,里面写了一些对应协议的环境变量名字约定我们引用就好.
uwsgi_pass 就是转发的uwsgi监听的端口路径(和你上面起的uwsgi一致就好)
然后就nginx -c xx.conf 就可以按这个配置启动了就vans了。 = =
nginx 常用命令就是
nginx -c xx.conf 指定配置启动
nginx -s reload 重新reload配置
nginx -s stop 快速退出
nginx -s quit 优雅退出(请求处理完了退出)
好了好了 然后你会发现本机ip:1234/hhh 已经可以请求到你的uwsgi了(链路是先到1234端口的nginx,然后nginx转发给监听9090端口uwsgi)
终于到flask了
抄完上面的作业,web服务已经起来了 。 但是我们写业务代码还是很麻烦。
比如一些url路由逻辑(你自己获取url自己实现也可以,但是每次都写一遍就很麻烦 = =,nginx也可以配但是你不会想每次加个新接口都去nginx里改配置reload一下这么搞的),还有一些flask给你封装好 or 引入的模块。 比如通过jinja2模版方便的渲染一个html返回,再比如flask-login 之类的,加上flask这个web框架你可以少写很多代码。
下面是flask的作业:
准备工作和uwsgi一样(flask只是一个web框架和业务代码我觉得可以算同一层= =,还是用uwsgi添加py入口启动的)
首先 一个配置
可以看到和单纯裸的uwsgi版本其实是一样的配置项目
关键的区别在于入口文件引入flask框架
可以看到 py文件里需要的就是创建一个Flask对象(这里起的名字叫app)然后配置里callable项填这个名字告诉uwsgi收到消息传给这个方法执行就好了。app.route装饰器用来生命每个接口对应的url 和 get/post那些。
flask文档快速入门
http://docs.jinkan.org/docs/flask/quickstart.html#a-minimal-application