WebSocket 服务器能否与 HTTP Apache 服务器共存于同一公共端口(80),但本地地址不同?

Posted

技术标签:

【中文标题】WebSocket 服务器能否与 HTTP Apache 服务器共存于同一公共端口(80),但本地地址不同?【英文标题】:Can a WebSocket server coexist with a HTTP Apache server in the same public port (80), but locally in different address? 【发布时间】:2020-02-26 17:31:24 【问题描述】:

首先,我在 Windows 中有一个带有 Apache 2.4 的 HTTP 服务器,可以在一个简单的网站上完美运行, 所以我将外部端口 80 转发到路由器中 Windows 机器的本地端口 80。

我想在我的 Raspberry PI 上运行一个 WebSocket 服务器来用 python 做一些疯狂的事情,我试图将外部端口 80 也转发到 Raspberry 的本地端口 80。 我尝试使用网站中的 JS 脚本连接到在我的 Raspberry 上运行的 python WebSocket 服务器,它显示:net::ERR_CONNECTION_REFUSED。

然后我注意到我的 Apache 服务器中的简单网站没有正确加载(非常缓慢),大多数时候它根本没有加载它,chrome 说:连接被拒绝。然后我撤消了 Raspberry 端口规则,然后它就可以正常加载了。

那么,这两个协议不能共存吗(可能是)?还是只是端口转发的问题?

提前感谢您的宝贵时间

【问题讨论】:

【参考方案1】:

这是路由的限制。当您在路由器中使用端口转发时,它发生在 OSI model 的传输层 (4) 上。这里的套接字由 3 个东西定义:协议、地址、端口。在这种情况下是tcp:<Your-IP-Address>:80。您只能将其转发到一个位置。 HTTP 和 WebSocket 协议位于较高层,对路由器不可见,它们仅作为数据传递。

您需要为其中一个使用不同的端口号,或者使用反向代理服务器,例如 HAProxy 或 nginx,它们可以相应地处理更高级别的协议和路由器。

【讨论】:

以上是关于WebSocket 服务器能否与 HTTP Apache 服务器共存于同一公共端口(80),但本地地址不同?的主要内容,如果未能解决你的问题,请参考以下文章

(5)WebSocket 与 HTTP

Azure 服务总线 http 与 websocket

WebSocket协议与抓包

websocket面试题

如何将 websocket 请求从 Apache httpd 转发到 Apache Tomcat?

使用相同的处理程序去处理 websockets 和 HTTP