后端部署筆記nginx+gunicorn+supervisor+flask
flask 是一個python的微觀web框架洛巢。簡潔高效,使用簡單次兆。
-
生產(chǎn)環(huán)境下稿茉,flask自帶的服務(wù)器,無法滿足性能要求芥炭。Gunicorn是一個開源python WSGI UNIX的HTTP 服務(wù)器漓库。配置簡單,高性能园蝠。
Note:
? WSGI協(xié)議
? Web框架致力于如何生成HTML代碼渺蒿,而Web服務(wù)器用于處理和響應(yīng)HTTP請求。Web框架和Web服 務(wù)器之間的通信彪薛,需要一套雙方都遵守的接口協(xié)議茂装。WSGI協(xié)議就是用來統(tǒng)一這兩者的接口的。
? flask就是一種優(yōu)秀的Web框架善延,gunicorn就是web服務(wù)器少态。兩者配合組成了web后端服務(wù)。
-
supervisor 是一個用python寫的進程管理工具易遣,可以很方便的用來啟動彼妻、重啟、關(guān)閉進程(不僅僅是python進程)训挡。除了對單個進程控制澳骤,還可以同時啟動、關(guān)閉多個進程澜薄,比如很不幸的服務(wù)器出問題導(dǎo)致所有應(yīng)用程序都被殺死为肮,此時可以用supervisor同時啟動所有應(yīng)用程序而不是一個一個地敲命令啟動。
想要結(jié)束gunicorn只需要執(zhí)行pkill gunicorn肤京,有時候還要ps -ef找到pid進程號才能kill颊艳。過于繁瑣。因此使用supervisor可以更加方便的管理wsgi容器gunicorn忘分。
nginx是專業(yè)的服務(wù)器棋枕,可以做負(fù)載均衡,攔截靜態(tài)請求妒峦,訪問控制重斑,限速,限制連接數(shù)肯骇,反向代理窥浪,抗并發(fā)。
下面進入配置環(huán)節(jié)
安裝python環(huán)境笛丙,創(chuàng)建flask的虛擬環(huán)境與安裝supervisor的python2環(huán)境
將flask代碼放置在合適的位置
-
在flask的虛擬環(huán)境中安裝gunicorn
pip install gunicorn
-
gunicorn 啟動flask可以使用如下命令:
gunicron -w 4 -b 127.0.0.1:8000 -k gevent myapp:app
? -w 表示開啟多少個worker
? -b 表示gunicorn開放的訪問地址
? -k gevent 表示以異步的方式啟動
? myapp表示flask項目中app文件的文件名
? 我們不直接使用gunicorn啟動漾脂,使用supervisor管理gunicorn
- 切換到python2環(huán)境 ( supervisor不支持python3 )
pip install supervisor
// 找到合適的放配置文件的目錄 如/etc/supervisor/下
echo_supervisord_conf > supervisor.conf # 生成supervisor默認(rèn)配置文件
makedir conf.d # 創(chuàng)建存放app conf文件的目錄
vim supevisor.conf
未避免產(chǎn)生非root用戶的權(quán)限錯誤,將supervisord.conf內(nèi)[unix_http_server] 這項改為(;是注釋):
[unix_http_server]
file=/tmp/supervisor.sock ; (the path to the socket file)
chmod=0766 ; socket file mode (default 0700)
;chown=nobody:nogroup ; socket file uid:gid owner
;username=user ; (default is no username (open server))
;password=123 ; (default is no password (open server))
cp supervisord_conf conf.d/ # app 的conf 文件可以從默認(rèn)配置文件上更改
vim supervisor.conf # 再次修改配置文件
再將末尾的[include]部分改為:
[include]
files = /etc/supervisor/*.conf
files = /etc/supervisor/conf.d/*.conf
這樣方便為每個app單獨設(shè)置conf文件而不必全部寫在全局設(shè)置里面胚鸯。
在conf.d下將剛才復(fù)制過來的配置文件重命名為你app的名字
mv supervisor.conf myapp.conf
vim myapp.conf
在文件末尾添加如下配置
[program:gunicorn]
command=/home/dlf/anaconda3/envs/pdns/bin/gunicorn -w 4 -b 127.0.0.1:3000 -k gevent app:app ; supervisor啟動命令
directory=/home/dlf/project/pdns_api ; 項目的文件夾路徑
startsecs=5 ; 啟動時間
stopwaitsecs=0 ; 終止等待時間
autostart=false ; 是否自動啟動
autorestart=true ; 是否自動重啟
startretries = 3 ; 啟動失敗自動重試次數(shù)
stopasgroup=true ; send stop signal to the UNIX process
killasgroup=true ; SIGKILL the UNIX process group (def false)
stdout_logfile=/home/dlf/apps/var/www/server/log/gunicorn.log ; log 日志
stderr_logfile=/home/dlf/apps/var/www/server/log/gunicorn.err
進行啟動操作:
在創(chuàng)建的python2虛擬環(huán)境下
通過配置文件啟動supervisor
supervisord -c supervisor.conf查看supervisor的狀態(tài)
supervisorctl -c supervisor.conf status修改配置文件后骨稿,重新載入配置文件
supervisorctl -c supervisor.conf reload啟動指定/所有 supervisor管理的程序進程
supervisorctl -c supervisor.conf start [all]|[appname]關(guān)閉指定/所有 supervisor管理的程序進程
supervisorctl -c supervisor.conf stop [all]|[appname]
其中appname就是上述配置中program:后面的字段 如gunicorn
-
我們啟動的服務(wù)綁定的是內(nèi)網(wǎng)地址,用nginx 做反向代理姜钳,同時增加整個后端的并發(fā)能力
-
安裝nginx(不在python虛擬環(huán)境下)
sudo apt-get install nginx
-
編輯配置文件 /etc/nginx/conf.d/gunicorn.conf
server { listen 8000; server_name example.org; # 這是HOST機器的外部域名坦冠,用地址也行 location / { proxy_pass http://127.0.0.1:30000; # 這里是指向 gunicorn host 的服務(wù)地址 proxy_read_timeout 300; # nginx會等待多長時間來獲得請求的響應(yīng) proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
-
nginx 啟動測試
測試配置的是否正確
sudo service nginx -t重啟nginx服務(wù)
sudo service nginx restart如果有正在運行的nginx服務(wù),可以使用平滑重啟
sudo service nginx reload
-
refer: 搜了很多資料哥桥,沒有保存搜索時的鏈接蓝牲。如侵權(quán),請聯(lián)系我泰讽,進行刪除例衍。