本文使用 http proxy 方式 實現 apache 支持 WebSocket 請求(JK 使用的 ajp 協議不能支持websocket)
通過 apache 訪問 后端 tomcat上的 websocket 服務,需要使用 mod_proxy.so 和 mod_proxy_wstunnel.so兩個庫文件(在apache2.4 安裝目錄下已存在,放開httpd.conf文件中的注釋即可使用),如果應用中需要通過http協議訪問某些頁面(如index頁面)則需要添加使用 mod_proxy_http.so,如下:
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) (可選)
我的應用中配置的 websocket服務都在 web/websocket/ 下面,所以配置了映射,對於其它所有映射如 “/” 需要配置到 web/websocket/ 映射的后面,否則 web/websocket/ 的映射會被當做http協議處理。
注意: WebSocket 負載均衡 沒有 親和/非親和 概念!!!
另外一種實現方式:
前寫的即時通信部分上傳到服務器上之后,發現 WebSocket 連接不上了。
媽蛋。
於是百度了半天,看到一個方法是配置 Apache,增加 mod_python、mod_pywebsocket 擴展巴拉巴拉。
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")
以上。