2020最新nginx+gunicorn+supervisor部署基於flask開發的項目的生產環境的詳細攻略

本攻略基於ubuntu1804的版本,服務器用的華爲雲的服務器,python3(python2已經在2020完全中止維護了,因此轉到python3是必須的)歡迎加個人QQ6398903,或QQ羣討論相關技術php

1、準備項目所須要的模塊

你須要把開發環境下用到的包信息所有導出
`` pip freeze > requirements.txt
而後,把requirements.txt文件上傳服務器

css

2、準備生產環境的python虛擬環境

畢竟生產環境,也可能運行多個python項目,因此須要準備好python的虛擬環境
ubuntu1804默認只有python3哈,安裝虛擬環境須要先安裝venv
``sudo apt install python3-venv
建立一個目錄用於存放虛擬環境


html

mkdir -p /opt/python/
sudo python3 -m venv myprj     #最後是項目的名字
. /opt/python/myprj/bin/activate    #激活虛擬環境, 別忘記了前面的點【.】激活以後命令行前面又虛擬環境的名字,說明成功
pip install --upgrade pip    #先升級一下Pip
pip intall -r requirements.txt   # 一次安裝所有的python模塊

3、安裝gunicorn

gunicorn是基於wsgi(web 服務網關接口)web服務器,與flask是絕配(通常django用uwsgi)java

pip install gevent   #若是你的項目中沒有用到gevent,那麼安裝gunicorn以前,須要安裝一下
pip install gunicorn 
deactivate     #退出虛擬環境

能夠直接使用gunicorn命令來啓動程序,例如
``gunicorn -w 4 -b 127.0.0.1:5000 main:app
【注意】上面的命令,須要在激活虛擬環境的狀況下,到項目目錄中運行,項目啓動文件是main.py 裏面又變量名是app的flask的實例
特別要注意,main.py裏面要有


python

if __name__ == "__main__":
    app.run()

不然,gunicorn啓動項目時,會報錯
下面是經常使用命令說明:
nginx

-c CONFIG, --config=CONFIG
# 設定配置文件。
-b BIND, --bind=BIND
# 設定服務須要綁定的端口。建議使用HOST:PORT
-w WORKERS, --workers=WORKERS
# 設置工做進程數。建議服務器每個核心能夠設置2-4個。
-k MODULE
# 選定異步工做方式使用的模塊。

4、配置gunicorn的配置信息

gunicorn直接使用.py文件做爲配置文件,因此,裏面是支持py語法的web

from gevent import monkey
monkey.patch_all()
import multiprocessing

#debug = True
loglevel = 'debug'
bind = '127.0.0.1:6000' #綁定與Nginx通訊的端口
pidfile = 'log/gunicorn.pid'
accesslog = 'log/access.log'
errorlog = 'log/debug.log'
#daemon = True
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = 'gevent' #默認爲阻塞模式,最好選擇gevent模式

保存到,項目目錄下的conf/guni.confdjango

上面的配置文件中,又兩個註釋的地方,一個注意事項flask

  1. debug=True 很好理解,就是剛上線時,能夠開啓,方便發現錯誤,正式啓用要註銷
  2. daemon=True 意思是以守護進程的形式運行,適合直接輸入gunicorn命令來運行,【注意】但若是您想用supervisor來管理的話,這個要註銷
  3. 須要在項目文件中,創建一個log的文件夾,不然報錯沒法啓動,由於咱們的日誌文件和pid都須要保存在Log目錄中

5、經過配置文件啓動gunicorn以及守護進程啓動

把以前的命令,修改一下,
gunicorn -w 4 -b 127.0.0.1:5000 -c conf/guni.conf main:app 若是conf文件中,又deamon=True,那麼將以守護進程在後臺中運行 或者使用 nohup gunicorn -w 4 -b 127.0.0.1:5000 -c conf/guni.conf main:app
這個時候,就能夠退出python虛擬環境了
``deactivate #退出虛擬環境


ubuntu

6、配置nginx

nginx的安裝、配置、使用,請看我以前教程2020年ubuntu1804安裝nginx最新穩定版1.16詳細教程筆記
接着以前文件接續補充
在/etc/nginx/conf.d/目錄下,新建一個myprj.conf文件,填入下信息

