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

  • flask   python 的服務器框架
  • gunicorn   webservice,WSGI 的容器
  • supervisor   進程管理工具
  • nginx   一個高性能的 web 服務器

建立項目

mkdir server
複製代碼

先爲應用建立一個路徑css

構建 Python 的虛擬環境

咱們使用 virtualenv 來構建一個系統中不一樣的 python 隔離環境, virtualenv 的使用十分的簡單,安裝使用方法能夠看這裏virtualenvhtml

cd server // cd 切換到咱們的項目目錄
virtualenv venv // 構建咱們的虛擬環境
複製代碼

建立了 venv 環境後,咱們須要激活才能使用(有時是自動激活),激活後能夠看見控制檯前面有 (venv)python

source venv/bin/activate
複製代碼

關閉環境直接使用 deactivatenginx

deactivate
複製代碼

安裝 flask 框架

安裝的虛擬環境裏面已經自動安裝了 pip,咱們使用 pip 能夠很簡單快捷的安裝 flaskgit

pip install flask
複製代碼

flask 已經安裝好了,咱們能夠經過一個小應用來測試一下咱們的flask 框架, 'vim myapp.py' 建立一個 python 文件github

from flask import Flask
app = Flask(__name__)

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

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

啓動腳本web

python myapp.py
複製代碼

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

使用 gunicorn 部署 python web

剛纔打開的是 flask 自帶的服務器,完成了 web 服務的啓動。可是 flask 自帶的服務器通常是用來調試使用的,性能不佳。這裏咱們使用 gunicorn 做爲 wsgi 的容器,用來部署 python。flask

安裝 gunicorn
pip install gunicorn
複製代碼

pip 是 python 的管理包工具。隨着項目增加,你會發現它的依賴列表也一併隨着增加。在你能運行一個Flask應用以前,即便已經須要數以十記的依賴包也絕不奇怪。 管理依賴的最簡單的方法就是使用一個簡單的文本文件。 pip能夠生成一個文本文件,列出全部已經安裝的包。它也能夠解析這個文件,並在新的系統(或者新的環境)下安裝每個包。vim

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

###參考:

相關文章
相關標籤/搜索