在同一台服务器上运行 websocket 服务器和 http 服务器

在同一台服务器上运行 websocket 服务器和 http 服务器

我使用 nginx 来为 PHP 应用程序实例提供服务,同时还运行 Ratchet 应用程序来监听 websocket 连接。问题是,这两个实例都使用同一个端口 (80)。

我该如何设置服务器才能同时为两者提供服务?

编辑:刚回来看到这个问题已经被否决了好几次,可以理解的是,我并没有真正清楚地提出这个问题。我为此道歉。不过我确实尽职尽责。我会试着澄清我问的问题,我可能误解了 websocket 协议的某些方面,在这种情况下,请纠正我:

我很清楚只能有一个进程监听特定端口,我实际上在理解整个 websocket 时遇到了一些问题,据我了解,websocket 请求以 HTTP 握手开始,之后会有机制将该会话“升级”到特定端口。

从我读到的内容来看,这个升级机制似乎是由 Web 服务器处理的。那么,我该如何配置 nginx 来处理这个过程呢?

总而言之,我担心在 80 以外的端口上运行 websocket 服务器时,端口可能会被阻止。这种担心是没有根据的吗?有什么建议可以告诉我应该如何设置吗?

答案1

这个问题写得很糟糕,但我正在寻找的术语是反向代理。

基本上,就像 nginx 可以根据路径或主机名将不同的请求转发到 Web 应用程序的多个实例一样,它也可以配置为将请求“转发”到 websocket 服务器实例。例如:

location /socket {
    proxy_pass http://websocket;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

upstream websocket{
    server localhost:8000;
}

map $http_upgrade $connection_upgrade {
    default Upgrade;
    '' close;
}

HTTP 请求http://hostname将提供通常的 html 页面,而 websocket 连接将wss://hostname/socket被转发到同一服务器上监听端口 8000 的 websocket 实例。

答案2

一台服务器不能有两个不同的软件监听同一个端口/IP 地址。否则,如果多个应用程序可以绑定到同一个端口,流量将如何路由到应用程序 XYZ?

您可以从以下网站了解有关端口的更多信息端口(计算机网络)

您需要执行以下任一操作:

  1. 对两个应用程序之一使用不同的端口,并允许其通过防火墙。
  2. 使用两个不同的 IP 地址 - 并将每个应用程序绑定到其各自的 IP 地址。

您的防火墙只需根据您的设置进行配置即可。

答案3

您有两个选择:

  1. 绑定一个到不同的端口(例如 8000)
  2. (如果可能)向服务器添加额外的 IP 地址,并将 Web 服务器和 WebSocket 服务器绑定到不同的 IP

相关内容