是否有可能部署一个Node.js应用程序到Heroku没有一个networkingdynamic?

对于一些背景和参考,这里是一些Heroku文档页面的引用。

从Heroku Node.js支持>激活 :

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

来自Heroku Node.js支持>默认web进程types :

首先,Heroku查找指定您的stream程types的Procfile 。

如果在构build过程中没有在应用程序的根目录中存在Procfile ,则将通过运行npm start来启动Web进程,[…]

从进程types和Procfile>进程types作为模板 :

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

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


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

 service: npm start 

我会假设没有定义一个web将导致它不被创build; 应该按照Procfile声明的configuration创buildservice Procfile

相反,发生的事情是,使用npm start 自动创build一个活动的 web Procfile使用Procfile的定义创build一个不活动的 service Procfile 。 然后我不得不:

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

我可以肯定地想要在Heroku上运行一个Node.js“服务”应用程序,它不接受任何传入连接,只传出一个连接。 有没有办法configurationNode.js构build包不自动创build一个没有定义的webdynamic? 我已经浏览了大量的文档,寻找一种方法来: (1)定义它,或(2) 删除自动生成的webdynamic; 但是,我没有find任何东西。

谢谢您的帮助!

我最终在Heroku上开了一个帮助台票。 得到了他们的回应,所以我会在这里发布。 感谢Heroku的支持!


简短的回答是,不,目前你需要为了在没有公共web进程的情况下运行一个服务而需要heroku scale web=0 service=1 。 对于更长的解释:

早期,Node.js Buildpack检查了Procfile的存在,如果缺less,使用web: npm start创build一个默认的。 这使得在没有web进程的情况下创build应用程序变得很容易,因为您可以提供一个定义一些进程的Procfile ,从列表中省略web

但是,随着越来越多的用户需要构build包而不是一个包,这个解决scheme就产生了问题。 Node是最受欢迎的第一个buildpack,因为它经常被Java,Python,PHP和Ruby应用程序用来构build前端资源。 每当没有Procfile的应用程序Procfile运行节点,然后再运行另一个buildpack时,Node会注入自己的默认Procfileweb: npm start ),然后第二个buildpack将不会创build默认的Procfile因为文件系统中已经存在一个。 因此,在应用程序中缺less缺省Procfile时,会为多语言应用程序的下游创build问题。

所以,我们停止创build一个默认的Procfile,而是在bin / release中使用default_process_types 。 这解决了后续buildpacksinheritance不正确的默认procfiles的问题,但是由于default_process_types 扩展而不是 Procfile进程列表所取代 ,没有在其Procfile中定义的web进程的应用程序将获得合并的默认web进程。没有Procfileweb条目。

我们也不希望任何意外的账单给客户带来惊喜。 一些应用程序有很多stream程types,其中一些只是偶尔运行,一些仅限于一个实例,一些需要升级和降低等等,所以默认所有事情都是1而不是0,也可能会导致额外的计费作为应用程序故障。 这就是为什么非web进程默认缩放到零的原因。