gunicorn簡介 架構 安裝與配置

2021-08-28 02:13:11 字數 3744 閱讀 4949

簡介

服務模型(server model)

gunicorn是基於 pre-fork 模型的。也就意味著有乙個中心管理程序( master process )用來管理 worker 程序集合。master從不知道任何關於客戶端的資訊。所有的請求和響應處理都是由 worker 程序來處理的。

master(管理者)

主程式是乙個簡單的迴圈,監聽各種訊號以及相應的響應程序。master管理著正在執行的worker集合,通過監聽各種訊號比如ttin, ttou, and chld. ttin and ttou響應的增加和減少worker的數目。chld訊號表明乙個子程序已經結束了,在這種情況下master會自動的重啟失敗的worker。

worker

woker有很多種,包括:ggevent、geventlet、gtornado等等。這裡主要分析ggevent。

每個ggevent worker啟動的時候會啟動多個server物件:worker首先為每個listener建立乙個server物件(注:為什麼是一組listener,因為gunicorn可以繫結一組位址,每個位址對於乙個listener),每個server物件都有執行在乙個單獨的gevent pool物件中。真正等待鏈結和處理鏈結的操作是在server物件中進行的。

#為每個listener建立server物件。

for s in self.sockets:

pool = pool(self.worker_connections) #建立gevent pool

if self.server_class is not none:

#建立server物件

server = self.server_class(

handler_class=self.wsgi_handler, **ssl_args)

.............

server.start() #啟動server,開始等待鏈結,服務鏈結

.........

真正等待鏈結和處理鏈結的操作是在gevent的wsgiserver 和 wsgihandler中進行的。

最後再來看一下gevent的wsgiserver 和 wsgihandler的主要實現:

wsgiserver 的start函式裡面呼叫start_accepting來處理到來的鏈結。在start_accepting裡面得到接收到的套接字後呼叫do_handle來處理套接字:

def do_handle(self, *args):

spawn = self._spawn

spawn(self._handle, *args)

可以看出,wsgiserver 實際上是建立乙個協程去處理該套接字,也就是說在wsgiserver 中,乙個協程單獨負責乙個http鏈結。協程中執行的self._handle函式實際上是呼叫了wsgihandler的handle函式來不斷處理http 請求:

def handle(self):

try:

while self.socket is not none:

result = self.handle_one_request()#處理http請求

if result is none:

break

if result is true:

continue

self.status, response_body = result

self.socket.sendall(response_body)#傳送回應報文

..............

方式一:最簡單的使用 easy_install 安裝或者更新

pip install gunicorn
1 git clone git:

2 cd gunicorn

3 sudo python setup.py install

如果想讓gunicorn支援非同步 workers 的話需要安裝一下三個python包

1 easy_install -u greenlet

2 easy_install -u eventlet

3 easy_install -u gevent

說明:如果安裝 greenlet 失敗的話,你需要安裝 python headers

1 sudo apt-get install python-dev
gunicorn還需要庫函式 libevent(1.4.x or 2.0.4)

執行gunicorn

1 gunicorn

2 gunicorn_django

3 gunicorn_paster

options 可選引數 執行gunicorn的配置選項,後面會講到。

data = 'hello, world!\n'

status = '200 ok'

response_headers = [

('content-type','text/plain'),

('content-length', str(len(data)))

] start_response(status, response_headers)

return iter([data])

gunicorn_django [options] [settings_path]

gunicorn_django用法適用以 django 1.4 以前。對於django 1.4的版本以後推薦使用 gunicorn 命令(強烈推薦)

1 django_admin.py startproject mysite

2 cd mysite

gunicorn配置

gunicorn從三個不同的地方讀取配置資訊。

第乙個地方:從framework定義的配置資訊中讀取,目前只對 paster 框架有效。

第二個地方:在命令列中定義,命令列中定義的配置資訊將會覆蓋掉框架中定義的相同的引數名的值。

最後:將所有的引數資訊,放到乙個檔案中,只要是在命令列中可以定義的引數中,在配置檔案中都可以定義。(是乙個python原始檔,所以你就像在寫python**一樣)

第乙個地方不不介紹了,不實用。重點介紹第二種和第三種,其實這兩種方式都是相同的。

顯示說有配置選項:

1 gunicorn -h

上面的命令 啟動 4個 workers ,繫結到 127.0.0.1:8000

配置檔案 config.py 原始碼

1 import multiprocessing

2 3 bind = "127.0.0.1:8001"

4 workers = multiprocessing.cpu_count() * 2 + 1

使用配置檔案啟動gunicorn

和上面用命令列配置的效果完全一樣,當然兩者還可以結合起來用:

worker-class預設是sync(同步),我們配置成了 eventlet(併發的)

正向**伺服器軟體

反向**伺服器軟體

tcp上的反向**伺服器軟體

參考

gunicorn 安裝部署詳解

gunicorn是乙個unix上被廣泛使用的高效能的python wsgi unix http server。和大多數的web框架相容,並具有實現簡單,輕量級,高效能等特點。pip install gunicorn flask程式需要先安裝flask module,pip install flask...

SparkMllib原理與架構簡介

mllib是spark的機器學習庫。提供了利用spark構建大規模和易用性的機器學習平台,元件 五大特性 5 工具 包括線性代數 統計學 資料處理科學 注意 spark ml基於dataframe的apispark mllib基於rdd的api 2.0開始處於維護模式,將被淘汰 spark的各種資料...

LaTeX 簡介與安裝

leslie lamport 開發的 latex 是當今世界上最流行和使用最為廣泛的tex格式。它構築在plain tex的基礎之上,並加進了很多的功能以使得使用者可以更為方便的利用tex的強大功能。使用latex基本上不需要使用者自己設計命令和巨集等,因為latex已經替你做好了。因此,即使使用者...