主要內容:html
1. WSGIpython
1.1 WSGI相關概述linux
引子: wsgi server (好比uWSGI) 要和 wsgi application(好比django )交互,uwsgi須要將過來的請求轉給django 處理,那麼uWSGI 和 django的交互和調用就須要一個統一的規範,這個規範就是WSGI WSGI(Web Server Gateway Interface)nginx
1.2 定義一個簡版的WSGI 接口git
from wsgiref.simple_server import make_server def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return [b'<h1>Hello, web!</h1>'] httpd = make_server('', 8080, application) print('Serving HTTP on port 8080...') # 開始監聽HTTP請求: httpd.serve_forever()
注意: 整個application()函數自己沒有涉及到任何解析HTTP的部分,也就是說,底層代碼不須要咱們本身編寫, 咱們只負責在更高層次上考慮如何響應請求就能夠了。 application()函數必須由WSGI服務器來調用。有不少符合WSGI規範的服務器,咱們能夠挑選一個來用。 Python內置了一個WSGI服務器,這個模塊叫wsgiref application()函數就是符合WSGI標準的一個HTTP處理函數,它接收兩個參數: //environ:一個包含全部HTTP請求信息的dict對象; //start_response:一個發送HTTP響應的函數。 在application()函數中,調用:start_response('200 OK', [('Content-Type', 'text/html')]) 就發送了HTTP響應的Header,注意Header只能發送一次,也就是隻能調用一次start_response()函數。 start_response()函數接收兩個參數,一個是HTTP響應碼,一個是一組list表示的HTTP Header,每一個Header用一個包含兩個str的tuple表示。 一般狀況下,都應該把Content-Type頭髮送給瀏覽器。其餘不少經常使用的HTTP Header也應該發送。 而後,函數的返回值b'<h1>Hello, web!</h1>'將做爲HTTP響應的Body發送給瀏覽器。 有了WSGI,咱們關心的就是如何從environ這個dict對象拿到HTTP請求信息,而後構造HTML,經過start_response()發送Header,最後返回Body。
1.3 WSGI 的做用web
WSGI有兩方:「服務器」或「網關」一方,以及「應用程序」或「應用框架」一方。服務方調用應用方,提供環境信息,以及一個回調函數(提供給應用程序用來將消息頭傳遞給服務器方),並接收Web內容做爲返回值。
所謂的 WSGI中間件同時實現了API的兩方,所以能夠在WSGI服務和WSGI應用之間起調解做用:從WSGI服務器的角度來講,中間件扮演應用程序,而從應用程序的角度來講,中間件扮演服務器。「中間件」組件能夠執行如下功能:
重寫環境變量後,根據目標URL,將請求消息路由到不一樣的應用對象。
容許在一個進程中同時運行多個應用程序或應用框架。
負載均衡和遠程處理,經過在網絡上轉發請求和響應消息。
進行內容後處理,例如應用XSLT樣式表
2. uWSGIdjango
1.1 uWSGI的相關概述瀏覽器
uWSGI是一個Web服務器,它實現了WSGI協議、uwsgi、http等協議。Nginx中HttpUwsgiModule的做用是與uWSGI服務器進行交換。服務器
1.2 uWSGI配置的的理解網絡
(1) 通訊接口: http/http-socket/socket
socket 方式: socket = 0.0.0.0:8000
http 方式: http = 0.0.0.0:8000
上面兩個圖都是http方式,使用http啓動uwsgi,系統會額外啓動一個http進程,從級別上來講,它和nginx是同一級別的,因此客戶端和uwsgi通訊,徹底能夠繞過nginx,不須要額外進行一個轉發(如第二張圖同樣),但很顯然,這是並非一個很明智但選擇,這樣會失去了nginx不少優秀的功能。
所以: 若是你沒用nginx,只想本身啓動一個http界面,用這個
--- 另外 還有一方式,可是在uWSGI的配置文件中並未展現出: 具體使用待定---
http -socket 方式 http-socket=127.0.0.1:8000
http-socket方式,這個適用於web服務器不支持uwsgi時。
(2) processes/workers.
表示開啓多進程,根據你的應有開啓合適的進程數,在一些參考資料上,可能會看到processes = 2 * cpucores或者workers = 2 * cpucores,若是應有比較簡單,這樣設置通常能夠。若是想更合理,官方提供了uwsgitop去得到一個較爲合理的值。
(3)threads & enable-threads
python中存在GIL,實際上不存在真正意義上的多線程,可是否須要,這個就根據各自但需求設定了。結合processes:
表示2個進程,每一個進程中有4個線程。
(4)uid & gid & chmod-socket
uwsgi不建議使用root權限去啓動uwsgi實例。能夠經過root用戶去運行uwsgi文件,當經過uid和gid去修改用戶(移除root權限)。而且,若是你使用的是socket的通訊方式,最好加上chmod-socket字段,在linux下,socket的啓動方式,套接字相似文件,你必須保證有權限去讀取它。
(5)master
意味着啓動一個master主進程來管理其餘進程,建議啓動這個進程,在管理的時候比較方便;若是kill這個master進程,至關於關閉全部的uwsgi進程
----------- 內容摘自: https://blog.csdn.net/l_vip/article/details/81487608 -------------------------------------------
3. uwsgi
概述: uwsgi是服務器和服務端應用程序的通訊協議,規定了怎麼把請求轉發給應用程序和返回
關於 uwsgi的理解
本文根據代碼閱讀以及參照多種文檔,描述了uwsgi的啓動多進程+多線程工做緣由,以及thunder_lock參數的做用:
-------- 以上內容摘自: https://blog.csdn.net/pzqingchong/article/details/79522215 -------