先理解下長連接和短鏈接
短連接:
?? ?短連接就是每次請求一個資源就建立連接掸鹅,請求完成后連接立馬關(guān)閉来庭。每次請求都經(jīng)過“創(chuàng)建tcp連接->請求資源->響應(yīng)資源->釋放連接”這樣的過程
長連接:
?? ?長連接(persistent connection)日月,就是只建立一次連接应狱,多次資源請求都復(fù)用該連接坝初,完成后關(guān)閉凡伊。要請求一個頁面上的十張圖,只需要建立一次tcp連接擦盾,然后依次請求十張圖嘲驾,等待資源響應(yīng)淌哟,釋放連接。
client發(fā)出的HTTP請求頭需要增加connection:keep-Alive字段辽故。
web-service端需要能識別到connection:keep-alice字段徒仓,并且在http的response里指定connection:keep-Alive字段,告訴client我們提供keep-alive服務(wù)誊垢,允許client暫時別關(guān)閉socket鏈接掉弛。
http 1.0版本中要實現(xiàn)長連接必須在http請求頭顯示指定Connection:keep-alive
http 1.1版本中默認開始了keep-alive。 需要關(guān)閉keep-vlive的話在請求頭指定connection:close
現(xiàn)在大多數(shù)瀏覽器都支持HTTP 1.1協(xié)議喂走,所以keep-alive都是默認打開的殃饿,一旦client和server達成一致長連接就建立好了。
以NGINX 為例:
keepalive_timeout #一個HTTP產(chǎn)生的TCP鏈接在傳送完最后一個響應(yīng)后還需要等待 keepalive_timeout 設(shè)置的秒后才關(guān)閉這個鏈接芋肠。默認是75秒,有些瀏覽器默認是60秒乎芳,所以可以設(shè)置為60,如果設(shè)置成0的話就關(guān)閉了keep-aliveNGINX做反向代理的時候upstream長連接配置:
http{
? ? upstream test_keepalive{
? ? server 127.0.0.1:5002;
? ? keepalive 4;?#最多保留的長連接帖池,如果超過這個數(shù)奈惑,會根據(jù)LRU算法關(guān)閉多余的鏈接。這個參數(shù)不會限制worker跟upstream的連接數(shù)睡汹。
}
?? ?keepalive_timeout 60; #設(shè)置鏈接保持的時間
?? ?keepalive_requests 100; ?#每個長連接能處理的請求次數(shù)肴甸,超過后會被close。定期關(guān)閉對清理每個鏈接占用的內(nèi)存是非常有必要的囚巴。否則鏈接只能用的內(nèi)存會越來越多原在。
location {
? ? ?proxy_http_version 1.1; ? #location配置里主要是修改HTTP版本為1.1、并且把NGINX的默認傳遞給upstream connection:close 的行為去掉文兢。http_version需要制定用1.1?
? ? ?proxy_set_header connection "";# 這樣就嫩完成NGINX轉(zhuǎn)發(fā)給upstream的長連接配置。
}
}