Apache 配置 WebSocket 协议

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

以上。

相关文章
相关标签/搜索