[英]AWS Codedeploy timesout on ApplicationStart when deploying a node.js / express server
我在尝试设置 AWS Codepipline 时遇到了问题。 我的 ApplicationStart 脚本调用以启动侦听端口 60900 的快速服务器,但是因为 express.listen() 在侦听 ApplicationStart 脚本时保持命令行状态并且我的部署失败。
我尝试在启动服务器的命令末尾使用 & 将它移动到后台进程,但我仍然在 ApplicationStart 挂钩处收到错误。
当我手动运行 start_server.sh 脚本时,它几乎立即启动服务器并让我重新控制命令行。
appspec.yml
version: 0.0
os: linux
files:
- source: /
destination: /var/www/mbmbam.app/
hooks:
BeforeInstall:
- location: scripts/stop_server.sh
timeout: 300
runas: root
- location: scripts/remove_previous.sh
timeout: 300
runas: root
AfterInstall:
- location: scripts/change_permissions.sh
timeout: 300
runas: root
- location: scripts/install_app.sh
timeout: 300
runas: root
- location: scripts/install_db.sh
timeout: 300
runas: root
ApplicationStart:
- location: scripts/start_server.sh
timeout: 300
runas: ubuntu
脚本/start_server.sh
#!/usr/bin/env bash
NODE_ENV=production npm start --prefix /var/www/mbmbam.app/app
分配给 npm start 命令的脚本
应用程序/start_app.sh
#!/bin/sh
if [ "$NODE_ENV" = "production" ]; then
node server.js &
else
nodemon --ignore './sessions' server.js;
fi
AWS Codedeploy 错误
LifecycleEvent - ApplicationStart
Script - scripts/start_server.sh
[stdout]
[stdout]> mbmbam-search-app@1.0.0 start /var/www/mbmbam.app/app
[stdout]> ./start_app.sh
[stdout]
任何帮助,将不胜感激。 我已经坚持了一天左右。
我通过将 start_app.sh 更改为
#!/bin/sh
if [ "$NODE_ENV" = "production" ]; then
node server.js > app.out.log 2> app.err.log < /dev/null &
else
nodemon --ignore './sessions' server.js;
fi
看起来 AWS 甚至在此处的故障排除步骤中列出了它: https : //docs.aws.amazon.com/codedeploy/latest/userguide/troubleshooting-deployments.html#troubleshooting-long-running-processes
问题似乎是节点在背景中没有干净利落。
您可以尝试以下方式在“app/start_app.sh”中启动节点服务器:
$ nohup node server.js > /dev/null 2>&1 &
此外,我建议考虑让您的节点处理服务,以便在服务器重新启动时启动它:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.