ubuntu18.04,python3.6,pipenv,nginx,supervisor,fabric,git,部署flask应用

假定你也有这样的需求,用pipenv创建一个虚拟环境,然后在虚拟环境中创建你的flask项目,并安装了你所需要的各种依赖之后,当你完成了你的项目,想把项目部署到远程的服务器上去运行,接下来希望这套部署教程对你有所帮助。

假定你已经有了一个linux的系统,下面将逐个介绍这些组件的安装。
一,安装Python3.6
首先查看一下你的系统已经安装的Python版本,调出终端(ctrl+alt+t)然后输入Python -V和Python3 -V查看一下已有的Python版本,因为我的ubuntu是比较新的18.04.2LTS已经安装的版本为:


python.png

可以看到我的系统已经安装了python3.6了,如果你的是比较低的版本可以通过
sudo add-apt-repository ppa:jonathonf/python-3.6
sudo apt update
sudo apt install python3.6
安装好之后可以做一个软链sudo ln -s path to python3.6 /usr/bin/python3 (最好是备份一下之前的python3软链)
一般安装好Python3.6之后 pip3是会一起安装好的,如果没有安装可以通过sudo apt install python3-pip 最好也做一个pip3的软链

二,安装pipenv
使用pip3来安装pipenv
pip3 install --user pipenv
此时在你的终端上输入pipenv --version 如果能看到版本信息就证明已经安装成功了,如果是找不到pipenv的,你需要添加当前 Python 用户主目录的 bin 目录到 PATH 环境变量。如果你不知道 Python 用户主目录在哪里,用下面的命令来查看:
python3 -m site --user-base,我通常是在家目录下的.profile文件中加入
PYTHON_BIN_PATH="(python3 -m site --user-base)/bin"
PATH="PATH:PYTHON_BIN_PATH"

三,使用pipenv创建虚拟环境
在你的家目录上创建一个test文件夹然后在cd 到test里运行pipenv install将会在test目录下创建一个虚拟环境,接下来就可以安装项目需要的一些包了,比如flask,gunicorn

pipenv.png

接下来我们再test目录下建一个app.py的python文件,在里面写上
app.png

保存后,现在已经可以使用Python3 app.py运行这个应用,并可以在浏览器访问http://127.0.0.1:5000/和http://127.0.0.1:5000/data看到了运行结果
5000.png

data.png

然而我们在生产环境并不能用flask自带的应用服务器,flask自带的应用服务器只是给我们平时开发使用的,在生产环境中我们应该用一些实现了wsgi(web server gateway interface)接口规范的容器,比如说gunicorn,uWSGI,FastCGI等等。在这里我们用的是gunicorn,我们在创建虚拟环境的时候已经安装好了gunicorn,现在通过pipenv shell进入到虚拟环境中,然后执行gunicorn app:app -b 127.0.0.1:5000 -w 2就可以手动启动app服务了,在浏览器中访问http://127.0.0.1:5000/会得到和上面一样的效果


gunicorn.png

解释一下gunicorn这条命令,前面的app是app.py这个文件名后面的app是在app.py里面定义的一个app实例,参数-b是监听的ip地址和端口号,-w是工作进程数,这里我们可以看到开了2个工作进程。

四,安装nginx
nginx是一个轻量级、性能强、占用资源少,能很好的处理高并发的反向代理的web服务器,经常也会用在生产环境中。
现在我们先安装它:
sudo apt install -y nginx
启动nginx:
sudo /etc/init.d/nginx start
接下来还需要对nginx做一些配置:
删除原来的默认文件:sudo rm /etc/nginx/sites-enabled/default
在sites-available目录下创建一个test_nginx文件:sudo touch /etc/nginx/sites-available/test_nginx
为sites-available目录下的test_nginx做一个软链:
sudo ln -s /etc/nginx/sites-available/test_nginx /etc/nginx/sites-enabled/test_nginx
在sites-available下的test_nginx中做一下配置:


nginx1.png

这样做的目的是当访问/ 的HTTP请求将被“反向代理”到127.0.0.1上的5000端口(或“localhost”)。这与gunicorn将使用的IP和端口相同。这时,请求就会被flask应用程序处理,并做出响应。在这里,我们希望nginx直接提供来自“/ home / sd / test / static /”目录的静态文件,而不是通过gunicorn / WSGI路由请求。这将加速我们网站的加载时间,因为nginx知道直接服务该目录。
配置好后,通过nginx -s reload重新加载配置文件。

