假定你也有這樣的需求,用pipenv創(chuàng)建一個虛擬環(huán)境,然后在虛擬環(huán)境中創(chuàng)建你的flask項目,并安裝了你所需要的各種依賴之后骚秦,當你完成了你的項目她倘,想把項目部署到遠程的服務(wù)器上去運行,接下來希望這套部署教程對你有所幫助作箍。
假定你已經(jīng)有了一個linux的系統(tǒng)帝牡,下面將逐個介紹這些組件的安裝。
一蒙揣,安裝Python3.6
首先查看一下你的系統(tǒng)已經(jīng)安裝的Python版本靶溜,調(diào)出終端(ctrl+alt+t)然后輸入Python -V和Python3 -V查看一下已有的Python版本,因為我的ubuntu是比較新的18.04.2LTS已經(jīng)安裝的版本為:
可以看到我的系統(tǒng)已經(jīng)安裝了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 如果能看到版本信息就證明已經(jīng)安裝成功了个扰,如果是找不到pipenv的瓷炮,你需要添加當前 Python 用戶主目錄的 bin 目錄到 PATH 環(huán)境變量。如果你不知道 Python 用戶主目錄在哪里递宅,用下面的命令來查看:
python3 -m site --user-base娘香,我通常是在家目錄下的.profile文件中加入
PYTHON_BIN_PATH="(python3 -m site --user-base)/bin"
PATH="PYTHON_BIN_PATH"
三,使用pipenv創(chuàng)建虛擬環(huán)境
在你的家目錄上創(chuàng)建一個test文件夾然后在cd 到test里運行pipenv install將會在test目錄下創(chuàng)建一個虛擬環(huán)境办龄,接下來就可以安裝項目需要的一些包了烘绽,比如flask,gunicorn
接下來我們再test目錄下建一個app.py的python文件,在里面寫上
保存后俐填,現(xiàn)在已經(jīng)可以使用Python3 app.py運行這個應(yīng)用安接,并可以在瀏覽器訪問http://127.0.0.1:5000/和http://127.0.0.1:5000/data看到了運行結(jié)果
然而我們在生產(chǎn)環(huán)境并不能用flask自帶的應(yīng)用服務(wù)器,flask自帶的應(yīng)用服務(wù)器只是給我們平時開發(fā)使用的英融,在生產(chǎn)環(huán)境中我們應(yīng)該用一些實現(xiàn)了wsgi(web server gateway interface)接口規(guī)范的容器盏檐,比如說gunicorn,uWSGI,FastCGI等等。在這里我們用的是gunicorn,我們在創(chuàng)建虛擬環(huán)境的時候已經(jīng)安裝好了gunicorn驶悟,現(xiàn)在通過pipenv shell進入到虛擬環(huán)境中胡野,然后執(zhí)行g(shù)unicorn app:app -b 127.0.0.1:5000 -w 2就可以手動啟動app服務(wù)了,在瀏覽器中訪問http://127.0.0.1:5000/會得到和上面一樣的效果
解釋一下gunicorn這條命令痕鳍,前面的app是app.py這個文件名后面的app是在app.py里面定義的一個app實例硫豆,參數(shù)-b是監(jiān)聽的ip地址和端口號,-w是工作進程數(shù)额获,這里我們可以看到開了2個工作進程够庙。
四恭应,安裝nginx
nginx是一個輕量級抄邀、性能強、占用資源少昼榛,能很好的處理高并發(fā)的反向代理的web服務(wù)器境肾,經(jīng)常也會用在生產(chǎn)環(huán)境中剔难。
現(xiàn)在我們先安裝它:
sudo apt install -y nginx
啟動nginx:
sudo /etc/init.d/nginx start
接下來還需要對nginx做一些配置:
刪除原來的默認文件:sudo rm /etc/nginx/sites-enabled/default
在sites-available目錄下創(chuàng)建一個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中做一下配置:
這樣做的目的是當訪問/ 的HTTP請求將被“反向代理”到127.0.0.1上的5000端口(或“l(fā)ocalhost”)。這與gunicorn將使用的IP和端口相同奥喻。這時偶宫,請求就會被flask應(yīng)用程序處理,并做出響應(yīng)环鲤。在這里纯趋,我們希望nginx直接提供來自“/ home / sd / test / static /”目錄的靜態(tài)文件,而不是通過gunicorn / WSGI路由請求冷离。這將加速我們網(wǎng)站的加載時間吵冒,因為nginx知道直接服務(wù)該目錄。
配置好后西剥,通過nginx -s reload重新加載配置文件痹栖。
五,安裝supervisor
sudo apt install -y supervisor
supervisor安裝完成后會生成三個可執(zhí)行程序:supervisortd、supervisorctl瞭空、echo_supervisord_conf揪阿,分別是supervisor的守護進程服務(wù)(用于接收進程管理命令)-->相當于服務(wù)端程序,客戶端(用于和守護進程通信咆畏,發(fā)送管理進程的指令)-->相當于客戶端程序南捂,生成初始配置文件程序。
接下來我們就要對supervisor做一些配置旧找,首先通過echo_supervisord_conf > /ect/supervisor/supervisord.conf生成一個初始的配置文件黑毅。
運行supervisord服務(wù)的時候,需要指定一個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的配置參數(shù)較多矿瘦,下面介紹一下常用的參數(shù)配置,詳細的配置及說明愿卒,請參考官方文檔介紹缚去。
注:分號(;)開頭的配置表示注釋
[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服務(wù)器,提供web管理界面
;port=127.0.0.1:9001 ;Web管理后臺運行的IP和端口柜候,如果開放到公網(wǎng)搞动,需要注意安全性
;username=user ;登錄管理后臺的用戶名
;password=123 ;登錄管理后臺的密碼
[supervisord]
logfile=/tmp/supervisord.log ;日志文件,默認是 $CWD/supervisord.log
logfile_maxbytes=50MB ;日志文件大小渣刷,超出會rotate鹦肿,默認 50MB,如果設(shè)成0辅柴,表示不限制大小
logfile_backups=10 ;日志文件保留備份數(shù)量默認10箩溃,設(shè)為0表示不備份
loglevel=info ;日志級別瞭吃,默認info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ;pid 文件
nodaemon=false ;是否在前臺啟動涣旨,默認是false歪架,即以 daemon 的方式啟動
minfds=1024 ;可以打開的文件描述符的最小值,默認 1024
minprocs=200 ;可以打開的進程數(shù)的最小值霹陡,默認 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]是被管理的進程配置參數(shù),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 ; 啟動失敗自動重試次數(shù)剔蹋,默認是3
user=tomcat ; 用哪個用戶啟動進程,默認是root
priority=999 ; 進程啟動優(yōu)先級辅髓,默認999泣崩,值小的優(yōu)先啟動
redirect_stderr=true ; 把stderr重定向到stdout,默認false
stdout_logfile_maxbytes=20MB ; stdout 日志文件大小洛口,默認50MB
stdout_logfile_backups = 20 ; stdout 日志文件備份數(shù)矫付,默認是10
; stdout 日志文件,需要注意當指定目錄不存在時無法正常啟動第焰,所以需要手動創(chuàng)建目錄(supervisord 會自動創(chuàng)建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false ;默認為false,進程被殺死時买优,是否向這個進程組發(fā)送stop信號,包括子進程
killasgroup=false ;默認為false挺举,向進程組發(fā)送kill信號杀赢,包括子進程
;包含其它配置文件
[include]
files = relative/directory/*.ini ;可以指定一個或多個以.ini結(jié)束的配置文件
配置信息參考
注意:由于我們是用pipenv虛擬環(huán)境,在配置supervisor的配置文件時還需要注意一些細節(jié)湘纵,在[program:xx]塊中脂崔,有一個command程序啟動命令,這里我們先要使用pipenv --venv找到我們使用的虛擬環(huán)境的路徑梧喷,然后就使用里面的gunicorn啟動砌左,最好是在項目目錄中創(chuàng)建一個gunicorn.conf文件配置gunicorn然后在command中使用/虛擬環(huán)境路徑/bin/gunicorn -c gunicorn.conf app:app
如果想把web管理界面打開,只需在[inet_http_server]塊里的注釋(前面的分號)去掉,然后在命令行里執(zhí)行supervisorctl reload進行重新加載在瀏覽器訪問http://127.0.0.1:9001輸入用戶和密碼就可以了铺敌,這里還有一個建議是每個項目最好有一個自己的配置文件汇歹,然后通過[include]塊中的fiels=/自己定義的目錄/*.ini引入就可以了,注意的是自定義的配置文件要以ini結(jié)尾偿凭。
當然也可以在命令行中查看進程的狀態(tài)产弹,只要通過supervisorctl這個客戶端命令與服務(wù)端supervisord做交互就可以了 ,想看supervisorctl有什么命令可以用supervisorctl -h查看笔喉。
六取视,F(xiàn)abric自動化部署
上面我們都是通過手動一步步安裝硝皂,配置常挚,啟動的作谭,如果有很多項目難道我們也是這樣一個個來配置嗎?我們部署的流程可能是這樣的奄毡,我們先在本地進行編碼折欠,編碼完成之后,在本地測試沒有問題了吼过,把項目推送到github或者svn這些代碼托管平臺锐秦,然后登錄到生產(chǎn)服務(wù)器,從github或者svn上把項目拉取下來盗忱,然后進行nginx配置酱床,虛擬環(huán)境配置,supervisor配置等等趟佃,這些操作都可以在Fabric上完成扇谣,F(xiàn)abric提供了很多好用的接口可以完成任務(wù),好累啊闲昭,不想說了罐寨,貼一個別人的總結(jié)好的Fabric接口
暫時先寫這么多吧, 有什么問題可以一起交流探討序矩。