Flask項目部署

我使用的python3

準備工作

自行google安裝以下軟件:

  • python3 pip3 virtualenv
  • nginx
  • 數據庫

遠程復制項目文件到服務器

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

pip3 isntall 依賴包

我使用的是python3,所以可以直接使用python3 -m venv創建虛擬環境,用來安裝依賴包

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

激活虛擬環境:

source venv/bin/activate

然后根據requirements.txt文件安裝依賴包:

pip3 install -r requirements.txt

pip3 install gunicorn

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

WSGI就是這樣的一個協議:它是一個Python程序和用戶請求之間的接口。WSGI服務器的作用就是接受并分析用戶的請求,調用相應的python對象完成對請求的處理,然后返回相應的結果。

簡單來說gunicorn封裝了HTTP的底層實現,我們通過gunicorn啟動服務,用戶請求與服務相應都經過gunicorn傳輸。
在上步激活的python環境中:

pip3 install gunicorn

創建一個wsgi.py文件

from app import create_app

application = create_app('production')

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

不再通過manage.py啟動服務,那只在開發的時候使用

啟動服務:

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

記住端口號這時候設置的端口號(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;
        }
}
  • 監聽http默認的端口號80
  • server_name:個人網站域名
  • 把請求代理到本機的8000端口(gunicorn啟動服務指定的端口)
    剩下proxy_set_header照抄

gunicorn和nginx關系:

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

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

Systemd

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

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

里邊內容如下:

[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]里的內容:

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

我們現在可以啟動創建的Gunicorn服務,并啟用它,以便它在系統啟動時啟動:

sudo systemctl start flasky

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

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

遇到的問題

安裝虛擬環境:

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容