雖然標題寫的是 Flask,可是下面這個教程不單單隻適用於 Flask, 還適用於其餘Python web 框架,記得幫忙點贊!python
衆所周知 Flask 是一個同步的框架,處理請求的時候是以單進程的方式,當同時訪問的人數過多時,Flask 服務就會出現阻塞的狀況。nginx
就像咱們買火車票同樣,當買火車票的人多的時候,排隊的人就會不少,隊伍就會很長,相應的等待的時間會變得很長!web
所以 Flask, Django,webpy 等框架自帶的 web server 性能都不好,只能用來作測試用途,線上發佈則須要選擇更高性能的 wsgi server 。這裏推薦的部署方式:nginx + gunicorn + flask + supervisorflask
其中每一個服務表明的含義以下:緩存
Nginx:高性能 Web 服務器+負載均衡;bash
gunicorn:高性能 WSGI 服務器;服務器
gevent:把 Python 同步代碼變成異步協程的庫;併發
Supervisor:監控服務進程的工具;app
這裏有張圖,能讓你有個更直觀的感覺echarts
Gunicorn 能夠指定多個工做進程,有多種工做模式能夠供你選擇。默認是同步的 sync 工做模式,除此以外還有 gevent, tronado, gthread, gaiohttp 等。
這裏推薦 gevent, gevent 是一個基於 Greenlet 庫,利用 python 協程來實現,這樣你的 web 服務才能實現併發的功能!
以前有寫過關於 gunicorn 的一篇文章,詳細使用指南點擊查看!
Nginx 實際上只能處理靜態資源請求,那麼對於動態請求怎麼作呢。這就須要用到 Nginx 的 upstream
模塊對這些請求進行轉發,即反向代理。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 配置文件位於 /usr/local/nginx/conf/nginx.conf
server {
listen 8080; # 監聽8080端口,能夠自行配置
server_name localhost; # 配置域名
# 動態請求轉發到 9600 端口(gunicorn):
location / {
proxy_pass http://127.0.0.1:9600;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 300;
proxy_send_timeout 300;
}
}
複製代碼
修改完以後保存,重啓 nginx.
命令以下:
pip install supervisor
複製代碼
初始化配置文件:
echo_supervisord_conf > supervisor.conf
複製代碼
修改配置文件,在配置文件最底部添加相應配置
[include] 本身的項目配置
[program:project]
directory = /home/jerry/Code/project ; 程序的啓動目錄
command = /home/jerry/.virtualenvs/parsing/bin/gunicorn -w 4 -worker-class gevent -bind 0.0.0.0:9600 app:app ; 啓動命令
numprocs=1 ; number of processes copies to start (def 1)
autostart = true ; 在 supervisord 啓動的時候也自動啓動
startsecs = 1 ; 啓動 1 秒後沒有異常退出,就看成已經正常啓動了
autorestart = true ; 程序異常退出後自動重啓
startretries = 3 ; 啓動失敗自動重試次數,默認是 3
user = root ; 用哪一個用戶啓動
redirect_stderr = true ; 把 stderr 重定向到 stdout,默認 false
stdout_logfile_maxbytes = 20MB ; stdout 日誌文件大小,默認 50MB
stdout_logfile_backups = 10 ; stdout 日誌文件備份數
stdout_logfile=/home/jerry/Code/project/log/gunicorn.log ; log 日誌
stderr_logfile=/home/jerry/Code/project/log/gunicorn.error ; 錯誤日誌
複製代碼
編輯完以後保存,啓動 supervisor。這裏的啓動命令和在命令行用 gunicorn 啓動的命令是一致的,其中 -w 是指服務的進程數,詳細命令查看我以前寫的那篇文章哈。
經過配置文件啓動 supervisor
supervisord -c supervisor.conf
複製代碼
查看 supervisor 的狀態
supervisorctl -c supervisor.conf status
複製代碼
從新載入配置文件,每次修改以後記得從新載入
supervisorctl -c supervisor.conf reload
複製代碼
啓動指定/全部 supervisor 管理的程序進程
supervisorctl -c supervisor.conf start [all]|[appname]
複製代碼
關閉指定/全部 supervisor管理的程序進程
supervisorctl -c supervisor.conf stop [all]|[appname]
複製代碼
這時候經過 http://127.0.0.1:8080 就能訪問你的應用了! 想知道效果如何,能夠本身測試一下,好比在代碼中增長 sleep,或者本身動手寫個腳本測試!
利用 Flask 動態展現 Pyecharts 圖表數據的幾種方法