Apache 配置 WebSocket 協議


本文使用 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")

以上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM