Flask项目部署到服务器

一、WSGI(Python web服务器网关接口)

WSGI(Web Server Gateway Interface),翻译为Python web服务器网关接口,即Python的Web应用程序(如Flask)和Web服务器(如Nginx)之间的一种通信协议。也就是说,如果让你的Web应用在任何服务器上运行,就必须遵循这个协议。

实现WSGI协议的web服务器有哪些呢?就比如uWSGI与gunicorn。两者都可以作为Web服务器。可能你在许多地方看到的都是采用Nginx + uWSGI(或gunicorn)的部署方式。实际上,直接通过uWSGI或gunicorn直接部署也是可以让外网访问的,所以简单的项目直接使用uWSGI或gunicorn即可。

那另一个Web服务器——Nginx,是一个反向代理软件,主要为了处理大量的请求。这里可以说明,如果你选择的架构是:Nginx + WSGI容器 + web应用,WSGI容器相当于一个中间件;如果选择的架构是uWSGI + web应用,WSGI容器则为一个web服务器。

在本地开发了一个flask项目,如何将其部署到互联网上?

目前有2种比较常见的方法:uwsgi和Gunicorn

二、uWSGI与gunicorn以及一些概念

1,uWSGI

在部署之前,我们得先了解几个概念

wsgi web应用程序之间的接口。它的作用就像是桥梁,连接在web服务器和web应用框架之间。

uwsgi 是一种传输协议,用于定义传输信息的类型。

uWSGI 是实现了uwsgi协议WSGI的web服务器。

2,gunicorn

gunicorn是一个python Wsgi http server,只支持在Unix系统上运行,来源于Ruby的unicorn项目。Gunicorn使用prefork master-worker模型(在gunicorn中,master被称为arbiter),能够与各种wsgi web框架协作。

uWSGI和Gunicorn

https://www.cnblogs.com/ameile/p/7447232.html

3,Nginx

