如何将 Apache 配置为代理 socket.io 服务器
Posted
技术标签:
【中文标题】如何将 Apache 配置为代理 socket.io 服务器【英文标题】:How to configure Apache to proxy socket.io server 【发布时间】:2019-08-21 06:34:56 【问题描述】:我有一个在 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?
【问题讨论】:
【参考方案1】:尝试加载 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/
【讨论】:
谢谢,我激活了那个。问题的后半部分:socket.io 将 HTTP 和 WS 请求发送到同一路径“/socket.io/”-参数“transport”的唯一区别......我不知道如何使该参数成为ProxyPass 条件。 http://myapp.example.com/socket.io/?EIO=3&transport=polling&t=MdIyL-W&sid=... 应该转发到 http://0.0.0.0:5000 而 ws://bam4.omnitopos。 net/socket.io/?EIO=3&transport=websocket&sid=4912cea3deca44c6b3af3a205c61a048 应该转发到ws://0.0.0.0:5000 使用 [P] 参数创建 RewriteRule。您可以在自己放置的链接中查看示例。以上是关于如何将 Apache 配置为代理 socket.io 服务器的主要内容,如果未能解决你的问题,请参考以下文章
如何在 CentOS 7 用 cPanel 配置 Nginx 反向代理
如何在 CentOS 7 用 cPanel 配置 Nginx 反向代理