是否可以在没有web dyno的情况下将Node.js应用程序部署到Heroku?

时间:2016-10-26 14:59:47

标签: javascript node.js heroku

对于某些背景故事和参考,以下是一些Heroku文档页面的引用。

来自Heroku Node.js Support > Activation

  

当应用程序在根目录中有package.json文件时,将使用Heroku Node.js buildpack。

来自Heroku Node.js Support > Default web process type

  

首先,Heroku查找指定您的流程类型的Procfile

     

如果在构建过程中应用的根目录中没有Procfile,则会通过运行npm start启动您的网络流程,[...]

来自Process Types and the Procfile > Process types as templates

  

Procfile包含许多进程类型声明,每个声明都在一个新行上。每个进程类型都是在启动该进程类型的dyno时执行的命令声明。

     

例如,如果声明了web进程类型,那么当启动此类型的dyno时,将执行与web进程类型关联的命令。例如,这可能意味着启动Web服务器。

我在根目录中有一个package.json文件(将激活Node.js buildpack),并且我还在根目录中包含Procfile,其中包含以下内容:

service: npm start

我认为不定义web dyno会导致它无法创建;只应根据service中声明的配置创建Procfile dyno。

相反,发生的事情是有效 web dyno使用npm start自动创建 service dyno是使用Procfile中的定义创建的。然后我不得不:

  • heroku ps:scale web=0
  • heroku ps:scale service=1

我可以想象想要运行Node.js" service" Heroku上的应用程序不接受任何传入的连接,只接收传出的连接。有没有办法配置Node.js buildpack,以便在未定义一个时自动创建web dyno?我查看了很多文档,寻找方法:(1)如此定义或(2) 删除自动生成的web dyno;但是,我还没找到任何东西。

感谢您的帮助!

2 个答案:

答案 0 :(得分:7)

我最后在Heroku上打开了一张帮助台票。得到了他们的回复,所以我会在这里发布。谢谢Heroku的支持!

简短的回答是,不,目前您需要heroku scale web=0 service=1才能在没有公开web流程的情况下运行服务。更长的解释:

早期,Node.js Buildpack检查是否存在Procfile,如果缺少,则创建一个web: npm start的默认值。这样就可以轻松创建没有网络流程的应用,因为您只需提供定义某些流程的Procfile,从列表中省略web

但是,随着越来越多的用户需要构建包的数组而不是单个数组,该解决方案会产生问题。 Node是最受欢迎的第一个buildpack,因为Java,Python,PHP和Ruby应用程序经常使用它来构建前端资产。每当没有Procfile的应用程序首先运行Node,然后运行另一个buildpack时,Node将注入其自己的默认Procfileweb: npm start),然后第二个buildpack将不会创建其默认值{{ 1}}已经存在于文件系统中。因此,当应用程序中缺少一个默认的Procfile时,会为多语言应用程序创建下游问题。

所以,我们stopped creating a default Procfile and instead used default_process_types in bin/release。这解决了后续buildpack继承错误的默认Procfiles的问题,但由于Procfile扩展而不是default_process_types进程列表替换,所以没有在Procfile中定义的web流程会合并默认的Procfile流程。这就是web即使在{{1}中没有web条目也会出现的原因}}

我们也不希望任何有意外账单的客户感到惊讶。有些应用程序有许多进程类型,其中一些仅偶尔运行,一些仅限于单个实例,一些需要按比例放大,等等,因此将所有内容默认为1而不是0可能会导致额外的计费作为应用程序故障。这就是默认情况下非Web进程缩放为零的原因。

答案 1 :(得分:1)

阅读Shibumi的答案后,我遇到了同样的问题,并在Procfile中解决了这个问题:

web: echo "useless"
service: node index.js