Flask部署| gunicorn、nginx部署flask項目,並用supervisor來管理進程


本科的時候做公眾號,開始提供學生教務查詢服務,后端從PHP轉到Python,無論是使用django還是flask,部署都沒PHP那么方便,每次修改程序完,都是ps ax,然后再kill,再run。emmmmmm,其實一直都知道supervisor,之前配置過幾次,都沒配成功 ,也就沒耐心好好去學一學,剛好寒假想重新學一下flask,就嘗試了一下,配置成功,順便記錄下,以便以后的使用。

Flask項目開發

emmmmmm,這里就不贅述了,我這里部署的是自己根據Flask官方文檔進行練習的項目,如果覺得還不錯,可以給個star哦
Github地址:https://github.com/LDouble/Flask-Learning

用gunicorn運行Flask項目

Flask自帶server性能等問題,沒辦法部署到生產環境,之前用的時候,官方提供了很多種方案,詳情見http://www.pythondoc.com/flask/deploying/,我是誤打誤撞選擇了gunicorn,而且覺得用起來挺舒服的。

  • 安裝gunicorn
    pip3 install gunicorn

  • 通過命令啟動程序

gunicorn --workers=2 test:app # test為模塊名,test:app,意味着我的test.py中的服務器實例化對象為app workers=2 代表2個進程
[2018-02-18 16:50:18 +0800] [4858] [INFO] Starting gunicorn 19.7.1
[2018-02-18 16:50:18 +0800] [4858] [INFO] Listening at: http://127.0.0.1:8000 (4858) #默認運行在8000端口
[2018-02-18 16:50:18 +0800] [4858] [INFO] Using worker: sync #
[2018-02-18 16:50:18 +0800] [4863] [INFO] Booting worker with pid: 4863
[2018-02-18 16:50:18 +0800] [4864] [INFO] Booting worker with pid: 4864

其它更多參數以及說明參考
http://docs.gunicorn.org/en/stable/run.html#commands
http://blog.csdn.net/y472360651/article/details/78538188

  • 編寫配置文件
    那么多配置文件,我們要是全部都在命令行輸入,豈不是太麻煩了,所以我們可以通過加載配置文件來運行程序。配置文件的參數和上面提到的差不多,可以按照自己的需要選擇何時的參數即可。
import  os
from  gevent import monkey
monkey.patch_all()
import multiprocessing
debug = False
bind = "0.0.0.0:5001"
pidfile = "gunicorn.pid"
logfile = "error.log"
workers = multiprocessing.cpu_count()*2 + 1
worker_class = "gevent" # 異步非阻塞
reload = True # 自動重新加載
#daemon = True
gunicorn -c gunc.py hello:app #運行程序

supervisor 配置管理進程

  • 安裝supervisor並生成配置文件模板
pip install supervisor #因為supervisor目前只支持py2,所以不能用pip3進行安裝 emmmmmm
echo_supervisord_conf > supervisor.conf # 導出配置模板
# 然后supervisor.conf 尾部添加內容如下:
[program:hello_world] ;hello_word 是自己給進程取的名,隨意
command=gunicorn -c gunc.py hello:app    ; supervisor啟動命令
directory=/www/Flask-Learning/hello_world                                             ; 項目的文件夾路徑
startsecs=0                                                                             ; 啟動時間
stopwaitsecs=0                                                                          ; 終止等待時間
autostart=false                                                                         ; 是否自動啟動
autorestart=false                                                                       ; 是否自動重啟
stdout_logfile=/www/log/hello.log                           ; log 日志
stderr_logfile=/www/log/hello.err                           ; 錯誤日志
# 加載配置文件並啟動supervisor
supervisord -c supervisor.conf
# 管理項目
supervisorctl reload :修改完配置文件后重新啟動supervisor
supervisorctl status :查看supervisor監管的進程狀態
supervisorctl start 進程名 :啟動XXX進程 進程名就是你剛剛配置文件的進程名
supervisorctl stop 進程名 :停止XXX進程
supervisorctl stop all:停止全部進程,注:start、restart、stop都不會載入最新的配置文件。
supervisorctl update:根據最新的配置文件,啟動新配置
  • 開機自動啟動supervisor
# Ubuntu為例
vim /etc/rc.local
#添加以下內容
supervisord -c path/supervisor.conf # path是supervisor.conf的路徑
supervisorctl start all #啟動所有的程序

Nginx實現反向代理

至於為什么要用Nginx實現反向代理,各有自己的需求,這個在知乎上也有討論,可以看看https://www.zhihu.com/question/38528616,我是因為一個服務器上有多個應用,而且期末的時候需要考慮到負載均衡。

反向代理和平常的反向代理一樣的,
vim /etc/nginx/site-enable/default

# 添加server
server {
    listen    80;
    server_name hello_flask.it592.com;
    root /www/Flask-Learning/hello_world;
    location / {
	    proxy_pass http://127.0.0.1:5001; #gunicorn運行的端口
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

部署完畢

這大概就是完整的部署過程了,我的網站地址:http://hello_flask.it592.com/api/


免責聲明!

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



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