http {
keepalive_timeout 20; --長連接配接timeout
keepalive_requests 8192; --每個連接配接最大請求數
}
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值一樣)
# 當這個數被超過時,使用"最近最少使用算法(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相關的線程狀态