nginx配置長鏈接

http {
  keepalive_timeout 20; --長鏈接timeout
    keepalive_requests 8192; --每一個鏈接最大請求數
}
events {
    worker_connections  102400;
}

 

 

 

轉:http://bert82503.iteye.com/blog/2152613javascript

複製代碼

先說說服務爲何使用HTTPs長鏈接技術?有以下幾個緣由:
對響應時間要求較高;
服務走的是公網,客戶端與服務端的TCP創建的三次握手和斷開的四次握手都須要40ms左右(真實數據包計算出來的),共須要80ms左右;
每一個接入方使用的IP就若干個,須要創建的請求鏈接有限。
使用長鏈接技術,能夠大幅減小TCP頻繁握手的次數,極大提升響應時間;同時,即便使用長鏈接技術,也不須要消耗不少的系統資源用來緩存sockets會話信息。
 
如下是在本身電腦上驗證三者之間的長鏈接請求,鏈接存活時間都爲5min。
【環境】
操做系統:Ubuntu 14.04 LTS
Nginx:1.6.2
Tomcat:7.0.51
JDK:1.7.0_51
Client:HttpClient 4.3.5
 
【相關配置】
1. Nginx - 反向代理
nginx.conf:
http {
    ...

    ##
    # 與Client鏈接的長鏈接配置
    ##
    # http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_requests
    # 設置經過"一個存活長鏈接"送達的最大請求數(默認是100,建議根據客戶端在"keepalive"存活時間內的總請求數來設置)
    # 當送達的請求數超過該值後,該鏈接就會被關閉。(經過設置爲5,驗證確實是這樣)
    keepalive_requests 8192;
 
    # http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout
    # 第一個參數設置"keep-alive客戶端長鏈接"將在"服務器端"繼續打開的超時時間(默認是75秒,建議根據具體業務要求來,但必需要求全部客戶端鏈接的"Keep-Alive"頭信息與該值設置的相同(這裏是5分鐘),同時與上游服務器(Tomcat)的設置是同樣的)
    # 可選的第二個參數設置「Keep-Alive: timeout=time」響應頭字段的值
    keepalive_timeout 300s 300s;
 
    ...
    include /etc/nginx/web_servers.conf;
    include /etc/nginx/proxy_params;
}

web_servers.conf:
upstream web_server {
    server 127.0.0.1:8080;

    # http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive
    # 鏈接到上游服務器的最大併發空閒keepalive長鏈接數(默認是未設置,建議與Tomcat Connector中的maxKeepAliveRequests值同樣)
    # 當這個數被超過期,使用"最近最少使用算法(LUR)"來淘汰並關閉鏈接。
    keepalive 768;
}

server {
    listen 80;
    server_name lihg.com www.lihg.com;
 
    location / {
        proxy_pass http://web_server;
 
        ##
        # 與上游服務器(Tomcat)創建keepalive長鏈接的配置,可參考上面的keepalive連接裏的"For HTTP"部分
        ##
        # http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version
        # 設置代理的HTTP協議版本(默認是1.0版本)
        # 使用keepalive鏈接的話,建議使用1.1版本。
        proxy_http_version 1.1;
        # http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header
        # 容許從新定義或追加字段到傳遞給代理服務器的請求頭信息(默認是close)
        proxy_set_header Connection "";
 
        proxy_redirect off;
    }
}
 
[參考]
nginx反向代理配置keepalive
keepalive for HTTP - Module ngx_http_core_module
 
2. Tomcat
conf/server.xml:
    <!-- 
        maxThreads:由此鏈接器建立的最大請求處理線程數,這決定可同時處理的最大併發請求數(默認爲200)
        minSpareThreads:保持運行狀態的最小線程數(默認爲10)
        acceptCount:接收傳入的鏈接請求的最大隊列長度(默認隊列長度爲100)
        
        connectionTimeout:在接收一條鏈接以後,鏈接器將會等待請求URI行的毫秒數(默認爲60000,60秒)
        maxConnections:在任何給定的時間,服務器能接收和處理的最大鏈接數(NIO的默認值爲10000)
        keepAliveTimeout:在關閉這條鏈接以前,鏈接器將等待另外一個HTTP請求的毫秒數(默認使用connectionTimeout屬性值)
        maxKeepAliveRequests:在該鏈接被服務器關閉以前,可被流水線化的最大HTTP請求數(默認爲100)
        
        enableLookups:啓用DNS查詢(默認是DNS查詢被禁用)
        compression:鏈接器是否啓用HTTP/1.1 GZIP壓縮,爲了節省服務器帶寬
        compressionMinSize:指定輸出響應數據的最小大小(默認爲2048,2KB)
        compressableMimeType:可以使用HTTP壓縮的文件類型
        server:覆蓋HTTP響應的Server頭信息
     -->
    <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="768"
               minSpareThreads="512"
               acceptCount="128"
               
               connectionTimeout="1000"
               maxConnections="1024"
               keepAliveTimeout="300000"
               maxKeepAliveRequests="768"
               
               enableLookups="false"
               URIEncoding="utf-8"
               redirectPort="8443"
               compression="on" compressionMinSize="1024" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,application/json,application/xml"
               server="webserver" />
 [參考]
The HTTP Connector - Tomcat 7 Configuration Reference
 
3. Client
客戶端HTTP "Keep-Alive"實現代碼,請打開下一行的連接。
KeepAliveHttpClientsTest -> httpclient-x
 
【結果驗證】
使用 "sudo netstat -antp | grep 80" 監控與Nginx相關的線程狀態
相關文章
相關標籤/搜索