引言
伺服器的相關知識曾經讓我非常困惑。我相信還有很多的Python開發者和我有著類似的遭遇。所以,請讓我和你分享我知道的一切關於伺服器的知識,來解開這些困惑。
HTTP: 統治全球資訊網的協議
HTTP(超文字傳輸協議)是一種通訊協議,它被用來傳送和接收因特網上的網頁以及其他資料檔案。它是一套規則和相關引數的集合,這些規則和引數控制著網頁和其他資料檔案在因特網上的傳輸。
瀏覽器是一個HTTP客戶端,因為它會傳送請求到一個HTTP伺服器(網頁伺服器),HTTP伺服器隨後把響應傳送回客戶端。HTTP監聽的標準(和預設)埠是80埠,儘管其實可以使用任何的埠。這篇文章 對HTTP進行了非常好的解釋。請務必瀏覽一下。如果你想要鑽研一下HTTP,請檢視HTTP 1.1 specs ,它已經被多種請求註解(RFCs(7230-7237))所替代。你可以在ietf搜尋這些請求註解。
HTTP 伺服器
因此,HTTP請求和響應有其特定的格式!當使用者進入某個網站的時候,他們的瀏覽器與站點的網頁伺服器進行了連線(這個過程稱之為請求)。伺服器在檔案系統中查詢檔案,並將其傳送回使用者的瀏覽器,瀏覽器會顯示這些檔案(這個過程稱之為響應)。這便是HTTP協議的工作方式。看上去很簡單?
動態網站並不基於檔案系統中的檔案,取而代之的是,當有請求到達的時候,由一個網站伺服器上面執行的程式來處理。該程式會生成內容並將其返回給使用者。它們可以做很多有用的事,比如顯示BBS上的帖子,顯示你的電子郵件,配置軟體或是顯示當前的時間。
不論客戶端或者伺服器是如何實現的,總有辦法來生成有效的HTTP請求,讓客戶端正常工作,同樣,伺服器要能夠理解傳送給它的HTTP請求並且為所有到達的請求生成有效的HTTP響應。客戶端和伺服器都必須具有相互連線的能力(這種情況下會使用TCP進行可靠的連線),能夠傳輸HTTP請求(客戶端 -> 伺服器)和HTTP響應(伺服器 -> 客戶端)。
HTTP伺服器(是一個程式)會接受這些請求,並且會讓你的python獲取HTTP請求方法以及URI。HTTP伺服器會處理很多來自圖片和靜態資源的請求。 那麼它又是如何生成動態urls的呢?
1 |
@app.route('displaynews<name_of_category>',methods=['GET']) |
在Flask中你可能使用過這個裝飾器,Flask 是一個python微型框架。Flask會把來自瀏覽器的請求和該路由進行模式匹配。但是flask是如何解析來自瀏覽器的http請求的呢?HTTP伺服器會把動態生成的urls傳遞給應用伺服器。哇哦!等等。。應用伺服器又是什麼東西呢?
Apache的 HTTPD 和nginx是兩個常用的python網站伺服器。
應用伺服器
大多數的HTTP伺服器是由C或C++寫成的,所以它們不能直接執行Python指令碼——在伺服器和程式之間,需要一個橋樑。這個橋樑,或者說是介面,定義了程式應該如何和伺服器進行互動。這就是應用伺服器。動態生成的urls從網站伺服器傳遞到應用伺服器。應用伺服器對url進行匹配並執行該路由對應的指令碼。然後它(應用伺服器)把響應返回給網站伺服器,網站伺服器生成一個HTTP響應,並將其返回給客戶端。
對於python來講,有很多可以用的應用伺服器。 這個連結 列出了不同的應用伺服器。起初,pyhton開發者們使用低層閘道器來進行部署。
通用閘道器介面(CGI)
這個介面,通常被稱之為“CGI”,是最古老的應用伺服器,它幾乎被任何網站伺服器所天生支援,無需專門安裝。使用CGI和網站伺服器進行通訊的程式,需要針對每一個請求單獨開啟。所以每一個請求都會啟動一個全新的Python直譯器——這還是需要花費一點時間的——因此讓整個介面只能用在低負載的情況下。
如果你想要學習如何編寫一個CGI。請按照JM Marshall的這篇教程 去做。
mod_python
mod_python是一個Apache HTTP 伺服器模組,它在伺服器上面整合了Python語言。在上世紀90年代和本世紀初期,大多數的Python web應用都執行在配置了 mod_python 的Apache 上。但是,mod_python並不是標準規範。在使用mod_python時會有一些問題 。Python web應用需要一種可持續的運作方式。
FastCgi and SCGI是另一種用來部署的低層閘道器。它們嘗試解決CGI的效能問題。這些低層的閘道器介面不依賴特定語言。
WSGI的崛起
一個Web伺服器閘道器介面(WSGI)伺服器為執行Python web應用實現了伺服器端的WSGI介面。 WSGI適合各種規模並且可以在多執行緒或多程式環境下工作,我們同樣可以使用WSGI編寫中介軟體。中介軟體對於會話處理,授權和其他很多工都非常有用。你可以在 Armin的部落格裡面學到如何編寫你自己的WSGI實現。這個連結給出了不同WSGI實現的比較。
Gunicorn and uWSGI Gunicorn 和 uWSGI
Gunicorn 和 uWSGI 是兩個不同的應用伺服器。Gunicorn ‘Green Unicorn’是一個為UNIX設計的Python WSGI HTTP伺服器。配置非常簡單,和多種web框架相容,而且它足夠的快。
digitalocean的這篇文章講解了如何配置gunicorn和nginx。
uWSGI 是另一種備選的應用伺服器。uWSGI是一個高效能,強大的WSGI伺服器。uWSGI有很多可配置選項, digitalocean的這篇文章 講解了如何配置uWSGI和nginx。
Apache vs Nginx
Anturis 在他的部落格上已經非常清晰的闡述了兩者之間的不同。這篇文章解釋了apache和nginx是如何工作的。
總結一下:
- Apache 通過建立程式和執行緒來處理額外的連線。而Nginx被稱為事件驅動,非同步,並且非阻塞。
- Apache非常強大但是Nginx非常快。Nginx可以更快呈現靜態內容。
- Nginx包含了先進的負載均衡以及快取能力。
- Nginx比Apache輕量級的多。
organic agency對Apache和nginx進行了基準測試。結果可以在這裡看到。
我用的是什麼
我使用Nginx因為它很快、很輕巧,並且我發現配置它更容易。Gunicorn配置起來也很簡單所以我用gunicorn。uWsgi也經常被用來替代gunicorn。
請和我分享一下你的python應用傾向於使用哪一種伺服器呢?
打賞支援我翻譯更多好文章,謝謝!
打賞譯者
打賞支援我翻譯更多好文章,謝謝!
任選一種支付方式