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

10

我一直在编写使用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个回答

21
使用相同的端口同时作为WebSocket和Express服务器,是安全/健康的惯例。这是正常且预期的情况,用于Express服务器和socket.io连接。所有socket.io连接始于http请求,因此socket.io只需挂接现有的Web服务器,并寻找特定类型的传入请求以打开socket.io连接并处理该特定请求。所有其他请求都由Express服务器正常处理。
WebSocket协议(socket.io使用的协议)专门设计成这样,旨在允许这样做,因为在某些环境下(例如安全性高的公司环境中),除端口80外的其他端口不能用于Web流量。这样,WebSocket就可以在端口80上运行,无需为它们创建整个新主机和DNS名称。它们可以只使用与Web服务器相同的服务器。
这种做法不会引起任何问题。在高规模环境中,可能存在缩放原因,需要将不同部分的服务器工作负载分别放置在不同的主机或不同的服务器进程上,因此将socket.io连接与常规Web请求分离到不同的主机上可能是可取的。这仍然可以通过使用像nginx这样的代理来完成,以便将不同类型的请求定向到不同的主机或不同的服务器进程。但是,在不需要此类缩放的情况下,使用相同的Web服务器承担Express和socket.io连接没有任何不利影响。

谢谢您的回答,它解决了我所有的疑问 :) - Satonamo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接