使用 gunicorn 部署flask項目

1、WSGI協議

Web框架致力于如何生成HTML代碼,而Web服務器用于處理和響應HTTP請求。Web框架和Web服務器之間的通信,需要一套雙方都遵守的接口協議。WSGI協議就是用來統一這兩者的接口的。

2、WSGI容器

常用的WSGI容器有Gunicorn和uWSGI,但Gunicorn直接用命令啟動,不需要編寫配置文件,相對uWSGI要容易很多

3、gunicorn介紹

gunicorn是一個python Wsgi http server,只支持在Unix系統上運行,來源于Ruby的unicorn項目。Gunicorn使用prefork master-worker模型(在gunicorn中,master被稱為arbiter),能夠與各種wsgi web框架協作。

為啥要用 gunicorn

Flask 是一個 Platform,他本身并不包括 Web Server,為了使用方便,Flask 內置了一個 Werkzeug wsgi server 但是這個 server 并不高效。 如果是工業部署的話, 就需要用 Gunicorn 去替代掉這個內置的 Wsgi Server.

簡單說下幾種部署方式

  • Flask 內置 WebServer + Flask App = 弱雞版本的 Server, 單進程(單 worker) / 失敗掛掉 / 不易 Scale
  • Gunicorn + Flask App = 多進程(多 worker) / 多線程 / 失敗自動幫你重啟 Worker / 可簡單Scale
  • 多 Nginx + 多 Gunicorn + Flask App = 小型多實例 Web 應用,一般也會給 gunicorn 掛 supervisor

在生產環境中:一般都是請求的走向都是 Nginx->gunicorn->flask/django app

4、gunicorn安裝

gunicorn安裝非常簡單,使用命令pip install gunicorn即可。一般使用它,主要是為使用其異步的worker模型,還需要安裝對應的異步模塊。

$ pip install gunicorn
$ pip install greenlet # 使用異步必須安裝
$ pip install eventlet # 使用eventlet workers
$ pip install gevent   # 使用gevent workers

5、gunicorn使用

這里使用gunicorn來部署一個flask項目舉例,此處flask框架的使用不過多闡述,不是本文的重點。

如下例子,保存為app.py

from flask import Flask
app = Flask(__name__)@app.route("/")
def hello():return "Hello World!"

gunicorn通常使用的參數如下:

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

在shell中輸入你的啟動配置,比如:

gunicorn -w 3 -b 127.0.0.1:8080 app:app
# 此處app:app中,第一個app為flask項目實例所在的包,第二個app為生成的flask項目實例

這樣運行正常就可以啟動服務器了。

如果要通過網絡訪問,則需要綁定不同的地址(也可以同時設置監聽端口),設置0.0.0.0可以監聽到所有ip的請求:

gunicorn -b 0.0.0.0:8080 app:app

6、綁定端口

linux通常會禁止綁定使用1024以下的端口,除非在root用戶權限。很多人在使用gunicorn時試圖將其綁定到80或者443端口,發現無效。如果想綁定到這些端口,常見的有如下的幾種方法:

  • 使用Nginx代理轉發。
  • sudo啟動gunicorn。
  • 安裝額外的程序。

7、結束gunicorn服務進程

使用ps -ef | grep gunicorn命令找出gunicorn所有進程。

# ps -ef | grep gunicorn
root     16843 23035  0 Oct14 ?        00:00:02 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app
root     22445 23035  0 Oct04 ?        00:00:15 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app
root     22581 23035  0 Oct11 ?        00:00:05 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app
root     23035     1  0 Sep27 ?        00:04:11 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app

然后使用 kill -9 進程ID 命令來殺掉進程,注意,我們找到主進程殺掉即可,子進程會隨之結束,在上例中,主進程號為23035.

# kill -9 23035
# ps -ef | grep gunicorn

殺掉進程后,稍等幾秒,再使用ps -ef | grep gunicorn查看,發現gunicorn服務進程已全部殺掉。

8、配置文件

