本文使用 http proxy 方式 實現 apache 支持 WebSocket 請求(JK 使用的 ajp 協議不能支持websocket)html
經過 apache 訪問 後端 tomcat上的 websocket 服務,須要使用 mod_proxy.so 和 mod_proxy_wstunnel.so兩個庫文件(在apache2.4 安裝目錄下已存在,放開httpd.conf文件中的註釋便可使用),若是應用中須要經過http協議訪問某些頁面(如index頁面)則須要添加使用 mod_proxy_http.so,以下:python
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so (可選)
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
最後面添加:
ProxyPass /web/websocket/ ws://tommcatIP:8080/web/websocket/
ProxyPass / http://127.0.0.1:8080/ (可選)
個人apache端口使用的是 80,因此訪問 http://127.0.0.1:80/web/ 就出現了 index.html首頁(這次訪問不是websocket,因此須要開啓mod_proxy_http.so,若是不須要能夠關閉加載mod_proxy_http.so) (可選)
web
個人應用中配置的 websocket服務都在 web/websocket/ 下面,因此配置了映射,對於其它全部映射如 「/」 須要配置到 web/websocket/ 映射的後面,不然 web/websocket/ 的映射會被當作http協議處理。apache
注意: WebSocket 負載均衡 沒有 親和/非親和 概念!!!vim
另一種實現方式:後端
前寫的即時通訊部分上傳到服務器上以後,發現 WebSocket 鏈接不上了。tomcat
媽蛋。服務器
因而百度了半天,看到一個方法是配置 Apache,增長 mod_python、mod_pywebsocket 擴展巴拉巴拉。websocket
mod_python 在我最開始配置 Apache 支持 PHP 和 Pyhton 的時候就發現好像不太好用,因此就沒有用。負載均衡
此次簡單地嘗試了一下仍是有問題,因此就算了。
可能由於我是經過 apache 代理,將域名解析到指定端口來實現 tornado 應用的上線,而 WebSocket 在握手的時候請求直接發送到 apache。apache 代理的時候無法將 WebSocket 握手請求傳遞給 tornado 應用,結果就是握手失敗
將 html 文件裏的 ws 服務器地址修改成服務器 IP 地址,越過 apache 代理的部分,直接跟 tornado 應用握手。
就是這樣:
《xxx.html》
ws = new WebSocket("ws://xxx.xxx.xx.xxx:8008/soc")
ws = new WebSocket("ws://www.mysite.com/soc")
以上。