1.http長連接相關知識
http長連接對我們來說并不陌生,但長連接并不是永遠不會關閉。對于HTTP長連接需要注意下面幾點:keepalive_timeout指的是web服務器發送完最后一個響應報文后,開始計時,如果在keepalive_timeout指定的時間內還沒有收到該連接上的下次請求,則關閉該連接。
http長連接的keepalive_time和tcp連接的keepalive_timeout不同。
http keep-alive與tcp keep-alive,意圖不一樣。http keep-alive是為了讓tcp活得更久一點,以?便在同一個連接上傳送多個http,提高socket的效率。而tcp keep-alive是TCP的一種檢測TCP連接狀況的保鮮機制。tcp keep-alive保鮮定時器,支持三個系統內核配置參數:echo?1800?>?/proc/sys/net/ipv4/tcp_keepalive_time
echo?15?>?/proc/sys/net/ipv4/tcp_keepalive_intvl
echo?5?>?/proc/sys/net/ipv4/tcp_keepalive_probes
keepalive是TCP保鮮定時器,當網絡兩端建立了TCP連接之后,閑置idle(雙方沒有任何數據流發送往來)了tcp_keepalive_time后,服務器內核就會嘗試向客戶端發送偵測包,來判斷TCP連接狀況(有可能客戶端崩潰、強制關閉了應用、主機不可達等等)。如果沒有收到對方的回答(ack包),則會在 tcp_keepalive_intvl后再次嘗試發送偵測包,直到收到對對方的ack,如果一直沒有收到對方的ack,一共會嘗試 tcp_keepalive_probes次,每次的間隔時間在這里分別是15s, 30s, 45s, 60s, 75s。如果嘗試tcp_keepalive_probes,依然沒有收到對方的ack包,則會丟棄該TCP連接。TCP連接默認閑置時間是2小時,一般設置為30分鐘足夠了。
3.除了內存有關tcpkeepalive的設置外,針對每個tcp連接,也有3個對應的參數,通過setsockopt系統調用針對單獨的socket進行設置:TCPKEEPCNT:?覆蓋?tcpkeepaliveprobes
TCPKEEPIDLE:?覆蓋?tcpkeepalivetime
TCPKEEPINTVL:?覆蓋?tcpkeepalive_intvl
2.常見的java web容器http長連接設置tomcat
2.nginx
nginx 使用指令keepalive_timeout [time]來設置http長連接keepalive_timeout的值,可以在三個地方進行設置,http上下文,server上下文,location上下文。
3.apache
KeepAlive On
KeepAliveTimeout 15