五,安装supervisor
sudo apt install -y supervisor

supervisor安装完成后会生成三个可执行程序:supervisortd、supervisorctl、echo_supervisord_conf,分别是supervisor的守护进程服务(用于接收进程管理命令)-->相当于服务端程序,客户端(用于和守护进程通信,发送管理进程的指令)-->相当于客户端程序,生成初始配置文件程序。
接下来我们就要对supervisor做一些配置,首先通过echo_supervisord_conf > /ect/supervisor/supervisord.conf生成一个初始的配置文件。
运行supervisord服务的时候,需要指定一个supervisord.conf配置文件,如果不指定的话,默认会在以下这些目录中查找:

当前项目工作目录/supervisord.conf
当前项目工作目录/etc/supervisord.conf
/etc/supervisord.conf
/etc/supervisor/supervisord.conf (since Supervisor 3.3.0)
../etc/supervisord.conf (Relative to the executable)
../supervisord.conf (Relative to the executable)

supervisor的配置参数较多,下面介绍一下常用的参数配置,详细的配置及说明,请参考官方文档介绍。
注:分号(;)开头的配置表示注释

[unix_http_server]
file=/tmp/supervisor.sock ;UNIX socket 文件,supervisorctl 会使用
;chmod=0700 ;socket文件的mode,默认是0700
;chown=nobody:nogroup ;socket文件的owner,格式:uid:gid

;[inet_http_server] ;HTTP服务器,提供web管理界面
;port=127.0.0.1:9001 ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
;username=user ;登录管理后台的用户名
;password=123 ;登录管理后台的密码

[supervisord]
logfile=/tmp/supervisord.log ;日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小
logfile_backups=10 ;日志文件保留备份数量默认10,设为0表示不备份
loglevel=info ;日志级别,默认info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ;pid 文件
nodaemon=false ;是否在前台启动,默认是false,即以 daemon 的方式启动
minfds=1024 ;可以打开的文件描述符的最小值,默认 1024
minprocs=200 ;可以打开的进程数的最小值,默认 200

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord

; [program:xx]是被管理的进程配置参数,xx是进程的名称
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ; 程序启动命令
autostart=true ; 在supervisord启动的时候也自动启动
startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3 ; 启动失败自动重试次数,默认是3
user=tomcat ; 用哪个用户启动进程,默认是root
priority=999 ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程

;包含其它配置文件
[include]
files = relative/directory/*.ini ;可以指定一个或多个以.ini结束的配置文件

配置信息参考
注意:由于我们是用pipenv虚拟环境,在配置supervisor的配置文件时还需要注意一些细节,在[program:xx]块中,有一个command程序启动命令,这里我们先要使用pipenv --venv找到我们使用的虚拟环境的路径,然后就使用里面的gunicorn启动,最好是在项目目录中创建一个gunicorn.conf文件配置gunicorn然后在command中使用/虚拟环境路径/bin/gunicorn -c gunicorn.conf app:app

test_command.png

如果想把web管理界面打开,只需在[inet_http_server]块里的注释(前面的分号)去掉,然后在命令行里执行supervisorctl reload进行重新加载在浏览器访问http://127.0.0.1:9001输入用户和密码就可以了,这里还有一个建议是每个项目最好有一个自己的配置文件,然后通过[include]块中的fiels=/自己定义的目录/*.ini引入就可以了,注意的是自定义的配置文件要以ini结尾。


web.png

当然也可以在命令行中查看进程的状态,只要通过supervisorctl这个客户端命令与服务端supervisord做交互就可以了 ,想看supervisorctl有什么命令可以用supervisorctl -h查看。

六,Fabric自动化部署
上面我们都是通过手动一步步安装,配置,启动的,如果有很多项目难道我们也是这样一个个来配置吗?我们部署的流程可能是这样的,我们先在本地进行编码,编码完成之后,在本地测试没有问题了,把项目推送到github或者svn这些代码托管平台,然后登录到生产服务器,从github或者svn上把项目拉取下来,然后进行nginx配置,虚拟环境配置,supervisor配置等等,这些操作都可以在Fabric上完成,Fabric提供了很多好用的接口可以完成任务,好累啊,不想说了,贴一个别人的总结好的Fabric接口
暂时先写这么多吧, 有什么问题可以一起交流探讨。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容