使用弹性 beantalk 部署复杂的 node.js 项目
Posted
技术标签:
【中文标题】使用弹性 beantalk 部署复杂的 node.js 项目【英文标题】:Deploying complex node.js project with elastic beanstalk 【发布时间】:2014-07-02 00:15:50 【问题描述】:我想知道在不依赖外部 npm 存储库的可用性(以及为内部开发的包处理私有管理的 git 存储库的凭据和高可用性)的情况下,使用弹性 beanstalk 部署复杂 node.js 的最佳实践是什么。
似乎有一种思想流派主张将 node_modules 实际签入到实际部署的项目的源代码树中。
来源 1:http://www.futurealoof.com/posts/nodemodules-in-git.html
来源 2:http://eng.yammer.com/managing-node-js-dependencies-and-deployments-at-yammer/
听起来检查它们是正确的方法,但是对于某些编译的包(在mac上开发并部署到linux)存在不同二进制格式的问题
我已经尝试按照 yammer 的建议进行操作(签入模块,除了 bin 文件夹),但即便如此,本地“npm rebuild”命令也会失败(它尝试对 express.js 中不存在的 bin 文件夹中的内容进行 chmod模块),所以我什至没有尝试查看 beanstalk 默认部署环境将如何处理这样的存储库。我假设它运行“npm install”(什么都不做),但它会运行“npm rebuild”吗?
那么,同样,部署具有多个依赖项的复杂项目的最佳实践是什么?在 node/beanstalk 世界中,它现在一定是一个已解决的问题,不是吗?
谢谢
【问题讨论】:
您可能正在使用依赖于二进制文件的库。如果您的暂存环境与生产环境 100% 相同,那么继续,检查 node_modules 文件夹,没问题。您不需要 npm如果您在登台和生产中没有使用不同版本的节点,请重建。只需复制所有内容,您应该没问题。 mongodb bson,kerberos 使用二进制文件,我在 mac 上开发,同时部署到 amazon linux 机器,我无法将二进制文件提交到存储库中 我明白了。但此时你可能想考虑使用类似 vagrant 的东西,它会让你的生活变得更简单。 【参考方案1】:这是我的配置,可以满足您的要求。将其保存在 .ebextensions 文件夹中,然后就可以设置了。我的和https://***.com/a/23242623/34340 中的优秀答案之间的唯一区别是 NPM_CONFIG_UNSAFE_PERM=true 行,这是我从https://forums.aws.amazon.com/thread.jspa?messageID=534612 学到的
packages:
yum:
git: []
gcc: []
make: []
openssl-devel: []
libxml2: []
libxml2-devel: []
files:
"/opt/elasticbeanstalk/env.vars" :
mode: "000775"
owner: root
group: users
content: |
export HOME=/home/ec2-user # ADDED EXPORT COMMAND
export NPM_CONFIG_LOGLEVEL=error
export NPM_CONFIG_UNSAFE_PERM=true
export NODE_PATH=`ls -td /opt/elasticbeanstalk/node-install/node-* | head -1`/bin
"/opt/elasticbeanstalk/hooks/appdeploy/pre/50npm.sh" :
mode: "000775"
owner: root
group: users
content: |
#!/bin/bash
. /opt/elasticbeanstalk/env.vars
function error_exit
eventHelper.py --msg "$1" --severity ERROR
exit $2
#install not-installed yet app node_modules
if [ ! -d "/var/node_modules" ]; then
mkdir /var/node_modules ;
fi
if [ -d /tmp/deployment/application ]; then
ln -s /var/node_modules /tmp/deployment/application/
fi
OUT=$([ -d "/tmp/deployment/application" ] && cd /tmp/deployment/application && $NODE_PATH/npm install 2>&1) || error_exit "Failed to run npm install. $OUT" $?
echo $OUT
"/opt/elasticbeanstalk/hooks/configdeploy/pre/50npm.sh" :
mode: "000666"
owner: root
group: users
content: |
#no need to run npm install during configdeploy
【讨论】:
我假设这个解决方案使 npm 安装更快,但它并没有在部署新实例时消除对 npmjs 或其他服务器的依赖,也没有解决跨实例模块版本不一致的问题,对吧? 没错 - 外部服务和不一致的模块版本仍然会影响您。对于这些情况,您可能希望从“git aws.push”转向 github.com/simoneb/grunt-awsebtdeploy 之类的东西 + 紧密 package.json 版本控制和 npm shrinkwrap 的健康帮助。以上是关于使用弹性 beantalk 部署复杂的 node.js 项目的主要内容,如果未能解决你的问题,请参考以下文章
从弹性beantalk上的docker-compose部署查看node.js日志(console.log)
使用弹性 beantalk 问题部署 Asp.net Web 应用程序
将 node.js 应用程序部署到弹性 beanstalk(使用 express)