我使用Express.js,Node,mongoose和docker在AWS上托管测试版应用。每日活跃用户< 10,主要是我的朋友进行测试。由于某种原因,应用程序几乎每天都会停机。最初我认为这是AWS的问题,所以我停止了我的应用程序,将其从免费层更改为t2.medium并再次启动它。
它没有解决问题,我检查了docker日志中的容器。这不是由OOMKilled引起的。
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 1,
"Error": "",
"StartedAt": "2017-03-22T00:51:59.234643501Z",
"FinishedAt": "2017-03-22T07:21:41.351927073Z"
},
"Config": {
...
"AttachStdin": false,
"AttachStdout": true,
"AttachStderr": true,
...
}
我可以将docker设置为始终重启,但我想弄清楚它的根本原因是什么。有什么建议吗?
答案 0 :(得分:0)
每个人都会遇到这种情况。很多东西都可以杀死Express应用程序,就像奇怪的HTTP请求一样。 Docker日志应该显示异常。添加一个uncaughtException处理程序来记录问题。
process.on('uncaughtException', (e) => {
console.error(e); // try console.log if that doesn't work
process.exit(10);
});
如果在Docker日志中找不到错误,那么您可以登录到某个文件(确保它位于Docker运行之间的卷中),而不是登录到控制台。
人们不喜欢承认这一点,但许多应用程序实际上只是记录异常并吃掉它并继续进入uncaughtException处理程序而不退出。因为像破碎的请求或其他无关紧要的东西经常杀死服务器,你通常可以逃避这一点。但是有一段时间你会被服务器状态发生的奇怪的事情所淹没,它无法从中恢复,你不会知道,因为你只是吃了这个例外。
您可以让它自动启动应用https://docs.docker.com/docker-cloud/apps/autorestart/,这可能是一个很好的解决方案。
否则,如果可能,请查看使用pm2和Docker的示例,pm2将为您重新启动。