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="PYTHON_BIN_PATH"

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

ubuntu18.04,python3.6,pipenv,nginx,supervisor,fabric,git,部署flask应用_第1张图片
pipenv.png

接下来我们再test目录下建一个app.py的python文件,在里面写上
ubuntu18.04,python3.6,pipenv,nginx,supervisor,fabric,git,部署flask应用_第2张图片
app.png

保存后,现在已经可以使用Python3 app.py运行这个应用,并可以在浏览器访问http://127.0.0.1:5000/和 http://127.0.0.1:5000/data看到了运行结果
ubuntu18.04,python3.6,pipenv,nginx,supervisor,fabric,git,部署flask应用_第3张图片
5000.png

ubuntu18.04,python3.6,pipenv,nginx,supervisor,fabric,git,部署flask应用_第4张图片
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/会得到和上面一样的效果


ubuntu18.04,python3.6,pipenv,nginx,supervisor,fabric,git,部署flask应用_第5张图片
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中做一下配置:


ubuntu18.04,python3.6,pipenv,nginx,supervisor,fabric,git,部署flask应用_第6张图片
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

ubuntu18.04,python3.6,pipenv,nginx,supervisor,fabric,git,部署flask应用_第7张图片
test_command.png

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


ubuntu18.04,python3.6,pipenv,nginx,supervisor,fabric,git,部署flask应用_第8张图片
web.png

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

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

你可能感兴趣的:(ubuntu18.04,python3.6,pipenv,nginx,supervisor,fabric,git,部署flask应用)