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


本攻略基於ubuntu1804的版本,服務器用的華為雲的服務器,python3(python2已經在2020徹底停止維護了,所以轉到python3是必須的)歡迎加我的QQ6398903,或QQ群討論相關技術

一、准備項目所需要的模塊

你需要把開發環境下用到的包信息全部導出
`` pip freeze > requirements.txt
然后,把requirements.txt文件上傳服務器

二、准備生產環境的python虛擬環境

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

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模塊

三、安裝gunicorn

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

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里面要有

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

否則,gunicorn啟動項目時,會報錯
下面是常用命令說明:

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

四、配置gunicorn的配置信息

gunicorn直接使用.py文件作為配置文件,所以,里面是支持py語法的

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.conf

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

  1. debug=True 很好理解,就是剛上線時,可以開啟,方便發現錯誤,正式啟用要注銷
  2. daemon=True 意思是以守護進程的形式運行,適合直接輸入gunicorn命令來運行,【注意】但如果您想用supervisor來管理的話,這個要注銷
  3. 需要在項目文件中,建立一個log的文件夾,否則報錯無法啟動,因為我們的日志文件和pid都需要保存在Log目錄中

五、通過配置文件啟動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 #退出虛擬環境

六、配置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

七、安裝和配置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項目


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM