使用Flask+nginx+uWSGI部署API应用

1,157 阅读3分钟

1. nginx, WSGI, uwsgi, uWSGI, Flask之间的关系

客户端向服务器发送一个http请求,一般要经过下面三个阶段:

  1. web服务器:用于接收客户端请求,并向客户端返回响应。

  2. web框架:用于对客户端的请求进行相应的处理,web框架也直接调用了我们自己编写的处理程序。

  3. WSGI协议:WSGI全称为Web Server Gateway Interface,它定义了web服务器和web框架之间相互交互的接口规范,只要web服务器和web框架满足WSGI协议,那么不同框架和服务器之间就可以任意搭配。要注意的是WSGI只适用于python语言。

Flask+nginx+uWSGI 之间的关系:

nginx就是一个web服务器

Flask就是一个web框架,常用的其他web框架还有Django

uwsgiWSGI一样,是一种通信协议

uWSGI是一个web服务器,它实现了WSGI、uwsgi、http等协议,其作用就是把HTTP协议转化成语言支持的网络协议,用于处理客户端请求,并向客户端返回响应。这里的uwsgi则是uWSGI服务器的独占协议,与WSGI是两种不同的协议。

需要Nginx的原因:

通过上面的描述中可以得出,uWSGI+Flask就可以实现一个完整的web服务,似乎不需要Nginx服务器。 当一个服务访问量过大时,我们可能会考虑多部署几台web服务器,这几台web服务器都可以处理客户端请求,但问题是如何将客户端请求分发到各个web服务器上?这就是Nginx的作用->反向代理服务器。

正向代理服务器(Proxy Server):用于代理客户端请求来访问外部网络信息,这种方式可以隐藏客户端真实IP,突破访问限制,保护客户端安全,VPN就是这种原理。

反向代理服务器(Reverse Proxy Server):反向代理服务器的功能是代理服务器接收客户端发来的请求,转发到相应的web服务器上进行处理,并将结果返回给客户端,反向代理服务器相当于是代理web服务器而不是客户端。

2. 安装与配置

(1). uWSGI,Flask 可以直接使用 pip 来安装:

pip install uwsgi, flask

(2). Nginx 可以使用系统中自带的软件包管理工具进行安装, 如:

apt-get updateapt-get install nginx

(3). 各种路径:

项目路径:/home/project/br_api

python应用文件:/home/project/br_api/online_api.py

uwsgi.ini的路径:/home/project/br_api/uwsgi.ini

nginx默认配置文件:/etc/nginx/nginx.conf

项目自定义配置文件:/etc/nginx/conf.d/project.conf

(4). online_api.py 文件:

import json
from flask import Flask, request

app = Flask(__name__)

@app.route('/test', methods=['get','post'])
def login():
    para_1 = request.values.get('xxx')
    para_2 = request.values.get('xxx')
    if para_1 and para_2:
        if xxx:
            data = do something
        else:
            data = do something
        resu = {"Response": {'data': data}}
        return json.dumps(resu, ensure_ascii=False)
    else:
        resu = {"Response": {"Error": "InvalidParameter"}}
        return json.dumps(resu, ensure_ascii=False)

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

(5). 配置uwsgi.ini文件:

[uwsgi]
master = true
wsgi-file = online_api.py
callable = app
socket = 0.0.0.0:1028
processes = 4
threads = 1
buffer-size = 32768
logto = logs/online_api.log

socket: 设定 Flask 的地址和端口号。

processes: 设定应用进程的数量。

threads: 设定每个进程的线程数量。

在 uwsgi.ini 文件中要特别注意 socket 参数一定要与 Flask 中设置的相同,Flask 默认的地址和端口号是 127.0.0.1:5000,如果你修改了默认值请记得修改这里。

(6). 配置Nginx

找到自定义配置文件/etc/nginx/conf.d/project.conf,修改以下部分

server {
    listen 10008;    ****   修改端口
    server_name 10.210.164.80;   ****  修改服务器ip
    location / {
        include uwsgi_params;
        uwsgi_pass localhost:1028;  ****这里需要和uwsgi配置文件中的socket一致
        uwsgi_param UWSGI_CHDIR /home/project/br_api; ****更改路径至api文件夹位置
        uwsgi_param REMOTE_ADDR $remote_addr;
        uwsgi_send_timeout 600; 
        uwsgi_connect_timeout 600;
        uwsgi_read_timeout 600;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

默认配置文件基本上不用配置,保证其http{}里面包含上面的自定义文件就好了。

(7). 启动Nginx服务器、启动uwsgi服务器

service nginx restart

uwsgi --ini uwsgi.ini