首页 > 上网技巧 > 电脑小技巧 > apache+mod_wsgi与websocket的冲突

apache+mod_wsgi与websocket的冲突

时间:2018-04-26 09:34 作者:QQ地带 我要评论

之前在Openstack Horizon里面,嵌入了xterm + websocket后,在调试验证功能后,部署到了apache中,dashboard的访问没问题,却无法建立websocket连接。(类似的Demo已放在了Github上)
并且,在该apache服务器上,通过django的manage.py runserver调试,websocket功能依旧没有问题。
那么,问题应该是出在apache或者mod_wsgi的请求转发上。
 
启用mod_proxy_wstunnel转发websocket请求
 
翻阅apache官方文档,直接暴力搜索websocket,发现了Apache Module mod_proxy_wstunnel
用a2enmod proxy_wstunnel启用了mod_proxy_wstunnel,并且在/etc/apache2/sites-available/000-default.conf中,添加:
 
 
<VirtualHost *:80>
    .....
    ProxyPass /horizon/vnfm/xxxx_websocket ws://localhost:80/horizon/vnfm/xxxx_websocket
    .....
</VirtualHost>
重启apache服务后,连接websocket时,会停留在连接阶段,但最终还是连接失败。
 
调整websocket请求转发路径
 
继续google: ubuntu apache django websocket
 
在这篇帖子中,有人提到:
 
You can’t use web sockets through mod_wsgi in any way. WSGI servers that support web sockets rely on stepping outside of the WSGI specification and directly working with the raw socket connection from the client. That is not possible with mod_wsgi.
也就是说,在WSGI webserver下,由于websocket只是利用http/1.1 Upgrade头进行连接握手,并非正常的http下Restful API请求,所以websocket请求无法直接工作在WSGI server里面。
此外,另外一篇帖子中,有人说到:
 
I never solved this with Apache. Sadly, I moved to nginx, and it worked immediately
这样看起来,就算转发websocket请求到常规的Horizon后端,也无法正常完成websocket连接。
 
那么,在apache服务器中,单独启动websocket的django服务,修改/etc/apache2/sites-available/000-default.conf中websocket转发配置到单独的websocket服务中:
 
 
<VirtualHost *:80>
    .....
    ProxyPass /horizon/vnfm/xxxx_websocket ws://localhost:xxxx/horizon/vnfm/xxxx_websocket
    .....
</VirtualHost>
也就是调整websocket连接处理路径,示意如下图:
 
 
browser ────  apache ──── wsgi ──── Horizon
                │  
                │   # xxxx_websocket -> ws://localhost:YYYY/horizon/vnfm/xxxx_websocket
                │
                └── Django server with dwebsocket

标签: apache
顶一下
(0)
0%
踩一下
(0)
0%

Google提供的广告