Nginx上游伺服器長連線配置

大雄45發表於2022-09-28
導讀 Nginx Upstream連線後端有兩種方式:短連線和長連線。Keep-Alive即俗稱的長連線,使客戶端到服務端建立的連線持續有效,當對伺服器發起後續請求時,Keep-Alive功能可以複用先前使用過的連線,減少了重新建立連線所需的開銷。通常使用HTTP協議採用的是請求應答模式,客戶端到服務端的一次請求完成了,它們之間的連線也隨之關閉。在某些應用場景下,比如後端RESTful服務,就需要保持住連線,這時就可以啟用HTTP Keep-Alive。
一、概述

Nginx Upstream連線後端有兩種方式:短連線和長連線。Keep-Alive即俗稱的長連線,使客戶端到服務端建立的連線持續有效,當對伺服器發起後續請求時,Keep-Alive功能可以複用先前使用過的連線,減少了重新建立連線所需的開銷。通常使用HTTP協議採用的是請求應答模式,客戶端到服務端的一次請求完成了,它們之間的連線也隨之關閉。在某些應用場景下,比如後端RESTful服務,就需要保持住連線,這時就可以啟用HTTP Keep-Alive。
nginx 通常情況下都是用來當作一個反向代理,通常一個請求都需要經過 client -> nginx -> backend_server 這麼幾成關係。通常情況下 client -> nginx 使用的 HTTP 1.1 或者 2.0 的協議,keep-alive 複用了 TCP 的連線,減少了 TCP 頻發建立和銷燬帶來的效能損失。但是預設情況下,nginx -> backend_server 是 HTTP 1.0 的協議,並沒有複用 TCP 的連線。
Nginx上游伺服器長連線配置Nginx上游伺服器長連線配置

對發往上游請求當中要加上http頭部圖片裡面的兩條指令proxy_http_version和proxy_set_header,因為http 1.0協議是不支援keepalive長連線的,為了防止使用者發來的是http 1.0協議我們需要重置http_version為1.1,這樣一直可以使用keepalive長連線。其次為了防止使用者connection頭部給我們傳入的是closed而不是keepalived,我們需要主動設定向上遊發的Connection值為Connection ""。

二、配置
1、語法
功能:透過複用連線,降低Nginx與上游伺服器建立,關閉連線的消耗,提升吞吐量的同時降低時間延遲.
模組:ngx_http_upstream_keepalive_module是預設編入到Nginx中的,如果不想編進去可以用
      --without-http_upstream_keepalive_module對這個模組進行移除.
(/home/muten/module/nginx-1.13.7中執行./configure --help |more 搜尋http_upstream_keepalive_module可驗證)
關於upstream_keepalive的指令:
(1)keepalive
Activates the cache for connections to upstream servers.
The connections parameter sets the maximum number of idle keepalive connections to 
upstream servers that are preserved in the cache of each worker process. When this 
number is exceeded, the least recently used connections are closed.
表示上游伺服器中最多保持多少個用於keepalive請求的空閒的連線.
這個命令會促使上游伺服器中每個worker程式中開闢出來一塊快取用於keepalive連線,
當超過這個數字的時候,將會利用LRU演算法將一些連線關閉.
因為http1.0協議是不支援長連線的,為了防止使用者發來的是http1.0,我們需要重置http版本,將其置成1.1,這樣就可以一直使用keep_alive長連線;
為了防止使用者的Connection頭部給我們傳遞的是Close而不是Keepalive,我們主動設定向上遊傳送的connection.
When using load balancing methods other than the default round-robin method, it is necessary to activate them 
before the keepalive directive.
當使用的負載均衡方法不是預設的輪詢演算法時,需要在keepalive指令之前啟用他們
語法:
Syntax: keepalive connections;
Default:    —
Context:    upstream
This directive appeared in version 1.1.4.
Syntax: proxy_http_version 1.0 | 1.1;
Default:    
proxy_http_version 1.0;
Context:    http, server, location
This directive appeared in version 1.1.4.
Syntax: proxy_set_header field value;
Default:    
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Context:    http, server, location
對上游連線的http頭部設定:
proxy_http_version 1.1;
proxy_set_header Connection "";
配置
upstream http_backend {
    server 127.0.0.1:8080;
    keepalive 16;
    keepalive_timeout 60s;
}
server {
    ...
    location /http/ {
        proxy_pass 
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        ...
    }
}
2、實現原理

nginx upstream keepalive長連線的實現原理。首先每個程式需要一個connection pool,裡面都是長連線,多程式之間是不需要共享這個連線池的。 一旦與後端伺服器建立連線,則在當前請求連線結束之後不會立即關閉連線,而是把用完的連線儲存在一個keepalive connection pool裡面,以後每次需要建立向後連線的時候,只需要從這個連線池裡面找,如果找到合適的連線的話,就可以直接來用這個連線,不需要重新建立socket或者發起connect()。這樣既省下建立連線時在握手的時間消耗,又可以避免TCP連線的slowstart。如果在keepalive連線池找不到合適的連線,那就按照原來的步驟重新建立連線。
如果你的連線池的數控制在128,總共執行緒池內的執行緒數是128 * nginx worker ,但因為你要應對更多的併發請求,所以臨時又加了很多的連線,但這臨時的連線是短連線和長連線要看你的nginx版本,1.8是長連線,那他如何被收回,兩點保證,一點是他會主動去釋放,另一點是keepalive timeout的時間

原文來自:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2916650/,如需轉載,請註明出處,否則將追究法律責任。

相關文章