有的網站會在服務器運行一段時間后down掉,有很多原因可能造成這種現象:比如tomcat堆和非堆內存設置不足,程序沒能釋放內存空間造成內存溢出,或者某些進程一直運行沒能釋放,造成cup資源大量消耗。
但除了程序本身的原因,還有可能是客服端訪問造成(當然這個客戶端也包含如蜘蛛軟件等搜索引擎),如果服務器和客戶端建立的是長鏈接(可以用"netstat -a"命令查看網絡訪問信息),這就需要對http響應頭的connection做一定的設置。
介紹如下:
1. 解釋一下:
在http1.1中request和reponse header中都有可能出現一個connection頭字段,此header的含義是當client和server通信時對於長鏈接如何進行處理。
在http1.1中,client和server都是默認對方支持長鏈接的, 如果client使用http1.1協議,但又不希望使用長鏈接,則需要在header中指明connection的值為close;如果server方也不想支持長鏈接,則在response中也需要明確說明connection的值為close.
不論request還是response的header中包含了值為close的connection,都表明當前正在使用的tcp鏈接在請求處理完畢后會被斷掉。以后client再進行新的請求時就必須創建新的tcp鏈接了。 HTTP Connection的 close設置允許客戶端或服務器中任何一方關閉底層的連接雙方都會要求在處理請求后關閉它們的TCP連接。
2.如何在程序中設置:
可以在過濾器中加入:response.setHeader("connection", "close");
與之相關:解決服務器產生大量close_wait問題
要解決這個問題的可以修改系統的參數(/etc/sysctl.conf文件),系統默認超時時間的是7200秒,也就是2小時。
默認如下:
tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds
意思是如果某個TCP連接在idle 2個小時后,內核才發起probe.如果probe 9次(每次75秒)不成功,內核才徹底放棄,認為該連接已失效
修改后
sysctl -w net.ipv4.tcp_keepalive_time=30
sysctl -w net.ipv4.tcp_keepalive_probes=2
sysctl -w net.ipv4.tcp_keepalive_intvl=2
經過這個修改后,服務器會在短時間里回收沒有關閉的tcp連接。