flask+gunicorn+nginx部署pytorch/python应用

80 篇文章 3 订阅

flask+gunicorn+nginx部署python应用

前言现在大多数的机器学习和深度学习都是采用python实现的,作为学术研究者,更关注算法的实现,作为工程实际,则更在意模型限制、速度、精度和部署等问题。这里用flask+gunicorn+nginx实现python应用的部署,同理可以迁移到pytorch、tensorflow等机器学习、深度学习模型的部署。

1. 基于flask实现python服务

Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。

  • 安装:采用anaconda/miniconda安装python的时候,应该已经安装了。
  • 使用:这里举个简单的例子,也为后面使用gunicorn和nginx做准备。
# main.py
from flask import Flask
app = Flask(__name__)
@app.route('/predict')
def index():
    return 'this server is running on port:6001, url is predict'
    # 在index函数就可以添加任何操作,如机器学习/深度学习模型操作等

if __name__=='__main__':
    app.debug = True
    app.run(host="0.0.0.0", port=6001)
  • 运行,在终端输入:python main.py # main.py为python文件名
    这里在本机的6001端口起了一个服务,如果在浏览器中访问http://0.0.0.0:6001/predict,就会打印出:this server is running on port:6001, url is predict
  • 结果,如下图所示
    在这里插入图片描述
  • 小结,采用flask相对简单,应该不能支持并发,所以需要gunicorn

2. 并发支持gunicorn

Gunicorn 绿色独角兽’是一个Python WSGI UNIX的HTTP服务器。这是一个预先叉工人模式,从Ruby的独角兽(Unicorn )项目移植。该Gunicorn服务器大致与各种Web框架兼容,只需非常简单的执行,轻量级的资源消耗,以及相当迅速。
使用gunicorn的目的,主要是为了并发和鲁棒性。

  • 安装:直接使用python的包管理工具pip就可以直接安装
pip install gunicorn
  • 参数设置,其实就是告诉服务的地址,并发数,超时时间等信息:gunicorn支持三种参数设置,主要采用config文件和命令行两种
    • config文件:通过一个python文件做配置,使用时采用
    gunicorn -c confing.py    # config.py为配置文件
    
    参考配置项如下,具体可以百度。
      # coding:utf-8
      # config.py
      import os
      import multiprocessing
      bind = '127.0.0.1:8000'      #绑定ip和端口号
      backlog = 512                #监听队列
      # chdir = '/home/test/server/bin'  #gunicorn要切换到的目的工作目录
      timeout = 30      #超时
      worker_class = 'gevent' #使用gevent模式,还可以使用sync 模式,默认的是sync模式
    
      workers = multiprocessing.cpu_count() * 2 + 1    #进程数
      threads = 2 #指定每个进程开启的线程数
      daemon = True   # 后台运行的方式
    
    其中最主要bind:指定服务的地址和端口,workers:进程数,为了支持并发等
    • 命令行:直接在命令行指定参数,例子如下:
    gunicorn -w 5 -b 0.0.0.0:8000 main:app --reload -t 500 -D
    
    参数解释:
    • -w:进程数
    • -b:ip和端口号
    • main:app:进程服务
    • –reload:python文件修改时自动重载
    • -t:超时时间
    • -D:后台运行
  • 运行,这里分别采用两种方式启动前面main.py的flask服务
    • 配置文件
    gunicorn -c config.py main:app    # main指flask应用的python文件,app指flask应用,注意这里采用的是config.py配置文件中的8000端口,而不是main.py中的6001,所以也可以采用python main.py启动flask应用。
    

在这里插入图片描述

  • 效果:在浏览器访问http://0.0.0.0:8000/
    效果
    可以看到6001端口变成了8000

    • 命令行
    gunicorn -w 4 -b 127.0.0.1:8000 main:app
    
  • 但是,现在有另外一个问题,你在本机是可以访问了,但是别人的电脑却访问不了你的服务。如下图。这个时候就需要nginx了
    在这里插入图片描述

3. nginx

Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。

  • 安装:
sudo apt-get install nginx
  • 配置修改:先备份原有配置,再修改
sudo cp /etc/nginx/sites-available/default default.bak
sudo nano /etc/nginx/sites-available/default

可参数如下配置:

server {
    listen 80;
    server_name example.org; # 这是HOST机器的外部域名,用地址也行

    location / {
        proxy_pass http://127.0.0.1:8000; # 这里是指向 gunicorn host 的服务地址
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

  }

关键参数详解:

  • listen:对外的端口
  • server_name:对外的域名
  • proxy_pass: 要映射到的服务地址
  • 验证配置
sudo nginx -t
# 若输出,则配置成功
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
  • 启动nginx
sudo service nginx restart
  • 停止nginx
sudo service nginx stop
  • 效果:这时候在浏览器访问:http://0.0.0.0,就会出现下图效果。
    在这里插入图片描述
    这里出现了问题,因为nginx做反向代理的时候,服务的地址为:http://127.0.0.1:8000,然而8000为gunicorn配置的端口,这些都没问题,唯独少了 /predict,因为flask应用是监听:/predict后缀的。
    所以,做如下修改:
proxy_pass http://127.0.0.1:8000; # 这里是指向 gunicorn host 的服务地址
# 改为
proxy_pass http://127.0.0.1:8000/predict; # 这里是指向 gunicorn host 的服务地址

然后重启nginx,正确效果如下:
在这里插入图片描述

4. 总结

整个流程就是nginx——gunicorn——flask,可以参考这里的总结Flask + Gunicorn + Nginx 部署

reference

  1. Flask+Gunicorn+Nginx配置多个app
  2. Flask + Gunicorn + Nginx 部署
  3. Python日记——nginx+Gunicorn部署你的Flask项目
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值