淺析WSGI

今天看了一篇關(guān)于WSGI的英語文章,寫的很清晰,總結(jié)一下以便日后翻閱。

WSGI Servers

Web Server Gateway Interface服務(wù)器實(shí)際上把WSGI接口包裝成了服務(wù)器,可以用來運(yùn)行Python web applications。

Why is WSGI necessary?

傳統(tǒng)的網(wǎng)頁服務(wù)器沒有辦法運(yùn)行python應(yīng)用。在20世紀(jì)末期,Grisha Trubetskoy開發(fā)了一個(gè)Apache模塊,mode_python來運(yùn)行任意的python代碼。但是這樣也只是實(shí)現(xiàn)了從無到有的實(shí)現(xiàn),并不是一個(gè)標(biāo)準(zhǔn)的約定。于是Python社區(qū)發(fā)明了WSGI作為標(biāo)準(zhǔn)的接口。這個(gè)接口用于Web Server 和 Python web application之間的通信連接。


image.png

如圖中所示,一個(gè)WSGI服務(wù)器會(huì)根據(jù)PEP 3333 standard,調(diào)用Python app。

WSGI's Purpose

那么為什么要使用WSGI,而不是讓web app直接和web server進(jìn)行通信呢?

  • WSGI 使你的Web App更加靈活:開發(fā)者或許會(huì)替換他們技術(shù)站中的元素。比如我現(xiàn)在不想使用Gunicorn了,換成了uWSGI了。那么我不需要去修改Web App的接口,因?yàn)镚unicorn 和 uWSGI都是基于WSGI接口實(shí)現(xiàn)的。
    就像在PEP(Python Enhancement Proposal) 3333 中提到的:
    由于WSGI接口的廣泛使用,開發(fā)者選擇Web框架的選擇可以不在那么依賴于Web Server了。開發(fā)者只需要選擇合適的Web Server和這個(gè)Server 支持的CGI接口,就可以進(jìn)行自由地配對(duì)。另一方面讓術(shù)業(yè)有專攻,Web Server開發(fā)者可以專注于自己的領(lǐng)域,Web App開發(fā)者亦是。

  • WSGI服務(wù)器提高了Web App 的適應(yīng)性Scaling: 服務(wù)成千上萬的請(qǐng)求是WSGI服務(wù)器的工作,而不是Web App的工作。Web App只專注于邏輯處理而已。如果分發(fā)這些請(qǐng)求,使之得到高效的處理是WSGI的工作之一。

image.png

上圖是Web Browser,Web Server 和 WSGI Server之間的通信流程。

WSGI就是一個(gè)用來運(yùn)行Python代碼的標(biāo)準(zhǔn)接口。而作為一個(gè)網(wǎng)頁開發(fā)者,你所需要知道的是:

  • WSGI代表了Web Server Gateway Interface.
  • WSGI服務(wù)器是一個(gè)單獨(dú)的進(jìn)城,跑在不同的端口號(hào)上,不同于Web Server。
  • 你需要配置好你的Web Server,讓它把網(wǎng)絡(luò)請(qǐng)求發(fā)送到WSGI服務(wù)器。等WSGI服務(wù)器處理完請(qǐng)求,再把Response返回到Web Server。

如果你是用的是目前流行的框架,比如Django和Flask。那么你不需要擔(dān)心WSGI實(shí)現(xiàn)的問題,這些框架都已經(jīng)實(shí)現(xiàn)好了。同樣地,如果你使用類似于Gunicorn和uWSGI之一類的WSGI服務(wù)器,你也不需要擔(dān)心WSGI的實(shí)現(xiàn)問題。它們都是基于WSGI實(shí)現(xiàn)的。你只需要進(jìn)行合理地配置,讓它們知道如何與彼此之間進(jìn)行通信就可以了。

Example web server configuration

一個(gè)Web Server的配置中會(huì)寫明了什么網(wǎng)絡(luò)請(qǐng)求應(yīng)該被轉(zhuǎn)送到WSGI 服務(wù)器。

例如,一個(gè)Nginx的web服務(wù)器寫明了,Nginx需要處理靜態(tài)資源,比如images,JavaScript和CSS文件。這些文件一般位于/static目錄下面。除此之外的請(qǐng)求都轉(zhuǎn)交給WSGI位于8000端口的服務(wù)器。

# this specifies that there is a WSGI server running on port 8000
upstream app_server_djangoapp {
    server localhost:8000 fail_timeout=0;
}

# Nginx is set up to run on the standard HTTP port and listen for requests
server {
  listen 80;

  # nginx should serve up static files and never send to the WSGI server
  location /static {
    autoindex on;
    alias /srv/www/assets;
  }

  # requests that do not fall under /static are passed on to the WSGI
  # server that was specified above running on port 8000
  location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    if (!-f $request_filename) {
      proxy_pass http://app_server_djangoapp;
      break;
    }
  }
}

WSGI Servers

目前比較流向的WSGI服務(wù)器有:

  • Green Unicorn is a pre-fork worker model based server ported from the Ruby Unicorn project.

  • uWSGI is gaining steam as a highly-performant WSGI server implementation.

  • mod_wsgi is an Apache module implementing the WSGI specification.

  • CherryPy is a pure Python web server that also functions as a WSGI server.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 學(xué)過PHP的都了解,php的正式環(huán)境部署非常簡(jiǎn)單,改幾個(gè)文件就OK,用FastCgi方式也是分分鐘的事情。相比起...
    chen_000閱讀 2,241評(píng)論 0 1
  • 學(xué)過PHP的都了解,php的正式環(huán)境部署非常簡(jiǎn)單,改幾個(gè)文件就OK,用FastCgi方式也是分分鐘的事情。相比起來...
    生活的探路者閱讀 250評(píng)論 0 0
  • 談?wù)揥EB編程的時(shí)候常說天天在寫CGI,那么CGI是什么呢?可能很多時(shí)候并不會(huì)去深究這些基礎(chǔ)概念,再比如除了CGI...
    __七把刀__閱讀 2,310評(píng)論 2 11
  • 分享一篇文章,總結(jié)了很多Python Web 部署的內(nèi)容,原文位于:Python Web部署方式總結(jié) 不要讓服務(wù)器...
    妄心xyx閱讀 870評(píng)論 0 13
  • 第三章,貨幣的出現(xiàn)及貨幣的復(fù)雜性 回到家后休息了會(huì),便宜老爹就做了飯,吃過了,就告訴張道陵,早點(diǎn)休息,明天一早我們...
    can_qua閱讀 195評(píng)論 0 0

友情鏈接更多精彩內(nèi)容