[Nginx| http://nginx.com/ ]是轻量级、性能强、占用资源少,能很好的处理高并发的反向代理软件。起初我也不知道为什么要用Nginx,心里想难到不可以直接运行Flask项目,就像在自己的电脑上测试时也没有安装这个东西啊?一头雾水是吧!后面搜索了解一番后才渐渐开始明白:Flask ,Django 自带的web server的目的就是用于开发,而不是生产环境。他们俩本身是web framework而不是web server. 他们自带的server应该都只能开单进程,在自己测试时,我们的目的很单纯,请求程序的人也不多,我们的后台自然很安全,但是一旦服务器上线了那个就大不同了,用户的目的不像我们那样单纯,而且他们人多会疯狂发起请求,靠我们不专业处理请求的flask自带的web server怎么处理得过来呢,所以我们当然要靠牛掰的Nginx来帮忙咯。

4、gunicorn和nginx关系

gunicorn 可以单独提供服务,但生产环境一般不这样做。首先静态资源(jscssimg)会占用不少的请求资源,而对于 gunicorn 来讲它本身更应该关注实际业务的请求与处理而不应该把资源浪费在静态资源请求上;此外,单独运行 gunicorn 是没有办法起多个进程多个端口来负载均衡的。

nginx 的作用就是弥补以上问题,首先作为前端服务器它可以处理一切静态文件请求,此时 gunicorn 作为后端服务器,nginx 将会把动态请求转发给后端服务器,因此我们可以起多个 gunicorn 进程,然后让 nginx 作均衡负载转发请求给多个 gunicorn 进程从而提升服务器处理效率与处理能力。最后,nginx 还可以配置很多安全相关、认证相关等很多处理,可以让你的网站更专注业务的编写,把一些转发规则等其它业务无关的事情交给 nginx 做。

5、总结下这几个部分的关系:

https://www.cnblogs.com/xyou/p/8107872.html

image-20220414104311860

(nginx收到客户端发来的请求,根据nginx中配置的路由,将其转发给WSGI)

nginx:”WSGI,找你的来了!”厦门叉车租赁

(WSGI服务器根据WSGI协议解析请求,配置好环境变量,调用start_response方法呼叫flask框架)

WSGI服务器:”flask,快来接客,客户资料我都给你准备好了!”

(flask根据env环境变量,请求参数和路径找到对应处理函数,生成html)

flask:”!@#$%^……WSGI,html文档弄好了,拿去吧。”

(WSGI拿到html,再组装根据env变量组装成一个http响应,发送给nginx)

WSGI服务器:”nginx,刚才谁找我来着?回他个话,!@#$%^…..”

(nginx再将响应发送给客户端)

https://blog.csdn.net/yiweibian/article/details/102552872

6,正向代理和反向代理

反向代理为何叫反向代理? - 刘志军的回答 - 知乎 https://www.zhihu.com/question/24723688/answer/128105528

image-20220414104327397

image-20220414104342285

7,生产环境、开发环境的区别

软件开发环境-开发环境、测试环境、生产环境的区别

https://blog.csdn.net/yangzaiqiu1986814/article/details/51658293

项目部署环境一般可分为三种:生产环境,测试环境,开发环境

开发环境:开发环境时程序猿们专门用于开发的服务器,配置可以比较随意,为了开发调试方便,一般打开全部错误报告和测试工具,是最基础的环境。开发环境的分支,一般是feature分支。

测试环境:一般是克隆一份生产环境的配置,一个程序在测试环境工作不正常,那么肯定不能把它发布到生产服务器上,是开发环境到生产环境的过度环境。测试环境的分支一般是develop分支,部署到公司私有的服务器或者局域网服务器上,主要用于测试是否存在bug,一般会不让用户和其他人看到,并且测试环境会尽量与生产环境相似。

生产环境: 生产环境是指正式提供对外服务的,一般会关掉错误报告,打开错误日志,是最重要的环境。部署分支一般为master分支。

三个环境也可以说是系统开发的三个阶段:开发->测试->上线,其中生产环境也就是通说的真实的环境,最后交给用户的环境。

-----------------------------------------------

三、将Flask项目到阿里云服务器

服务器一般的系统是ubuntu或者centos,由于个人的服务器为ubuntu,所以以下的步骤是基于此展开的。两个系统的大致步骤是一样,可能具体的安装指令略有区别。

项目部署的步骤:先安装python环境(将默认改为python3),在flask项目文件下创建Virtualenv,所用指令为virtualenv venv。启用venv,指令为source venv/bin/activate 。在虚拟环境中安装uwsgi或者gunicorn。在虚拟环境venv中安装requirements.txt(这个是在本地flask环境中打包出来的)中所需要的flask依赖。写一个conf配置文件,指明flask项目需要运行的端口;当然也可以不写配置文件,直接在运行指令中说明。退出venv,指令为deactivate。

ps:建议先用一个只含简单接口的flask项目运行试试。其他诸如nginx和Supervisor都可以不用配置。

难点:python环境的准备,以及你的算法所需要的一些环境配置。安装requirements.txt中的依赖,可能会有一些包安装失败,需要想办法解决。gunicorn或者uwsgi的安装,有些人装gunicorn比较容易、有些人装uwsgi比较容易,但我建议是装gunicorn。后台运行使用nohup指令,查看进程使用ps指令,杀掉进程使用kill指令,具体使用方式可以查阅资料。

简单教程:

https://blog.csdn.net/qq_16293649/article/details/78601569?biz_id=102&utm_term=flask%E9%83%A8%E7%BD%B2%E5%88%B0%E6%9C%8D%E5%8A%A1%E5%99%A8&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-78601569&spm=1018.2118.3001.4449

详细教程:

https://www.cnblogs.com/Ray-liang/p/4173923.html

阿里云部署 Flask + uWSGI + Nginx 我用这篇成功了http

https://www.cnblogs.com/li-li/p/10390364.html

基于gunicorn部署flask项目:

https://www.cnblogs.com/Ray-liang/p/4837850.html

(一)安装 Python 环境

Ubuntu pip版本的安装,卸载,查看,更新

https://blog.csdn.net/weixin_30426065/article/details/95884704

pip版本的安装:

sudo apt-get install python3-pip

pip版本的查看:

pip3 --version

pip3 -V

pip更新:

sudo pip3 install --upgrade pip

pip卸载:

sudo apt-get remove python3-pip

image-20220414103705009

让python默认显示python3.6,之前是2.7

https://blog.csdn.net/a3335581/article/details/106808188

sudo ln -s /usr/bin/python3.6 /usr/bin/python

(二)Virtualenv

不同的项目可能会引用各种不同的依赖包,为了避免版本与和应用之间的冲突而造成的“依赖地狱”

[Virtualenv | https://virtualenv.readthedocs.org/en/latest/] 就是我们python 项目的必须品了。VirtualEnv 可以为每个Python应用创建独立的开发环境,使他们互不影响,Virtualenv 能够做到:

  • 在没有权限的情况下安装新套件
  • 不同应用可以使用不同的套件版本
  • 套件升级不影响其他应用

安装:sudo pip install virtualenv

ubuntu怎么传送到文件夹

https://jingyan.baidu.com/article/6c67b1d6533f772787bb1eeb.html

然后你要切换到盘根目录,那么输入:【cd /】回车键即可,@之后变为了【/】说明为根目录了的。cd就是切换目录的名称。【/】不单单是一个符号,还是代表根目录。此外还有【~】代表家目录,【.】当前目录,【..】代表上级目录。这些特殊的符号代表的意思要记住的。

cd /home/huang/myflask

在该目录下:

virtualenv venv

在项目目录下就会建立一个新的 venv 目录,里面就是运行python 的基本环境的工具与指令,和包。 然后启用该环境,使用当前命令行状态进入虚拟环境,进入虚拟环境后,一切安装python的操作都会将包和引用装在虚拟环境内,而不会影响到全局的python 环境。

source venv/bin/activate

输入deactivate,退出

(三)安装 uWSGI或者gunicorn

Flask 的实际生产运行环境选择并不多,比较成熟的是 [Gunicorn|http://gunicorn.org/] 和 [uWSGI|https://github.com/unbit/uwsgi] .二者选其一即可。

1、安装gunicorn

cd /home/huang/myflask 进入到flask文件夹

virtualenv venv 创建新的venv

source venv/bin/activate 必须进入venv才能下一步

(deactivate,退出虚拟环境,最后使用)

//安装gunicorn及相关配置

pip3 install gunicorn
pip3 install greenlet # 使用异步必须安装
pip3 install eventlet # 使用eventlet workers
pip3 install gevent   # 使用gevent workers

2、安装uwsgi

(venv)my_flask root$ pip install uwsgi

pip3 install uwsgi

在虚拟环境下不需要使用 sudo ,因为virtualenv 是没有权限要求的。

这个安装很迅速,基本是秒成。安装完成后我们可以先放下 uWSGI 不表,在后面再回过来配置他,因为我们首先要将关键的 Flask环境和我们的项目文件传到服务器目录内。

(四)安装 Flask依赖

本地运行flask项目时,我们通常已经在自己的venv或者conda环境中安装了相关的依赖,但是服务器端并没有安装,所以要想在服务器段运行项目也需要安装依赖。当然不可能手动的一个个安装依赖,可以通过清单文件一次性安装Flask和他的相关依赖的,这样会更快。

怎么生成txt参考,python项目生成依赖包清单requirements .txt文件:

https://blog.csdn.net/xc_zhou/article/details/84794455

(参考这篇文章,里面介绍了本地flask生成依赖包清单requirements .txt文件的方法。因为我写python项目时都是习惯新建一个venv,所以conda环境我也没试过,如果使用的conda环境,可以尝试下文章介绍的方法或者查阅其他资料)

1、电脑本地,需要导出依赖清单:

(1)这里需要使用到的工具叫pipreqs,先安装:

pip install pipreqs

(2)装好之后cmd到项目路径下:pycharm下直接open in terminal即可,

输入pipreqs ./

或者 pipreqs ./ --encoding=utf-8

(3)当项目里存在requirements .txt文件时,执行会提示一下警告,use --force to overwrite it,

执行pipreqs ./ --encoding=utf-8 --force即可。

生成依赖清单之后,可以使用xftp上传至服务器的flask文件夹下。

image-20220414110743056 image-20220414104210668

2、服务器端安装清单文件的指令

需要到服务器的项目venv环境下运行如下指令:

(venv)my_flask root$ pip install -r requirements.txt

或者pip3 install -r requirements.txt

在此还是重重地提一下:一定要注意在运行这个安装之前启用了python 虚拟环境,否则会直接安装到全局去的!

成功:

image-20220414104245189

3、如果修改了flask代码,需要重新部署

如果修改了flask项目的代码,那么服务器要运行新的flask时,需要先关掉已启动的进程,因为它占用了端口。

先运行python maage.py编译下代码,成功的话再启动uwsgi或者gunicorn把它部署。

(五)使用uwsgi或者gunicorn运行Flask项目

准备一个简单的flask项目

准备好一个只有一个接口的flask项目,这个项目基本不需要安装依赖,如果能运行说明gunicorn或者uswgi没有问题。接下来再用自己的项目做测试,安装好清单依赖,再使用gunicorn运行项目。该flask项目运行成功后,在网页输入api的url后,可以看到hello world

https://blog.csdn.net/airangrong6572/article/details/101273230

我准备的是一个hello.py的flask项目。

from flask import Flask
app = Flask(__name__)
 
@app.route("/")
def hello():
    return "Hello World!"

1、使用gunicorn

https://www.cnblogs.com/Ray-liang/p/4837850.html

(可以借鉴这篇文章,gunicorn的部署比uwsgi简单很多,如果不配置nginx和supervisor ,就更加简单了,这个对于小项目不是必须的。不管是gunicorn还是uwsgi,运行项目的命令都很简单。)

gunicorn相比uwsgi的优势在于可以不用写ini配置文件,仅使用命令行就可以让项目在指定端口运行。

//使用gunicorn指令直接运行flask项目,例如6008为此flask开放的端口,需要服务器开放该端口。manage:app为flask项目的启动文件。其他参数一致即可 -D表示后台运行

cd /home/huang/myflask   进入到flask项目文件中
source venv/bin/activate   必须进入venv才能下一步
deactivate   最后运行完成后,退出虚拟环境
gunicorn -w 4 -b 127.0.0.1:5503 hello:app  在5503端口运行flask项目,启用4个线程,hello为flask项目名
gunicorn -w 4 -b 127.0.0.1:5503 hello:app -D   让项目后台运行


//查看gunicorn运行的flask项目
ps aux | grep gunicorn  查看gunicorn的进程状态
ps -ef | grep gunicorn  查看gunicorn的进程状态
kill -9 进程id  杀掉flask进程

lsof -i :5503  查看某端口的运行进程情况
kill -9 $(lsof -i tcp:5503 -t)   root用户杀死占用某端口的所有进程
另外,非root用户可能需要执行:kill -9 $(sudo lsof -i tcp:5503 -t)

image-20220414143353174

运行成功的话,输入url会显示hello world,这样就意味着部署成功:

image-20220414143741857

2、使用uwsgi

(使用uwsgi运行flask项目,通常需要写配置文件,所以相比gunicorn麻烦一些)

步骤1:cd /home/huang/myflask 进入flask项目文件夹

步骤2:启用venv环境,source venv/bin/activate 必须进入venv才能下一步。 最后运行完成后,退出虚拟环境deactivate

步骤3:写配置文件,不同的flask项目需要一个单独的配置文件,比如config_monitor.ini、config_recycle.ini等。以下代码为config.ini的内容,用于启动示例flask项目。注意配置好端口,不要和其他项目冲突。

[uwsgi]
# uwsgi 启动时所使用的地址与端口
http-socket = 0.0.0.0:5000

# 指向网站目录
chdir = /home/huang/myflask/

# python 启动程序文件
wsgi-file = hello.py

# python 程序内用以启动的 application 变量名
callable = app

# 处理器数
processes = 4

# 线程数
threads = 1

# 状态检测地址
stats = 0.0.0.0:5001

步骤4:使用命令uwsgi config.ini即可运行flask项目。

image-20220414144800850

步骤5:uwsgi后台运行的方法。uwsgi -d --ini config.ini

加上 -d 就达到目的了。

步骤6:查看后台运行的uwsgi进程。ps -ef|grep uwsgi

步骤7:杀掉后台进程,kill -9 进程id

lsof -i :5503  查看某端口的运行进程情况
kill -9 $(lsof -i tcp:5503 -t)   root用户杀死占用某端口的所有进程
另外,非root用户可能需要执行:kill -9 $(sudo lsof -i tcp:5503 -t)

如果能跑起helloworld,那说明部署是没有问题的。接下来要部署复杂的项目,首先依赖要下全,很多时候报错都是各种依赖的问题。

uwsgi如果能成功启动ip加端口进行访问,那么实际上的配置就成功了。接下去就是反向代理的事情。

image-20220414144301233

(六)杀掉进程

lsof -i :5503 查看某端口的运行进程情况

kill -9 $(lsof -i tcp:5503 -t) root用户杀死占用某端口的所有进程。

另外,非root用户可能需要执行:kill -9 $(sudo lsof -i tcp:5503 -t)

image-20220414112348464

posted @   Mystogan  阅读(5281)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示