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

  • 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/訪問你的應用了。

參考:

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

推薦閱讀更多精彩內容