通過gunicorn -h可以看到gunicorn有非常多的配置項,因此通常會寫成一個配置文件來進行配置。

比如gunicorn.conf文件

# gunicorn.confbind = "0.0.0.0:5000"
workers = 4
backlog = 2048
pidfile = "log/gunicorn.pid"
accesslog = "log/access.log"
errorlog = "log/debug.log"
timeout = 600
# debug=False生產環境不用這個配置項,但調試的時候debug=True還是挺好用的。而且,開啟debug項后,在啟動gunicorn的時候可以看到所有可配置項的配置
debug=False
capture_output = True

注意上面log項,如果需要將這些log文件統一放到log文件夾下,事先要先建好,不然運行時會報錯。

運行代碼為:

gunicorn --config gunicorn.conf main:app

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453753.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453753.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453753.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟件需求與問題解決

(一) 小滿當上項目經理后不久,參與了一個大項目。當時市場簽下來的時候,公司里面是歡天喜地的。項目做了一年多。到了交付的時候,用戶卻很不滿意,當初說好的東西,好多都變了卦。用戶是上帝&…

flex 換主軸后子元素占滿_Chrome72 嵌套 flex 布局修改,你的網站可能會發生布局錯亂...

起源2019 年 1 月 29 日,Chrome72 正式版(72.0.3626.81)發布,本次發布帶來了一個改變,且沒有在更新日志中提及,該改變導致某些網站發生了布局錯亂。該改變主要針對的是嵌套的flex布局,下面我們一起看下是怎么回事。問題…

使用 Django + Wusgi + Nginx 部署 Django

如何在生產上部署Django? Django的部署可以有很多方式,采用 nginxuwsgi 的方式是其中比較常見的一種方式。 uwsgi介紹 uWSGI是一個Web服務器,它實現了WSGI協議、uwsgi、http等協議。Nginx中HttpUwsgiModule的作用是與uWSGI服務器進行交換。 WSGI / …

網絡學習網址

網絡之路博客 http://ccieh3c.com/ 轉載于:https://www.cnblogs.com/changha0/p/8179801.html

路由到另外一個頁面_Nextjs使用解讀一(項目搭建與路由系統)

文章說明:1. 之前想搭建個人博客,由于學習的是react技術棧,所以就到處搜羅資料學了nextjs,配合koa就把博客搭起來了。該系列文章基于我的學習筆記,重新整理了一遍,如果有錯誤之處,還請指正。2. …

微信獲取token -1000

最終翻看微信開發api找到需要去配置IP白名單。只需要配置訪問來源IP即可。 轉載于:https://www.cnblogs.com/yangjinqiang/p/8184663.html

產品技術和管理

為啥純粹為消費者傳遞體驗的活動可以價格不菲,幾為暴利?——談客戶體驗作為客戶價值提升之源 不論產品還是服務,如果能夠為消費者傳遞有益的體驗,其價值就可以在一般的產品服務之上得以體現;附加了體驗的產品&#xff…

Linux 修改系統編碼

linux服務器的字符集設置可能影響到網站頁面出現 “???” 等問號亂碼,還有可能導致文件中的漢字部分出現亂碼。有兩個原因 服務器沒有安裝 zh_CN.UTF-8 字符集,導致不支持中文!服務器雖然裝了 zh_CN.UTF-8…

jquery ztree 設置勾選_047 JAVA-jQuery

jQuery操作元素屬性的值表單:<body><input type"button" name"" id"but1" value"測試獲得屬性值" /><hr />賬號&#xff1a;<input type"text" name"sxtzh" id"zhanghao" value&q…

