http {
keepalive_timeout 60s; --長連接timeout keepalive_requests 8192; --每個連接最大請求數
upstream servers {
server 127.0.0.1:7985 ;
server 127.0.0.1:7986 ;
keepalive 10;
}
server {
listen 7995;
server_name 127.0.0.1;
location / {
proxy_pass http://servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
}
}
events { worker_connections 102400; }
轉:http://bert82503.iteye.com/blog/2152613
先說說服務為什么使用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值一樣) # 設置每個worker進程與后端服務器保持連接的最大數量。這些保持的連接會被放入緩存。 如果連接數大於這個值時,最久未使用的連接會被關閉。使用"最近最少使用算法(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相關的線程狀態