NodeJS(快速)服务器定期重启

NodeJS (express) server restarts periodically

我有一个托管在 DigitalOcean 上的简单 NodeJS 应用程序。 由于某种我找不到的原因,该应用程序几乎每天都停止运行。 它发生的时间也非常准确,大约 08:30 上午。

我检查过 DigitalOcean 主机没有重新启动。 它的正常运行时间是几周。我添加了一些未捕获的异常处理程序,希望有一些东西会导致应用程序崩溃但没有记录任何内容:

process.on('uncaughtException', function (err) {
    console.error((new Date).toUTCString() + ' uncaughtException:', err.message);
    console.error(err.stack);
    process.exit(1);
});

服务器由 UptimeRobot 持续监控,直到 "crash" 我可以在日志中看到它工作正常并且最后记录的请求是由 UptimeRobot 发送的请求。

我有另一台用于不同环境的服务器,其配置几乎相同,但更糟糕的是,它一天大约宕机 3 次。

以上看起来与服务器工作负载根本无关。一天重启3次的那个是用来做一些功能检查的,所以几乎不用。

现在我卡住了。我不知道如何处理这个问题。

您可以在下面找到我用来启动服务器的脚本:

#!/bin/sh
set -e

### BEGIN INIT INFO
# Provides:          myapp-server
# Required-Start:    $remote_fs $syslog $network
# Required-Stop:     $remote_fs $syslog $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: MyApp backend server
### END INIT INFO

[ -f /etc/default/myapp-server ] && . /etc/default/myapp-server

user="myapp"
dir="/home/$user/web-server/repository/backend"
cmd="node app.js"

name="myapp-server"
pid_file="/var/run/$name.pid"
stdout_log="/var/log/$name.log"
stderr_log="/var/log/$name.err"

get_pid() {
    cat "$pid_file"
}

is_running() {
    [ -f "$pid_file" ] && ps `get_pid` > /dev/null 2>&1
}

case "" in
    start)
    if is_running; then
        echo "Already started"
    else
        echo "Starting $name"
        cd "$dir"
        #sudo -E -u "$user" $cmd >> "$stdout_log" 2>> "$stderr_log" &
        $cmd >> "$stdout_log" 2>> "$stderr_log" &
        echo $! > "$pid_file"
        if ! is_running; then
            echo "Unable to start, see $stdout_log and $stderr_log"
            exit 1
        fi
    fi
    ;;
    stop)
    if is_running; then
        echo -n "Stopping $name.."
        kill `get_pid`
        for i in {1..10}
        do
            if ! is_running; then
                break
            fi

            echo -n "."
            sleep 1
        done
        echo

        if is_running; then
            echo "Not stopped; may still be shutting down or shutdown may have   failed"
            exit 1
        else
            echo "Stopped"
            if [ -f "$pid_file" ]; then
                rm "$pid_file"
            fi
        fi
    else
        echo "Not running"
    fi
    ;;
    restart)
    [=11=] stop
    if is_running; then
        echo "Unable to stop, will not attempt to start"
        exit 1
    fi
    [=11=] start
    ;;
    status)
    if is_running; then
        echo "Running"
    else
        echo "Stopped"
        exit 1
    fi
    ;;
    *)
    echo "Usage: [=11=] {start|stop|restart|status}"
    exit 1
    ;;
esac

exit 0

这是我的包裹清单:

{
  "name": "MyApp",
  "version": "0.0.1",
  "description": "Sample description",
  "author": "Me",
  "private": true,
  "scripts": {
    "start": "node app.js"
  },
  "engines": {
    "node": "0.10.33",
    "npm": "1.4.28"
  },
  "dependencies": {
    "bluebird": "^2.9.8",
    "bookshelf": "^0.7.9",
    "cors": "^2.7.1",
    "express": "3.4.8",
    "jade": "*",
    "knex": "^0.7.3",
    "libphonenumber": "0.0.9",
    "node-uuid": "^1.4.3",
    "node.extend": "^1.1.3",
    "nodemailer": "^1.3.4",
    "pg": "^4.2.0",
    "request": "^2.53.0",
    "ssl-root-cas": "^1.1.7",
    "xmlbuilder": "^2.6.1",
    "xoauth2": "^1.0.0"
  }
}

更新:使用 PM2 部署

我已经用 PM2 部署了应用程序,但从日志中没有得到更多信息。 服务器崩溃之前的示例:

HEAD / 302 5ms - 112b
HEAD / 302 3ms - 112b
HEAD / 302 5ms - 112b
HEAD / 302 2ms - 112b
HEAD / 302 12ms - 112b
HEAD / 302 3ms - 112b
GET /tmUnblock.cgi 400 1286ms - 1.14kb
GET / 302 9ms - 62b
HEAD / 302 6ms - 112b
HEAD / 302 11ms - 112b
Environment: development
Express server listening on port 3001
HEAD / 302 20ms - 112b
HEAD / 302 10ms - 112b
HEAD / 302 10ms - 112b
HEAD / 302 2ms - 112b
HEAD / 302 3ms - 112b
HEAD / 302 2ms - 112b
HEAD / 302 7ms - 112b
HEAD / 302 2ms - 112b

没什么可疑的,只是通过缺少 tmUnblock.cgi 安全漏洞进行的尝试。

你的 运行 RAM 是哪种 VPS?服务器上还有哪些其他进程 运行。我遇到了 Node(不相关)的问题,它会随机停止工作而没有日志记录。问题原来是内存使用。我建议使用

检查您的内存使用情况
free -m

另外,如果是这种情况,我会确保您启用了交换以缓解内存问题。本教程将指导您创建交换 https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04 假设您 Ubuntu。 google 搜索如何使用 DO 创建交换提供了大量结果

希望对您有所帮助