我有一个http://example.com:5000/上运行的Web应用程序
网站尝试建立与该服务器的socket.io连接,以交换一些时间紧迫的数据(多人游戏)。
到目前为止一切正常...
现在,我正在尝试将整个产品准备就绪,因此我想在一个更好的URL上提供它:https://myapp.example.com/
为此,我将Apache服务器配置如下:
ProxyPass / http://0.0.0.0:5000/
ProxyPassReverse / http://0.0.0.0:5000/
乍一看一切似乎都可以正常工作-但socket.io无法再从轮询切换到websocket。
Javascript控制台显示此错误:
socket.io.js:8 WebSocket connection to 'wss://myadpp.example.com/socket.io/?EIO=3&transport=websocket&sid=0bef58d5622f4d20b4c1d7f29c97a21d' failed: Error during WebSocket handshake: Unexpected response code: 200
这似乎是一种非常常见的设置-将基于socket.io的webapp隐藏在apache代理后面-但我无法在线找到任何有效的解决方案。
似乎apache不能代理ws://连接,但是我不知道该怎么办。
在这里找到解决方案: WebSockets and Apache proxy : how to configure mod_proxy_wstunnel?
答案 0 :(得分:0)
尝试加载mod_proxy_wstunnel模块: https://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html
编辑:
对于第二个问题,请尝试以下操作:
RewriteCond %{REQUEST_URI} ^/socket.io [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /(.*) ws://0.0.0.0:5000/$1 [P,L]
RewriteCond %{QUERY_STRING} transport=polling [NC]
RewriteRule /(.*) http://0.0.0.0:5000/$1 [P,L]
ProxyPass / http://0.0.0.0:5000/
ProxyPassReverse / http://0.0.0.0:5000/