之前寫的js服務器腳本,在服務器上運行的挺好的。也經過了壓力測試,單次接受4000次的連接不成問題。在5s里,可以應答1W多次的連接。對於這個連接次數,我們還是挺滿意的,但是Boss說:客戶端每2分鍾會斷開一次連接。這是不可接受的,需要對連接設置。
要保持長連接,好吧。開始,我的想法是取消2分鍾的限制,通過查閱資料 http://blog.win-ing.cn/archives/89和www.nodejs.org/api/http.html(在這里可以看到Server有2分鍾超時的說明) 在Server監聽的'request'的時候,response.setTimeout(0, function(){'寫入日志'});。
這樣取消了Node.js 2分鍾的限制。
但是長連接,領導還是不滿意。而且也說明了,使用打開服務器的keepalive。好吧,繼續查看nodejs的http文檔。開起來只有對request的連接的socket設置keepalive,才能滿足我們的條件。好吧嘗試一下,並不對。在日志里邊,可以看到捕捉的process的異常。request本身是IncomingMessage,也有socket,對他keepalive也可以嘗試一下。這次是對的。這樣開啟了服務器的Keepalive。可以看firefox里打開的網頁,5個小時以后也可以收到服務器的信息。
對於系統的keepalive機制,覺得需要在理解一下。就像是心跳包,通過檢測,回應的空數據包,檢測客戶端是否還在。tcpdump看了一下,的確有來回length為 0 的數據包在傳輸。
另外 Node.js服務器我放在了后台執行,但是經常莫名其妙的down掉了。
我今天也找到了原因。
問題還是出在我身上啊。因為js腳本有console輸出。這樣的話,運行js腳本的進程必須有一個stdout,我通過session啟動了js腳本,session就是js腳本的stdout,我關閉了session,這個js腳本進程運行到輸出的時候,就掛掉了。可以用一個linux命令nohup解決這個問題。