正常关机

    但在重启时,用户可能面临两个问题:

    • 一段停机时间,服务器返回到“503服务不可用”响应
    • 一个失败请求,如果重启时请求正在进行
      使用PM2群集模式和重载操作可以避免停机时间段

    正常关机并重启可以避免失败请求。 本教程将向您介绍如何实现它。

    在一次正常关机时,您的应用必须经过5个步骤:

    • 收到通知停止
    • 要求负载均衡器停止接收请求
    • 完成所有正在进行的请求
    • 释放所有资源(数据库,队列…)
    • 退出
      假设我们有以下express应用:

    我们首先需要拦截 SIGINT信号(由 发出):

    1. const app = express()
    2. const port = process.env.port || 8000
    3. app.get('/', (req, res) => { res.end('Hello world') })
    4. const server = require('http').createServer(app)
    5. server.listen(port, () => {
    6. console.log('Express server listening on port ' + server.address().port)
    7. })
    8. process.on('SIGINT', () => {
    9. console.info('SIGINT signal received.')
    10. })

    然后,我们要求HTTP服务器停止接收请求并完成正在进行的请求:

    1. const app = express()
    2. const port = process.env.port || 8000
    3. const server = require('http').createServer(app)
    4. server.listen(port, () => {
    5. console.log('Express server listening on port ' + server.address().port)
    6. })
    7. process.on('SIGINT', () => {
    8. console.info('SIGINT signal received.')
    9. // Stops the server from accepting new connections and finishes existing connections.
    10. server.close(function(err) {
    11. if (err) {
    12. console.error(err)
    13. process.exit(1)
    14. }
    15. })
    16. })

    默认情况下,如果应用不自行退出,PM2在发送SIGKILL信号之前会等待1600毫秒。

    您可以在您的ecos.config.js中以毫秒为单位更改此值:

    1. module.exports = {
    2. apps: [{
    3. name: "app",
    4. script: "./app.js",
    5. kill_timeout: 1600,
    6. }]
    7. }

    当信号不可用时,您的进程将被终止。 在这种情况下,您需要遵从 shutdown事件:

    1. process.on('message', (msg) => {
    2. if (msg == 'shutdown') {
    3. console.log('Closing all connections...')
    4. setTimeout(() => {
    5. process.exit(0)
    6. }, 1500)
    7. }
    8. })

    在提供HTTP请求之前,您的应用通常需要连接到您的数据库或其他资源。

    您的应用需经过这3个步骤来避免错误:

    • 打开数据库连接
    • 开始请求一个端口
    • 通知PM2应用已准备就绪
      首先,在您的ecos.config.js中启用PM2中的 信号:

    让我们继续使用之前的express app:

    1. const app = express()
    2. const port = process.env.port || 8000
    3. app.get('/', (req, res) => { res.end('Hello world') })
    4. server.listen(port, () => {
    5. console.log('Express server listening on port ' + server.address().port)
    6. })
    7. ...

    首先,等待数据库连接准备就绪:

    1. const app = express()
    2. const port = process.env.port || 8000
    3. app.get('/', (req, res) => { res.end('Hello world') })
    4. const server = require('http').createServer(app)
    5. mongoose.connect('mongodb://mongosA:27501,mongosB:27501', (err) => {
    6. server.listen(port, () => {
    7. console.log('Express server listening on port ' + server.address().port)
    8. })
    9. })
    10. ...

    最后,使用 process.send('ready')通知PM2应用已准备好:

    在群集模式下,有一个默认系统,可在应用接受连接时设置每个群集。 还有一个超时时间,默认为3000毫秒,您可以使用生态系统文件中的属性进行设置。