Python Web 部署: 使用 flask + gunicorn + supervisor + nginx

SSBun發表於2017-12-13
  • flask   python 的伺服器框架
  • gunicorn   webservice,WSGI 的容器
  • supervisor   程式管理工具
  • nginx   一個高效能的 web 伺服器

建立專案

mkdir server
複製程式碼

先為應用建立一個路徑

構建 Python 的虛擬環境

我們使用 virtualenv 來構建一個系統中不同的 python 隔離環境, virtualenv 的使用十分的簡單,安裝使用方法可以看這裡virtualenv

cd server // cd 切換到我們的專案目錄
virtualenv venv // 構建我們的虛擬環境
複製程式碼

建立了 venv 環境後,我們需要啟用才能使用(有時是自動啟用),啟用後可以看見控制檯前面有 (venv)

source venv/bin/activate
複製程式碼

關閉環境直接使用 deactivate

deactivate
複製程式碼

安裝 flask 框架

安裝的虛擬環境裡面已經自動安裝了 pip,我們使用 pip 可以很簡單快捷的安裝 flask

pip install flask
複製程式碼

flask 已經安裝好了,我們可以通過一個小應用來測試一下我們的flask 框架, 'vim myapp.py' 建立一個 python 檔案

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return 'hello world !'

if __name__ = '__main__':
    app.debug = True
    app.run()
複製程式碼

啟動指令碼

python myapp.py
複製程式碼

此時,使用瀏覽器訪問 http://127.0.0.1:5000 就能看見網頁顯示的 hello world !

使用 gunicorn 部署 python web

剛才開啟的是 flask 自帶的伺服器,完成了 web 服務的啟動。但是 flask 自帶的伺服器一般是用來除錯使用的,效能不佳。這裡我們使用 gunicorn 作為 wsgi 的容器,用來部署 python。

安裝 gunicorn
pip install gunicorn
複製程式碼

pip 是 python 的管理包工具。隨著專案增長,你會發現它的依賴列表也一併隨著增長。在你能執行一個Flask應用之前,即使已經需要數以十記的依賴包也毫不奇怪。 管理依賴的最簡單的方法就是使用一個簡單的文字檔案。 pip可以生成一個文字檔案,列出所有已經安裝的包。它也可以解析這個檔案,並在新的系統(或者新的環境)下安裝每一個包。

pip freeze > requirements.txt # 生成txt 檔案

pip install -r requirements.txt # 別人使用時可以直接安裝所有的包
複製程式碼

以後每次 pip 安裝了新的庫的時候,都需 freeze 一次,保證更新

接下來我們就是用 gunicorn 來啟動 flask

gunicorn -w 4 -b 0.0.0.0:8000 myapp:app
複製程式碼

此時我們使用8000埠進行訪問,-w 表示開啟了多少個 worker, -b 表示訪問地址。myapp 就是 myapp.py 的檔名,mypp.py 相當於一個庫檔案被 gunicorn 呼叫。app 則是 myapp.py 裡建立的 app,這樣 gunicorn 才可以定位 flask 應用。 想結束 gunicorn 可以通過執行 pkill gunicorn,有時還要找到 pid 才能 kill 掉。這樣的操作過於繁瑣,所以我們使用另一個神器 supervisor, 用來專門管理系統的程式。

安裝 supervisor

pip install supervisor
echo_supervisord_conf > supervisor.conf # 生成 supervisor 預設配置檔案
vim supervisor.conf # 修改 supervisor 配置檔案,新增 gunicorn 程式管理
複製程式碼

supervisor.conf 配置檔案底部新增 (注意我的工作路徑是/var/www/server)

[program:myapp]
command=/var/www/server/venv/bin/gunicorn -w4 -b0.0.0.0:2170 myapp:app    ; supervisor啟動命令
directory=/var/www/server                                                ; 專案的資料夾路徑
startsecs=0                                                                             ; 啟動時間
stopwaitsecs=0                                                                          ; 終止等待時間
autostart=false                                                                         ; 是否自動啟動
autorestart=false                                                                       ; 是否自動重啟
stdout_logfile=/var/www/server/log/gunicorn.log                           ; log 日誌
stderr_logfile=var/www/server/log/gunicorn.err  
複製程式碼

其中的 log 目錄是用來記錄日誌的,我們需要先建立一個 log 目錄,否則會碰見未找到目錄的錯誤

mkdir log
複製程式碼

#####supervisor 的基本使用命令

supervisord -c supervisor.conf                             通過配置檔案啟動supervisor
supervisorctl -c supervisor.conf status                    察看supervisor的狀態
supervisorctl -c supervisor.conf reload                    重新載入 配置檔案
supervisorctl -c supervisor.conf start [all]|[appname]     啟動指定/所有 supervisor管理的程式程式
supervisorctl -c supervisor.conf stop [all]|[appname]      關閉指定/所有 supervisor管理的程式程式
複製程式碼

部署 Nginx

nginx 是一個高效能的 HTTP 和 反向代理伺服器,在高併發方面表現非常不錯。

安裝 nginx

sudo apt-get install nginx
複製程式碼

nginx 安裝完後,我們可以通過以下命令控制 nginx 的開啟和關閉

sudo /etc/init.d/nginx restart // 重啟
sudo /etc/init.d/nginx start 開啟
sudo /etc/init.d/nginx stop 關閉
複製程式碼

####配置 nginx

cd /etc/nginx/sites-available/default
cd /etc/nginx/sites-enabled/default
複製程式碼

這是 nginx 的具體應用的配置檔案,便於管理。修改預設的 default 檔案

server {
  #偵聽80埠
    listen 80;
#定義使用www.xx.com訪問
    server_name www.app.com; // 或則是地址(http://118.89.235.150/)
    client_max_body_size 10M;
 
   #設定本虛擬主機的訪問日誌
    access_log logs/app.log main;
 
  #預設請求
    location / {
        #請求轉向本機ip:8888
        proxy_pass http://0.0.0.0:8000;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    #配置靜態檔案轉發
    location ~.*(js|css|png|gif|jpg|mp3|ogg)$ {
        root /home/zhoujianghai/temp/data/app/medias/;
    }
    #配置靜態頁面轉發
    location ~.*(html)$ {
        root /home/zhoujianghai/temp/data/app/app_static_pages/;
    }
}
複製程式碼

重啟你的 nginx 就可以在瀏覽器上通過http://118.89.235.150/訪問你的應用了。

###參考:

相關文章