server {
        listen 80;
        root /data/python/myprj;
        server_name xxx.xx.xxx.xxx;
        location / {
            proxy_set_header x-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_pass http://localhost:6000/; # gunicorn綁定的端口號
        }
        # 配置static的靜態文件:
        location ~ ^\/static\/.*$ {
            root /data/python/myprj;
        }
}

在配置nginx最容易出現的問題是,靜態文件的配置,一旦沒有配好,致使圖片,css文件沒法訪問
Nginx路徑location配置中,使用root目錄與alias目錄的區別

  1. alias指定的目錄是準確的,即location匹配訪問的path目錄下的文件直接是在alias目錄下查找的;
location /static/ {
        alias  /var/www/static/;
    }
#注意:alias指定的目錄後面必需要加上"/",即/var/www/static/不能改爲/var/www/static
  1. root指定的目錄是location匹配訪問的path目錄的上一級目錄,這個path目錄必定要是真實存在root指定目錄下的;
location /static/ {
        root  /var/www/;
    }
#注意:location中指定的/static/必須是在root指定的/var/www/目錄中真實存在的。
#二者配置後的訪問效果是同樣的。
  1. 配置習慣
    通常狀況下,在nginx配置中的良好習慣是:
    • 在location / 中配置root目錄
    • 在location /somepath/ 中配置alias虛擬目錄

  2. nginx加載新的配置
nginx -t     #必定要先檢查,看到成功的信息,
nginx -s reload

7、安裝和配置supervisor

supervisor是一個python開發的進程管理工具,不光能夠管理python項目,java項目,php-pfm後臺啓動程序均可以管理哦

  1. 安裝
    `` sudo apt install supervisor
  2. 配置文件
    到/ect/supervisor/conf.d/目錄下,新建myprj.conf文件
    ``vim myprj.conf
    填入以下內容


[program:aijiaoyu]
command=/opt/python/myprj./bin/gunicorn -c /data/python/myprj./env/gunc.py main:app
directory=/data/python/myprj
user=root
autorestart=true
startsecs=10
startretires=3
redirect_stderr=true
stdout_logfile_maxbytes=100MB
stdout_logfile_backups = 20
stdout_logfile=/var/log/supervisor/myprj.log

配置文件的簡單說明

program:myprj]   #登記項目名稱
directory=/data/python/myprj
command=/opt/python/myprj./bin/gunicorn -c /data/python/myprj./env/gunc.py main:app 程序啓動命令
autostart=true       ; 在supervisord啓動的時候也自動啓動
startsecs=10         ; 啓動10秒後沒有異常退出,就表示進程正常啓動了,默認爲1秒
autorestart=true     ; 程序退出後自動重啓,可選值:[unexpected,true,false],默認爲unexpected,表示進程意外殺死後才重啓
startretries=3       ; 啓動失敗自動重試次數,默認是3
user=root          ; 用哪一個用戶啓動進程,默認是root
priority=999         ; 進程啓動優先級,默認999,值小的優先啓動
redirect_stderr=true ; 把stderr重定向到stdout,默認false
stdout_logfile_maxbytes=100MB  ; stdout 日誌文件大小,默認50MB
stdout_logfile_backups = 20   ; stdout 日誌文件備份數,默認是10
; stdout 日誌文件,須要注意當指定目錄不存在時沒法正常啓動,因此須要手動建立目錄(supervisord 會自動建立日誌文件)
stdout_logfile=/var/log/supervisor/myprj.log
stopasgroup=false     ;默認爲false,進程被殺死時,是否向這個進程組發送stop信號,包括子進程
killasgroup=false     ;默認爲false,向進程組發送kill信號,包括子進程

讓supervisor更新配置

sudo supervisorctl update   #更新配置
sudo supervisorctl reload   #重啓
sudo supervisorctl status  #查看全部項目的狀況
sudo supervisorctl stop/start/restart  項目名稱

【注意】必定不能以守護進程啓動,不然supervisor會檢測不到進程,從而認爲進程啓動失敗

總結

每次看別人的博客,都是以爲不完整,因此本身重寫了這個教程。一個完成的流程
若是對你有用,請點個贊,或者關注,歡迎加羣一塊兒交流技術

參考文檔:

  1. nginx+uwsgi 和nginx+gunicorn區別、如何部署
  2. gunicorn部署Flask服務
  3. 使用gunicorn部署flask項目
相關文章
相關標籤/搜索