0%

2020-04-01 基于 Flask+Gunicorn+Nginx 在 centos 部署实战

2020-04-01 基于 Flask+Gunicorn+Nginx 在 centos 部署实战

参考:Flask 应用如何部署

Gunicorn 运行与配置

具体的流程在上述两个参考中已经有提到了,本人就提一些我自己的想法和看法好了。

首先是我想折腾的目的。就是为了使用 jieba 分词来开发一个分词 api,为此需要学习一下 python 如何部署服务器。

因此,在百度之后选择了Flask这个框架,可以说是非常好用了,借助装饰器可以非常方便的写出服务器后台。

下面看一个最简单的 flask 案例。

1
2
3
4
5
6
7
8
9
10
from flask import Flask, abort, request

app = Flask(__name__)

@app.route('/')
def hello_world():
return 'hello world'

if __name__ == '__main__':
app.run(port=8080, host='0.0.0.0', debug=True)

运行之后,打开浏览器直接访问 8080 就能看见一个 hello world 了。

下面来看一个稍复杂的案例,如果理解了那么就能写出服务器后台了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from flask import Flask, abort, request

app = Flask(__name__)


@app.route('/test/<params>', methods=['POST'])
def test_post(params):
print('form', request.form)
print("json", request.json)
print("args", request.args)

return {
'params': params,
'body': request.json,
'query': request.args
}, 200


@app.route('/test/<params>', methods=['GET'])
def test_get(params):
print('params', params)
print("args", request.args)
return {
'params': params,
'query': request.args
}, 200


if __name__ == '__main__':#这样写的目的是为了只在开发环境下debug
app.run(port=8080, host='0.0.0.0', debug=True)

一个一个来说吧。

首先是 app.route 这个装饰器。就是负责将路由挂载上去的。只要给一个函数添加这个装饰器,那就是一个路由了。而后面的参数 methods 则是指定了响应的方法,默认就是 GET。注意这里的方法名都要大写。

接下来是 request 对象。这个对象有着多个字段。重要的就是 request.form、request.json、request.args。在 get 方法中只有 request.args。args 中存放解析成字典对象的查询字符串,也就是 URL 中?后面的部分。

例如http://127.0.0.1:8080/test?msg=abc就会解析成{'msg':'abc'}。类似的,在 post 请求中,如果是表单格式的数据,会被解析到 form 中,如果是 json 格式,则会解析到 request.json 中。

在这里稍微注意一个细节,在 args 和 form 中所有的值都是字符串类型的,而 json 中则会按照 js 对象和 python 的数据类型互相转换。

接下来就是 gunicorn 使用了,直接pip install gunicorn安装即可

然后 cd 到脚本目录,执行gunicorn -w 2 -b :8080 app:app。注意 app:app,前一个 app 是你要运行的脚本的名称,自己修改下命令行即可。

具体参数就不解释了,看 gunicorn 文档即可,只要顺利运行起来就已经完成了。

现在,一个 python 服务器就已经完成了。对于流量很小的情况,这也可以直接使用了。

不过在生产环境中,出于多方面的考虑,还是会在外面套一层 nginx 的转发,也是便于负载均衡和自动容灾。

简单的案例如下。

1
2
3
4
5
6
7
8
server {
listen 80;
listen [::]:80;

location / {
proxy_pass http://127.0.0.1:8080;
}
}

更多配置自己搜一下即可

本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/4b6ecb36.html
版权声明:转载请注明出处!

坚持原创技术分享,您的支持将鼓励我继续创作!