為什麼將 Nginx 設置為反向代理是個好主意?
我有一個在 Gunicorn 上執行的 Django 站點,它通過 Nginx 使用反向代理。Nginx 不只是額外的不必要的成本嗎?在 Gunicorn 之上添加它有什麼幫助?
我將專注於緩慢的客戶端行為,以及您的配置如何處理它,但不要試圖相信這是唯一的好處。有利於慢速客戶端的相同方法也有利於快速客戶端、SSL 處理、處理流量激增以及在 Internet 上提供 HTTP 服務的其他方面。
Gunicorn 是預分叉軟體。對於低延遲通信,例如負載均衡器到應用伺服器或服務之間的通信,預分叉系統可能非常成功。啟動一個程序來處理請求是沒有成本的,一個程序可以專門處理一個請求;消除這些東西可以使系統整體更快、更高效,直到同時連接的數量超過處理它們的可用程序的數量。
在您的情況下,您正在通過 Internet 處理高延遲客戶端。這些慢客戶端可以佔用相同的程序。當 QPS 很重要時,應用程式碼需要盡快接收、處理和解決請求,以便它可以繼續處理另一個請求。當慢速客戶端直接與您的系統通信時,它們會佔用該程序並減慢它的速度。該程序現在還必須等待慢速客戶端,而不是盡快處理和處理請求。有效 QPS 下降。
以很少的 cpu 和記憶體成本處理大量連接是像 Nginx 這樣的非同步伺服器所擅長的。它們不會受到慢客戶端的負面影響,因為它們擅長同時處理大量客戶端。在 Nginx 的例子中,在現代硬體上執行它可以同時處理數万個連接。
預分叉伺服器前的 Nginx 是一個很好的組合。Nginx 處理與客戶端的通信,並且不會因處理慢速客戶端而受到懲罰。它盡可能快地向後端發送請求,因為後端可以處理這些請求,從而使後端盡可能高效地使用伺服器資源。後端在計算後立即返回結果,Nginx 會緩衝該響應,以按照自己的節奏將其提供給速度較慢的客戶端。同時,即使慢速客戶端仍在接收結果,後端也可以繼續處理另一個請求。