Request 和 Response
前言:作為一個web開發工程師,工作中大量時間是和Request和Response打交道,這篇文章是我目前對二者的理解和總結。
問題一:何為Request 和 Response
Request 和 Response 是HTTP協議的一部分,http協議是萬維網服務器傳輸超文本到本地瀏覽器的傳輸協議。HTTP是屬于應用層的面向對象的協議,是現在web世界的基礎
HTTP協議是一種客戶端服務器架構,瀏覽器作為客戶端通過URl向HTTP服務端即Web服務器發送Request。Web服務器接受到請求后,向客戶端發送Response信息。
問題二:Request 和 Response的組成
Request客戶端發送到服務器的請求消息
Request結構.png
- 請求行: 以請求方法開頭,以空格作為間隔,后面依次是URL(統一資源定位符,用來標識互聯網上的唯一資源,可以是圖片,HTML等),HTTP協議版本。請求行標識了用什么樣的操作去操作那個資源。
- 請求頭: 緊接著請求行,后面是請求頭, 用來說明服務器使用的附加信息。這一部分有很多標準信息,像User-Agent,標識瀏覽器信息,Accept-Encoding,標識壓縮格式,Accept-Language,標識語言信息。這一部分是服務器需要的重要信息,有一定標準格式。
- 空行: 請求頭后面必須跟著空行。
- 請求體: 可以添加任意數據,這是業務層實現的基礎,與業務相關的數據都會在請求體里面發送給服務器。
Response服務器處理客戶端發過來的請求后會返回一個HTTP相應消息
響應結構.jpg
- 狀態行: 包括協議版本,狀態碼,狀態消息三個部分其中狀態碼是客戶端判斷響應狀態的重要標準,依據狀態碼,對信息進行不同處理。
- 響應頭:與請求頭一樣,告訴客戶端重要信息,如Content-Type告訴瀏覽器返回內容的格式,包括編碼方式。Date 響應生成的時間。
- 空行: 與請求空行一樣,分隔響應頭與響應體
- 響應體: 服務器返回給客戶端的文本信息,是業務層的主要實現部分。內容格式要與頭部的Content-Type對應起來。如今前后端分離的RESTful風格,就是Content-Type:application/json,然后響應體中的內容就是JSON格式。
問題三: Python web 服務器的體系結構
下面是我作為一個python web 開發新手,對web 服務器的理解。
web服務器體系結構.jpg
-
服務器軟件與應用服務器:
- web服務器:Nginx Apache 之類的叫做服務器軟件,顧名思義,這是一個軟件,用于運行web 服務的軟件。也常被稱作web服務器, HTTP服務器,其作用是用來處理HTTP協議的,且只能處理靜態內容。也就是把服務器文件系統中的每一個資源對照成URI,然后通過HTTP協議把這些已經存在的資源傳給發起HTTP請求的客戶端。
- 應用服務器: 僅僅響應靜態內容是不夠的,人們還需要動態的處理內容,返回動態的信息給客戶端。 這就用到了服務器腳本。人們為了統一服務器腳本和web服務器之間的信息交互方式,提出了CGI,統一化標準。Python社區給Python制定了一個官方的類似于GCI的協議,統一Python與web服務器的信息交互。WSGI規定了web服務器與web應用程序之間的標準接口,以確保web應用程序在不同的web服務器之間具有可移植性,在python web開發中,主流的選擇是Gunicorn,uWSGI等實現WSGI的容器。
- 兩者的區別,web服務器負責處理HTTP協議,應用服務器既可以處理HTTP協議,也能處理其他協議。 web服務器處理靜態頁面內容,動態內容通過WSGI接口交給應用服務器來處理
- 像flask Django 實現了自帶的web服務器用于開發,但是一般不能用于生產環境
- web服務器通常會和應用服務器配合一起使用,第一,實現了動靜態資源的分離,動態資源交給應用服務器處理,靜態資源則由web服務器直接返回瀏覽器,這樣就減輕了應用服務器壓力。
負載均衡,當業務壓力增大時候,可以啟動多個應用服務器進行水平擴展,而web服務器的負載均衡功能可以把請求通過算法分發到各個不同的實例進行處理,保證壓力分配到不同的應用服務器,保證生產環境的穩定。
-
選擇Nginx
- Nginx 是一個開源的高性能的HTTP反向代理服務器
- 作為web服務器,處理靜態文件,索引文件的效率非常高
- 可以支持最大50000個并發連接,占用很少的內存
- 穩定性高
- 配置簡潔
- 支持熱部署
- 強大的反向代理:根據客戶端的請求,從后端服務器上獲取資源,將資源返回給客戶端,代理和服務在一個局域網內,對客戶端是透明的.Nginx,是反向代理的最佳選擇.可以起到緩沖請求,交給后端一個完整的HTTP請求,緩沖響應,減輕后端的壓力.隱藏應用服務器,防范網絡攻擊,增加安全性緩存靜態內容,代理緩存可以滿足大量網站請求,大大降低應用服務器上的負載,支持壓縮,通過壓縮優化網站訪問速度
- 負載均衡.幫助web服務器合理分配請求,以達到資源的使用效率最佳,吞吐率最大,響應時間最小.
-
WSGI Werkzeug flask Gunicorn
- WSGI:Python Web Server Gateway Interface python 定義的web服務器與web應用程序之間的簡單而通用的接口
- Werkzeng: Werkzeug是Python基于WSGI協議寫的函數庫,它的應用很廣泛.
- flask: 基于Werkzeng實現的輕量級web框架
- Gunicorn: wsgi容器,可以用Gunicorn跑用flask等Werkzeng框架實現的程序,這樣就實現了一個應用服務器.
問題四: 從發出Request到返回Response 發生了啥
- 瀏覽器發出一個請求,到DNS服務器,將域名解析為IP
- 瀏覽器利用IP和端口號和網站服務器建立TCP連接,經過三次握手,TCP連接建立完成.
- 瀏覽器組裝好Request發送給WEB服務器
- Nginx接受到Request之后根據請求資源類型進行分類,如果請求靜態資源,Nginx會檢索靜態資源,并直接返回,如果是請求動態資源,會交給應用服務器.當然這其中會有請求緩沖,負載均衡等步驟.
- 實現了wsgi網管接口的應用服務器接收到http請求后,利用Werkzeng等網絡編程工具實現的python程序(flask框架等)會根據request內容生成Response并返回給Nginx
- Nginx緩沖Response,并將其返回給瀏覽器
- 瀏覽器解析Response,最終將組織好的內容呈獻給用戶
問題五: 我作為 Python web 工程師的主要工作
- 利用web框架實現具體的業務,即上文中拿到一個Request解析,生成Response
- Nginx 和 應用服務器的配置與部署