Flask 部署项目 Nginx + Gunicorn + Flask

Flask 部署项目 Nginx + Gunicorn + Flask

问题

一般服务是单机Gunicorn + Flask部署api接口即可,单机部署一般针对调用量,并发量要求不高的服务。由于目前单机部署不满足前端那边的并发请求,因此需要后端添加机器。问题来了,如何将多个后台ip及端口链接到一个接口,前端调用该接口之后,然后将请求分发给后台的多台机器上。这类的工具有很多,常用的是Nginx,Tengine等。这里选择常见的Nginx。

Flask API

# hello.py

from flask import Flask
app = Flask(__name__)

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

hello world

'
if __name__ == '__main__': app.run(debug=True)

Gunicorn

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

  • 安装
pip3 install gunicorn
  • 配置guncorn.py
  • 通过guncorn启动flask app
gunicorn hello:app

Nginx

安装

  • 查看Linux内核版本,Centos 6,7 / RedHat等
cat /proc/version
uname -a
  • 通过yum安装
sudo yum install nginx
  • 通过rpm安装
# centos 7
wget http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.18.0-1.el7.ngx.x86_64.rpm

rpm -ivh nginx-1.18.0-1.el7.ngx.x86_64.rpm 

接入

假如后台有两台机器:

  • 168.xxx.xx.1:5000/hello;
  • 168.xxx.xx.2:5001/hello;

nginx/nginx.conf

编辑配置文件,在http括号中添加

upstream flask{
    server 168.xxx.xx.1:5000 weight=2;
    server 168.xxx.xx.2:5001;
}

server {
    # 监听8080端口
    listen 8080;
    # 本机
    server_name localhost; 
    # 默认请求的url
    location /hello {
        #请求转发到gunicorn服务器
        proxy_pass http://flask; 
        #设置请求头,并将头信息传递给服务器端 
        proxy_set_header Host $host; 
    }
}

上述配置文件可以通过weight控制权重,比如一个机器性能好,另外一个机器性能差,可以将好性能的机器的权重调高一些;

  • 相关命令
sudo service nginx reload # 重新加载配置
sudo service nginx restart # 重启 nginx 服务
sudo nginx -s reload  # 热更新

下面直接访问 nginx安装的机器IP及端口号 127.0.0.1:8080/hello 就可以将请求分发给后台的两个机器,满足并发的需求。

日志文件可以在这里查看

 /var/log/nginx/access.log

参考

  • https://juejin.cn/post/6916508982433710087

  • https://cloud.tencent.com/developer/article/1585946

  • https://medium.com/@varunchitale/a-simple-python-api-using-flask-with-nginx-setup-on-aws-ec2-4a380ceaf006

你可能感兴趣的:(Web-service,flask,nginx,gunicorn,service,web)