Nginx+Gunicorn+Flask+Supervisor 部署 Python 服務的詳細教程!

雖然標題寫的是 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

image

Gunicorn

Gunicorn 能夠指定多個工做進程,有多種工做模式能夠供你選擇。默認是同步的 sync 工做模式,除此以外還有 gevent, tronado, gthread, gaiohttp 等。

這裏推薦 gevent, gevent 是一個基於 Greenlet 庫,利用 python 協程來實現,這樣你的 web 服務才能實現併發的功能!

以前有寫過關於 gunicorn 的一篇文章,詳細使用指南點擊查看!

一個高性能的web服務是如何搭建的?

Nginx

Nginx 實際上只能處理靜態資源請求,那麼對於動態請求怎麼作呢。這就須要用到 Nginx 的 upstream 模塊對這些請求進行轉發,即反向代理。Nginx 在這裏主要是用來作負載均衡,同時它能緩存一些動態內容

安裝 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

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.

Supervisor

安裝 supervisor

命令以下:

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,或者本身動手寫個腳本測試!

推薦閱讀

一個高性能的web服務是如何搭建的?

一文讀懂Python web框架和web服務器之間的關係

Flask 藍圖機制及應用

利用 Flask 動態展現 Pyecharts 圖表數據的幾種方法

相關文章
相關標籤/搜索