1. 程式人生 > >Nginx upstream 長連線

Nginx upstream 長連線

原文:

Nginx upstream目前只有短連線,通過HTTP/1.0向後端發起連線,並把請求的"Connection" header設為"close"。Nginx與前端的連線預設為長連線,一個使用者跟Nginx建立連線之後,通過這個長連線傳送多個請求。如果Nginx只是作為reverse proxy的話,可能一個使用者連線就需要多個向後端的短連線。如果後端的伺服器(源站或是快取伺服器)處理併發連線能力不強的話(比如單程序的squid),就可能導致瓶頸的出現。

Nginx目前的upstream連線建立和獲取的機制如下圖。Nginx會在一開始建立connection pool(程序間不共享,可以避免鎖),提供給所有向前/後的連線。


如果要實現upstream長連線,則每個程序需要另外一個connection pool,裡面都是長連線。一旦與後端伺服器建立連線,則在當前請求連線結束之後不會立即關閉連線,而是把用完的連線儲存在一個keepalive connection pool裡面,以後每次需要建立向後連線的時候,只需要從這個連線池裡面找,如果找到合適的連線的話,就可以直接來用這個連線,不需要重新建立socket或者發起connect()。這樣既省下建立連線時在握手的時間消耗,又可以避免TCP連線的slow start。如果在keepalive連線池找不到合適的連線,那就按照原來的步驟重新建立連線。假設連線查詢時間可以忽略不計,那麼這種方法肯定是有益而無害的(當然,需要少量額外的記憶體)。


具體如何來設計這個keepalive connection pool,不同人有不同的選擇。比如Nginx目前的第三方模組upstream keepalive(作者Maxim Dounin)使用了一個queue來做。因為upstream的伺服器很可能是多個,所以可能當保持的連線數多的時候,查詢的時間可能會較長。可以給每個upstream伺服器都分配一個pool(queue),縮短查詢時間。但是總體來說記憶體操作很快,影響不會很大。upstream keepalive模組目前只支援memcached,但是可以重用其程式碼來達到對http upstream的長連線。在upstream模組和反向代理(二)裡面highlight了一些改動的地方。由於Nginx作者之前沒有考慮upstream的長連線,所以在設計上要把http upstream keepalive模組化可能比較難,只能通過手動修改程式碼來做到。

相關推薦

Nginx upstream 連線

原文: Nginx upstream目前只有短連線,通過HTTP/1.0向後端發起連線,並把請求的"Connection" header設為"close"。Nginx與前端的連線預設為長連線,一個使用者跟Nginx建立連線之後,通過這個長連線傳送多個請求。如果Nginx只是作為reverse p

Nginx Upstream連線平滑升級

master和worker程序機制 master主程序啟動woker程序,當重新載入配置檔案時,會啟動新的worker程序。當老的woker程序不處理新的請求後,就自動退出。 平滑升級 修改upstream檔案導流 重新 載入upstream檔案

uwsig與nginx連線

nginx與客戶端預設是長連線,nginx與uwsgi的長連線需要設定keepalive和Http1.1,uwsgi與nginx的長連線需要設定http11-socket。 在設定了nginx upstream keepalive 為100的情況下。測試發現,長連線狀態下,uwsgi程序

nginx 異常連線快速斷開

最近碰到了一個問題,裝置端上掛載的nginx服務通過c版fcgi提供服務,其中的長連線API經常連線的裝置斷網後其他裝置無法連線上。初步檢視原始碼除錯日誌發現網路斷了nginx未檢測到,這時就想到給nginx新增保活檢測,配置中listen加上了,寫模組給connection

Nginx與Tomcat、Client之間請求的連線配置不一致問題分析解決

本文引自:https://blog.csdn.net/enweitech/article/details/52858612#commentBox,感謝作者的無私整理,對我大有幫助,此處記錄,已被後查。 前些天,線上出現“服務端長連線與客戶端短連線引起Nginx產生大量"TIME_WAIT"狀態的執

Nginx代理webSocket時60s自動斷開, 怎麼保持連線

利用nginx代理websocket的時候,發現客戶端和伺服器握手成功後,如果在60s時間內沒有資料互動,連線就會自動斷開,如下圖:為了保持長連線,可以採取來兩種方式.1.nginx.conf 檔案裡l

