NodeJS 服务器安全关闭

首先要知道, 服务器进程在退出前, 是有一定的信号的, 这个信号可以通过监听信号捕获到.

例如 process.on('SIGTERM', () => {}) 或者 process.on('SIGINT', () => {}) 信号, 但是此类信号比较多, 很难逐一研究捕获.

大部分情况下, 我们只是需要在退出进程的时候捕获信号, 我们可以使用 signal-exit 包, 比较全面的实现退出信号的捕获.

安装

1
npm i -s signal-exit

使用方法

1
2
3
4
5
6
7
8
9
10
const onExit = require('signal-exit');

onExit((code, signal) => {
console.log('process exited signal %s code %s!', signal, code);

// 持久化数据
// 关闭 mongodb/mysql/redis 链接
// 关闭 http/websocket 服务
// ...
});

例子

参考: https://hackernoon.com/graceful-shutdown-in-nodejs-2f8f59d1c357

不使用 signal-exit

1
2
3
4
5
6
7
process.on('SIGTERM', () => {
console.info('SIGTERM signal received.');
console.log('Closing http server.');
server.close(() => {
console.log('Http server closed.');
});
});

使用 signal-exit

1
2
3
4
5
6
7
8
9
10
11
12
onExit((code, signal) => {
console.log('process exited signal %s code %s!', signal, code);

server.close(() => {
console.log('Http server closed.');

// boolean means [force], see in mongoose doc
mongoose.connection.close(false, () => {
console.log('MongoDb connection closed.');
});
});
});
Donate - Support to make this site better.
捐助 - 支持我让我做得更好.