前言:
websocket相信經(jīng)常逛cnode社區(qū)的孩紙們都知道..具體API使用方式也再熟悉不過(guò)了..使用nodejs開(kāi)發(fā)的websocket服務(wù)端也是品種繁多..github上總有你喜歡的..平時(shí)耍耍當(dāng)然沒(méi)問(wèn)題..如果真要是承載一個(gè)生產(chǎn)環(huán)境服務(wù)的核心..總會(huì)有些問(wèn)題需要你去解決.
不可避免的問(wèn)題:
按照一個(gè)web請(qǐng)求占用線程數(shù)為參照..我們可以把nodejs稱之為單線程語(yǔ)言..而java的servlet這種應(yīng)該就是多線程語(yǔ)言了..我們可以想象在高并發(fā)情況下..單線程語(yǔ)言的運(yùn)行風(fēng)險(xiǎn)還是蠻高的..畢竟如果一個(gè)請(qǐng)求出事那么整個(gè)線程(進(jìn)程)就退出了..于是乎停止服務(wù)了..為了規(guī)避風(fēng)險(xiǎn)..我們常常會(huì)使用負(fù)載均衡技術(shù)..保證整個(gè)系統(tǒng)的對(duì)外正常服務(wù)..
解決方案:
負(fù)載均衡方案目前來(lái)講..用apache的也不多了吧..普遍的解決方案是使用nginx配置多個(gè)upstream.實(shí)現(xiàn)負(fù)載均衡..例子如下:
http{
upstream http_sr {
server 192.168.0.2:8080;
server 192.168.0.3:8080;
}
server {
listen 80 ;
proxy_pass http_sr;
}
}
這樣對(duì)于部署在192.168.0.2和3這兩臺(tái)機(jī)器上http服務(wù)..就通過(guò)這臺(tái)nginx服務(wù)器實(shí)現(xiàn)了負(fù)載均衡...但是websocket的服務(wù)端nginx的http反向代理是不能支持的.從websocket的specs我們可以很明確的其實(shí)基于tcp協(xié)議的..http協(xié)議雖然也是基于tcp..它們都使用了tcp的握手方式..但是nginx的http_proxy_pass是不能支持websocket的..
于是我們可以尋根問(wèn)主..讓nginx支持tcp_proxy_pass..那websocket負(fù)載均衡的問(wèn)題不就迎刃而解了..nginx有豐富的第三方擴(kuò)展..一頓搜索在github上找到了yaoweibin老師的nginx_tcp_proxy_module
二話不說(shuō)下載此模塊..重新編譯nginx(此過(guò)程略吧大家應(yīng)該都懂) ..修改nginx配置文件加入下面conf:
tcp {
upstream websocket {
server 192.168.0.2:8080;
server 192.168.0.3:8080;
check interval=3000 rise=2 fall=5 timeout=1000;
}
server {
listen 80;
proxy_pass websocket;
}
}
這個(gè)module的作者在description寫(xiě)到:
The motivation of writing these modules is Nginx's high performance and
robustness. At first, I developed this module just for general TCP
proxy. And now, this module is frequently used in websocket reverse
proxying.
目前基本就是用來(lái)做websocket反向代理的..測(cè)試后確實(shí)是支持的..非常感謝module的開(kāi)發(fā)者另外值得注意的是你要在nginx里同時(shí)配置tcp和http..那么它們是不能listen同一端口的..