基于 Flask+Gunicorn+Nginx 在 centos 部署实战

参考:Flask 应用如何部署

Gunicorn 运行与配置

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

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

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

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

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 了。

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

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 的转发,也是便于负载均衡和自动容灾。

简单的案例如下。

server {
    listen 80;
    listen [::]:80;
    
    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

更多配置自己搜一下即可