使用弹性 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 应用程序

使用弹性 beantalk 部署 PHP 应用程序

将 node.js 应用程序部署到弹性 beanstalk(使用 express)

将 django docker 容器部署到弹性 beantalk

使用弹性 beantalk 部署的 Rails 应用程序响应“无法访问站点”