运行时更新部署的流星应用程序,停机时间最短 - 最佳做法

Kri*_*vas 6 meteor

我在EC2上运行我的meteor应用程序,如下所示:( node main.js在tmux会话中)

以下是我用来更新流星应用的步骤:

1)meteor bundle app.tgz

2)scp app.tgz EC2-server:/ path

3)ssh EC2-server并附加到tmux

4)通过Cc终止当前的流星节点进程

5)提取app.tgz

6)运行提取的app.tgz的"node main.js"

这是标准做法吗?

我意识到forever也可以使用,但是你每次更新我的应用程序时还是要杀死旧节点进程并启动一个新进程吗?升级可以更加无缝,而不会破坏节点进程吗?

Dav*_*don 7

如果不杀死节点进程,你就无法做到这一点,但我发现这并不重要.实际上更烦人的是客户端上的浏览器刷新,但是你没有太多可以做的.

首先,我们假设应用程序已在运行.我们通过像我在这里的答案中的脚本一样永远地启动我们的应用程序.我将向您展示我的整个升级脚本,但它包含各种特定于Edthena的内容,因此我将概述下面的步骤:

  1. 构建一个新的包.我们在服务器本身上执行此操作,这可以避免任何丢失的光纤问题.捆绑包文件被写入/home/ubuntu/apps/edthena/edthena.tar.gz.

  2. 我们cd进入/home/ubuntu/apps/edthena目录而且rm -rf bundle.这将吹走当前运行进程使用的文件.因为服务器仍在内存中运行,所以它将继续执行.但是,如果您的应用程序定期执行未缓存的磁盘操作,例如private在启动后从目录中读取,则此步骤会出现问题.我们没有,并且所有的静态资产都是由nginx提供的,所以我觉得这样做很安全.或者,您可以将旧bundle目录移动到类似的东西bundle.old,它应该工作.

  3. tar xzf edthena.tar.gz

  4. cd bundle/programs/server && npm install

  5. forever restart /home/ubuntu/apps/edthena/bundle/main.js

这种方法确实没有任何停机时间 - 它只是以服务器抛出异常时的方式重新启动应用程序.Forever还会保留原始脚本的环境,因此您无需再次指定环境变量.

最后,您可以查看~/.forever目录中的日志文件.确切的路径可以通过forever list.