1. 程式人生 > >Nginx反向代理與後端服務采用連接池參數分析,長連接減少TIME_WAIT

Nginx反向代理與後端服務采用連接池參數分析,長連接減少TIME_WAIT

數據 模型 業務需求 技術 nginx服務器 程序 創建 反向代理 還需

前面已經講過,在使用locust直連後端服務器時,可以通過設置HTTP頭部為keep-alive,並在客戶端斷開連接,減少服務器的連接壓力。因為由客戶端斷開連接,客戶端的連接會變為TIME_WAIT狀態,從而有效的節省了服務器的資源。

但通常,我們的服務器並不是簡單的一個服務器端程序,一般還會有cache服務器,反向代理服務器,負載均衡服務器等等很多的中間部分,而這些模塊之間都是通過新的連接相連,如果頻繁的新建斷開他們之間的連接,不僅會導致服務器端出現大量TIME_WAIT連接,還會導致性能的下降(如果中間每多過一層就多新建一條連接,那麽性能肯定會急劇下降,新建一條連接的代價是相當高的)。

舉一個常見的模型

客戶端------>nginx反向代理服務器------>後端服務器

客戶端使用短連接頻繁的請求反向代理服務器,如果反向代理服務器也同樣去請求後端服務器的話,當客戶端斷開連接,nginx也斷開與後端服務器的連接,就會造成nginx所在的服務器產生大量的TIME_WAIT連接,壓力增大時很可能導致nginx服務器無法提供新的連接。

面對上面的問題,就需要調整nginx的參數。保證不論客戶端如何請求nginx服務器,nginx與後端服務器都保持一定數據量的長連接,這樣就能有效的避免連接的頻繁創建於釋放。

在upstream XXX 配置中增加keepalive配置

技術分享圖片

這意味著,nginx服務器會與後端服務器最多“保持”5000條連接的連接池,“保持”的意思是,當客戶端的請求非常多時,nginx與後端服務器會存在多余5000的連接,但是當壓力減小時,多於5000的連接會被釋放,仍然恢復到5000條連接。也就是說,如果這個值設置的非常小,當客戶端訪問壓力劇增時,仍然是會出現大量新建釋放連接的問題的,當然,也可以通過增加連接池內連接的超時時間來控制連接的有效期,不過這就需要根據業務需求反復測試調整了。

技術分享圖片

要想keepalive生效,還需要兩個必要的條件:

1、需要強制nginx與後端服務器使用1.1版本的HTTP協議,因為1.1默認是keepalive的。

2、需要將客戶端請求的Connection頭部重置掉,因為如果客戶端傳來的是close,那麽這條請求到了後端服務器那,後端服務器就會主動將連接關閉掉,nginx與服務器端的連接也就無法keepalive了。

經過這樣的調整,就能實現我們nginx與後端服務器之間使用長連接的連接池,最大限度的復用連接。

Nginx反向代理與後端服務采用連接池參數分析,長連接減少TIME_WAIT