如何将 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 反向代理

如何在 CentOS 7 用 cPanel 配置 Nginx 反向代理

apache 配置反向代理 设置

如何将多个套接字后端应用程序连接到单个前端

Nginx 为 apache 提供静态内容和代理