使用 pm2(非集群模式)在系统启动时重新启动 socketio

Restart socketio on system boot using pm2 (Not Cluster mode)

我正在开发一个 express.js 应用程序,但我不会 运行 使用 pm2 -i 选项在集群模式下将其安装,因为我只有一个 CPU。 我以前在一些应用程序中使用过 pm2 在启动时启动 express.js 服务器并在其进程被终止时重新启动它。

我想知道两件事:

1。我想 运行 一个 express.js 服务器和一个 socket.io 服务器,两者都在同一个端口 (4000) 上侦听,正如它在 documentation 中所说的那样。 socket.io 服务器是否也会在系统启动时启动,并在其进程被终止时启动?

$ pm2 开始 app.js

//app.js
const app = require('express')();
const server = require('http').createServer(app);
const io = require('socket.io')(server);
io.on('connection', () => { /* … */ });
server.listen(4000);

2。由于 here says "Be sure your application is stateless meaning that no local data is stored in the process, for example sessions/websocket connections, session-memory and related" and here 表示长轮询(被 socket.io 用作后备)需要一些状态。我想这个问题只有在集群模式下使用 pm2 时才会出现,但我想请任何有经验的人来确认一下。

  1. 因为您将 socket.io 实例附加到您的服务器对象,所以它们都可以在同一端口上访问,并且都将在服务器启动时启动。我的套接字连接设置方式相同,我也在使用 PM2。要在机器启动时启动服务器,您需要告诉 PM2 这样做。检查此 link:https://pm2.keymetrics.io/docs/usage/startup/
const server = require('http').createServer(app)

global.io = require('socket.io')(server, { transports: [ 'websocket' ]})
  1. 如果将会话存储在本地内存中,您将遇到会话问题。我在会话中使用 connect-mongo 和 passport-socketio,因为我在我的架构中使用 MongoDB 和 passport。这会将所有会话保存在我的数据库中,并创建一个存储它们的“会话”集合,并防止它们在我出于任何原因部署或重新启动服务器时被破坏。如果您只将会话数据存储在内存中,它将在服务器重新启动时被擦除。
const mongoose = require('mongoose')
const passportSocketIo = require('passport.socketio')
const session = require('express-session')
const cookieParser = require('cookie-parser')
const MongoStore = require('connect-mongo')(session)

const sessionStore = new MongoStore({ mongooseConnection: mongoose.connection })

const expressSession = session({
    resave: true, saveUninitialized: true, secret: process.env.passportSecret, cookie: { maxAge: 36000000 }, store: sessionStore, key: 'connect.sid'
})

app.use(expressSession)

io.use(passportSocketIo.authorize({
  key: 'connect.sid',
  secret: process.env.passportSecret,
  store: sessionStore,
  cookieParser: cookieParser
}))
   .on('connection', async (socket) => {
})

将此设置与 PM2 一起使用,我还没有发现 socket.io 在常规模式下有任何问题。对于集群模式,您只需要设置 Redis 服务器。对于 Ubuntu,请遵循以下步骤:https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04

npm i socket.io-redis
const redisAdapter = require('socket.io-redis')

global.io = require('socket.io')(server, { transports: [ 'websocket' ]})

io.adapter(redisAdapter({ host: 'localhost', port: 6379 }))

这是 npm 包:https://www.npmjs.com/package/socket.io-redis

让我的套接字在集群模式下工作就是这么简单。