Flask項目部署

我使用的python3

準備工作

自行g(shù)oogle安裝以下軟件:

  • python3 pip3 virtualenv
  • nginx
  • 數(shù)據(jù)庫

遠程復(fù)制項目文件到服務(wù)器

參考上篇ubuntu創(chuàng)建git服務(wù)器與使用hooks實現(xiàn)web自動部署
直接使用git push之后,代碼自動被checkout到指定的目錄。從而實現(xiàn)遠程復(fù)制。以后改動也會被自動checkout,相比遠程復(fù)制命令scp要方便許多
我使用的是/srv/nginx/目錄,git push之后代碼被自動checkout到/srv/nginx/目錄

pip3 isntall 依賴包

我使用的是python3,所以可以直接使用python3 -m venv創(chuàng)建虛擬環(huán)境,用來安裝依賴包

cd /srv/nginx/
mkdir venv
python3 -m venv venv

激活虛擬環(huán)境:

source venv/bin/activate

然后根據(jù)requirements.txt文件安裝依賴包:

pip3 install -r requirements.txt

pip3 install gunicorn

Gunicorn (獨角獸)是一個高效的Python WSGI Server,通常用它來運行 wsgi application(由我們自己編寫遵循WSGI application的編寫規(guī)范) 或者 wsgi framework(如Django,Paster),地位相當于Java中的Tomcat。

WSGI就是這樣的一個協(xié)議:它是一個Python程序和用戶請求之間的接口。WSGI服務(wù)器的作用就是接受并分析用戶的請求,調(diào)用相應(yīng)的python對象完成對請求的處理,然后返回相應(yīng)的結(jié)果。

簡單來說gunicorn封裝了HTTP的底層實現(xiàn),我們通過gunicorn啟動服務(wù),用戶請求與服務(wù)相應(yīng)都經(jīng)過gunicorn傳輸。
在上步激活的python環(huán)境中:

pip3 install gunicorn

創(chuàng)建一個wsgi.py文件

from app import create_app

application = create_app('production')

if __name__ == '__main__':
    application.run()

不再通過manage.py啟動服務(wù),那只在開發(fā)的時候使用

啟動服務(wù):

gunicorn -w 4 -b 127.0.0.1:8000 wsgi:application

記住端口號這時候設(shè)置的端口號(8000),下步配置nginx的時候要用到。

nginx

nginx的配置文件為:/etc/nginx/sites-available/default
添加如下配置:

server {
        listen 80;
        server_name bi123.wang;

        location / {
                proxy_pass http://127.0.0.1:8000;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}
  • 監(jiān)聽http默認的端口號80
  • server_name:個人網(wǎng)站域名
  • 把請求代理到本機的8000端口(gunicorn啟動服務(wù)指定的端口)
    剩下proxy_set_header照抄

gunicorn和nginx關(guān)系:

gunicorn 可以單獨提供服務(wù),但生產(chǎn)環(huán)境一般不這樣做。首先靜態(tài)資源(jscssimg)會占用不少的請求資源,而對于 gunicorn 來講它本身更應(yīng)該關(guān)注實際業(yè)務(wù)的請求與處理而不應(yīng)該把資源浪費在靜態(tài)資源請求上;此外,單獨運行 gunicorn 是沒有辦法起多個進程多個端口來負載均衡的。
nginx 的作用就是彌補以上問題,首先作為前端服務(wù)器它可以處理一切靜態(tài)文件請求,此時 gunicorn 作為后端服務(wù)器,nginx 將會把動態(tài)請求轉(zhuǎn)發(fā)給后端服務(wù)器,因此我們可以起多個 gunicorn 進程,然后讓 nginx 作均衡負載轉(zhuǎn)發(fā)請求給多個 gunicorn 進程從而提升服務(wù)器處理效率與處理能力。最后,nginx 還可以配置很多安全相關(guān)、認證相關(guān)等很多處理,可以讓你的網(wǎng)站更專注業(yè)務(wù)的編寫,把一些轉(zhuǎn)發(fā)規(guī)則等其它業(yè)務(wù)無關(guān)的事情交給 nginx 做。

配置好后打開本地瀏覽器,輸入域名,應(yīng)該就能訪問了。

Systemd

還差一點就是我們想讓服務(wù)器啟動之后就自動啟動網(wǎng)站服務(wù)。而不是需要每次都手動啟動服務(wù)。
我的vps的系統(tǒng)是16.04,Systemd替換upstart成為當前系統(tǒng)版本的啟動守護進程。
創(chuàng)建systemd文件:

sudo nano /etc/systemd/system/flasky.service

里邊內(nèi)容如下:

[Unit]
Description=Gunicorn instance to serve Flasky
After=network.target

[Service]
User=root
Group=root
WorkingDirectory=/srv/nginx
Environment="PATH=/srv/nginx/venv/bin"
ExecStart=/srv/nginx/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 wsgi:application

[Install]
WantedBy=multi-user.target

主要是[Service]里的內(nèi)容:

  • User Group所屬用戶和群組
  • WorkingDirectory 指向服務(wù)器目錄
  • Environment 用到的python虛擬環(huán)境目錄
  • ExecStart gunicorn啟動服務(wù)命令

我們現(xiàn)在可以啟動創(chuàng)建的Gunicorn服務(wù),并啟用它,以便它在系統(tǒng)啟動時啟動:

sudo systemctl start flasky

sudo systemctl enable flasky
// 當發(fā)布新版代碼之后重啟服務(wù),重新運行項目,加載最新代碼
sudo systemctl restart flasky

然后。。。。。。重啟vps,等幾分鐘再請求試試。是不是請求依然成功了!
打完收工

遇到的問題

安裝虛擬環(huán)境:

python3 -m venv venv

報錯:

Error: Command '['/home/dpottsagilisys/test/bin/python3', '-Im', 'ensurepip', 
'--upgrade', '--default-pip']' returned non-zero exit status 1.

解決辦法:

python3.6 -m venv --without-pip test
source test/bin/activate
curl https://bootstrap.pypa.io/get-pip.py | python
deactivate
source test/bin/activate

參考

Flask Part 1: Setting up Flask linux

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容