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相關的線程狀態