我的 ExpressJS 网站和 socket.io 端口可以使用相同的端口吗?

Posted

技术标签:

【中文标题】我的 ExpressJS 网站和 socket.io 端口可以使用相同的端口吗?【英文标题】:Can my ExpressJS website and socket.io port use the same port? 【发布时间】:2017-10-11 09:04:26 【问题描述】:

我一直在编写使用 socket.io 进行实时通信的 ExpressJS 网站,并且我总是使用相同的端口

const request = require('request')
const express = require('express')
const app = express()
const server = require('http').Server(app)
const io = require('socket.io')(server)
    server.listen(3000, () => 
  console.log(`Server started: http://localhost:3000`)
)

为 websocket 和 express 服务器使用相同的端口是否安全/健康。会不会有什么问题?

【问题讨论】:

【参考方案1】:

为 websocket 和 express 服务器使用相同的端口是否安全/健康。

这是安全的。为 Express 服务器和 socket.io 连接使用相同的端口是正常且预期的情况。无论如何,所有 socket.io 连接都以 http 请求开始,因此 socket.io 只是挂钩您现有的 Web 服务器并查找特定类型的传入请求以打开 socket.io 连接并处理该特定请求。所有其他请求都由您的 Express 服务器正常处理。

webSocket 协议(socket.io 使用的)是专门为此设计的,这样做是为了允许这样做,因为在某些环境(如安全严密的公司环境)中,端口 80 以外的端口不能用于网络流量。这样,webSockets 可以在端口 80 上运行,而无需为它们创建全新的主机和 DNS 名称。他们可以使用与您的网络服务器相同的服务器。

会不会有什么问题?

没有。

在大规模环境中,可能出于规模原因为服务器工作负载的不同部分使用单独的主机或单独的服务器进程,因此可能需要将 socket.io 连接与常规 Web 请求分开到不同主机上。这仍然可以通过使用像 nginx 这样的代理来使用相同的端口 80 来完成,该代理可以将不同类型的请求定向到不同的主机或不同的服务器进程。但是,对于不需要这种类型的扩展的情况,为 Express 和 socket.io 连接使用相同的 Web 服务器没有任何缺点。

【讨论】:

非常感谢您的回答,它消除了我所有的疑虑:)

以上是关于我的 ExpressJS 网站和 socket.io 端口可以使用相同的端口吗?的主要内容,如果未能解决你的问题,请参考以下文章

ExpressJS中的VHost访问主网站页面

使用 ExpressJS 重写 URL

如何使用基于网站的 ExpressJs 设置 CORS 和 JWT 令牌验证

无法将 nib 包含到我的 expressjs/nodejs 站点中?

如何避免从 ExpressJS 抛出 400 错误

ExpressJS 更改路由而不刷新