關於 Nginx 和 Tomcat 的 http 連線設定

一、為什麼要配置長連線 一個普通的請求是從按照下圖 1->2->3->4 的順序。從瀏覽器到 Nginx,再從 Nginx 到 Tomcat。Tomcat 處理完後,再返回給 Nginx,最後再從 Nginx 返回給瀏覽器。 +----

Nginx中的連線

在nginx中,對於http1.0與http1.1是支援長連線的 我們知道,http請求是基於TCP協議之上的,那麼,當客戶端在發起請求前,需要先與服務端建立TCP連線,而每一次的TCP連線是需要三次握手來確定的,如果客戶端與服務端之間網路差一點,這三次互動消費的時間會比較多,而且三次互動也

Nginx快速應用及資料庫、Websocket連線反向代理

1、下載安裝包 下載nginx:   http://nginx.org/download/nginx-1.10.3.tar.gz 下載openssl : http://www.openssl.org/source/openssl-fips-2.0.9.tar.gz 下載

Nginx反向代理支援連線

Nginx upstream與後端的連線預設為短連線,通過HTTP/1.0向後端發起連線,並把請求的"Connection" header設為"close"。Nginx與前端的連線預設為長連線,一個使用者跟Nginx建立連線之後,通過這個長連線傳送多個請求。如果Nginx

keepalived+nginx-upstream部署高可用反向代理

proxy route 服務器 宕機 127.0.0.1 trac 訪問 代理 _id 實驗拓撲 實驗要求 兩個web server提供httpd服務,ip地址分別是172.18.27.201、202,掩碼是16 兩個nginx proxy提供高可用反向代理,ip地

centos nginx upstream nextserver的寫法一例

centos nginx upstream nextserverhttp { proxy_next_upstream error timeout http_500 http_502 http_503 http_504 http_404; proxy_connect_timeout 60s; proxy_rea

nginx upstream 常用的幾種調度方式

均衡 gin 字節 默認 結果 根據 主機 upstream 指定 nginx可以根據客戶IP進行負載均衡,在upstream裏設置ip_hash,以可以對同一個C類地址段的客戶端選擇同一個後端服務器,除非那個後端服務器宕了才會換一個.C類地址:C類地址第1字節、第2字節和

Nginx upstream的5種權重分配方式分享

weight 一個 當前 共享 結果 壓力 宕機 clas 機器 Nginx負載均衡的分發方式有4種: 1.輪詢,默認采取此方式,Nginx會按照請求時間的先後順序進行輪詢分發,若某臺Web Server宕機,Nginx自動將其摘掉。 2.

Nginx Upstream模塊

com 地址 body ash one log tmp pro number upstream模塊 原文鏈接:http://nginx.org/en/docs/http/ngx_http_upstream_module.html upstream 定義一組Server去監

nginx upstream 容錯機制

soc log 2種 情況 分開 upstream erro 服務器的響應 下一個 轉自:http://saiyaren.iteye.com/blog/1914865 1. 摘要 (1) 結論 詳細描述了nginx記錄失效節點的6種狀態(time out、c

Nginx-upstream模塊

bubuko 模塊使用 模塊 png com alt http upstream ima upstream模塊使用的是輪詢算法 Nginx-upstream模塊

基礎知識概念(1):Socket 連線和短連線的概念

1.短連線 連線->傳輸資料->關閉連線     HTTP是無狀態的,瀏覽器和伺服器每進行一次HTTP操作,就建立一次連線,但任務結束後就中斷連線。短連線是指SOCKET建立連線後 ,傳送後或接收完資料後,就馬上斷開連線。 2.長連線

nginx upstream的實現

很多其他模組會呼叫該模組完成對後端伺服器的訪問 upstream模組還是一個http模組,所有它自己必須要實現一些特定的介面: 1.static ngx_command_t ngx_http_upstream_commands[] = { { ngx_string("upstream

DevExpress與連線衝突導致DevExpressAJax事件失效

最近公司要做一個長連線從伺服器推送訊息,網上找了一段程式碼       function onload() {           var isIE = !