Opencv undefined reference to `cv::imread() Ubuntu編譯

Ubuntu下編譯一個C文件&#xff0c;C源程序中使用了opencv&#xff0c;opencv的安裝沒有問題&#xff0c;但是在編譯的過程中出現如下錯誤&#xff1a; undefined reference to cv::imread(std::string const&, int)undefined reference to cv::noArray()undefined referen…

深度學習目標檢測之 YOLO v1

這是繼 RCNN&#xff0c;fast-RCNN 和 faster-RCNN 之后&#xff0c;rbg&#xff08;RossGirshick&#xff09;針對DL目標檢測速度問題提出的另外一種框架。YOLO V1 增強版本GPU中能跑45fps&#xff0c;簡化版本155fps。 論文名&#xff1a; 《You Only Look Once&#xff1a;…

編程珠璣番外篇

1.Plan 9 的八卦 在 Windows 下喜歡用 FTP 的同學抱怨 Linux 下面沒有如 LeapFTP 那樣的方便的工具. 在蘋果下面用慣了 Cyberduck 的同學可能也會抱怨 Linux 下面使用 FTP 和 SFTP 是一件麻煩的事情. 其實一點都不麻煩, 因為在 LINUX 系統上壓根就不需要用 FTP. 為什么呢? 因…

BT下載原理分析

版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 BitTorrent協議。 BT全名為BitTorrent,是一個p2p軟件,你在下載download的同時&#xff0c;也在為其他用戶提供上傳upload&#xff0c;因為大家是“互相幫助”&#xff0c;所以不會隨著用戶數的增加而…

表格列求和_excel表格制作,Excel表格的基本操作,包含制作一個表格10方面的知識...

創建表格&#xff0c;插入與刪除一行一列或多行多行&#xff0c;一次移動一行一列或多行多列&#xff0c;拆分與合并單元格&#xff0c;單元格內換行&#xff0c;表格求和與求平均值是Excel表格的基本操作&#xff1b;除此之外&#xff0c;Excel表格的基本操作還包括調整行高列…

深度學習之 FPN (Feature Pyramid Networks)

論文題目&#xff1a;Feature Pyramid Networks for Object Detection論文鏈接&#xff1a;https://arxiv.org/abs/1612.03144論文代碼&#xff1a;Caffe版本 https://github.com/unsky/FPN 《Feature Pyramid Networks for Object Detection》這篇論文主要解決的問題是目標檢…

ISLR—第二章 Statistical Learning

Statistical Learning Y 和X的關系why estimate f 用來預測 預測的時候可以將f^當成一個black box來用&#xff0c;目的主要是預測對應x時候的y而不關系它們之間的關系。用來推斷 推斷的時候&#xff0c;f^不能是一個black box&#xff0c;因為我們想知道predictor和response之…

提高編程思想

虛函數和抽象函數有什么區別 虛函數是有代碼的并明確允許子類去覆蓋&#xff0c;但子類也可不覆蓋,就是說可以直接用&#xff0c;不用重寫 抽象函數是沒有代碼&#xff0c;子類繼承后一定要重寫 ****************************************************************** 在一…

python特效代碼_網頁愛心特效弱爆了,我讓你點擊網頁顯示所有python模塊!

點擊網頁特效上周寫了一篇文章快速搭建個人博客的教程文章&#xff1a;其中說到了一個點擊網頁出現愛心特效的插件 click_heart.js ,當然大家可能也見過其他博客上面&#xff0c;有點擊網頁出現類似 富強、民主、文明、和諧等等&#xff0c;關于代碼在這里不多贅述&#xff0c;…

Python 包管理之 poetry

poetry是一個Python虛擬環境和依賴管理的工具。poetry和pipenv類似&#xff0c;另外還提供了打包和發布的功能。 官方文檔&#xff1a;python-poetry.org/docs/ python項目部署&#xff1a;poetry管理本地環境,上線用docker poetry 安裝 poetry提供多種安裝方式&#xff0c…

Windows數據庫編程接口簡介

數據庫是計算機中一種專門管理數據資源的系統&#xff0c;目前幾乎所有軟件都需要與數據庫打交道&#xff08;包括操作系統&#xff0c;比如Windows上的注冊表其實也是一種數據庫&#xff09;&#xff0c;有些軟件更是以數據庫為核心因此掌握數據庫系統的使用方法以及數據庫系統…