一尘不染

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

node.js

有关一些背景知识和参考,以下是一些Heroku文档页面的一些报价。

Heroku Node.js支持>激活中

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

Heroku Node.js支持>默认Web进程类型

首先,Heroku寻找一个Procfile来指定您的进程类型。

如果Procfile在构建过程中应用程序的根目录中没有任何内容,则将通过运行npm start[…] 启动Web过程

从“ 进程类型”和“
Procfile”>“进程类型”作为模板

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

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


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

service: npm start

我假设不定义一个webdyno会导致它不被创建;service按照中声明的配置,仅应创建dyno Procfile

相反,发生了什么事是一个 积极的 web赛道是 自动 使用创建npm start不活跃
service赛道使用的定义创建Procfile。然后,我不得不:

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

我绝对可以想象要在Heroku上运行一个不接受任何传入连接而仅建立传出连接的Node.js“服务”应用程序。有没有一种方法可以配置Node.js
buildpack在web未定义时不自动创建dyno?我浏览了许多文档,寻找以下一种方法: (1)如此 定义或 (2) 删除
自动生成的web测功器;但是,我什么都没找到。

谢谢您的帮助!


阅读 216

收藏
2020-07-07

共1个答案

一尘不染

最后,我在此与Heroku一起打开了一个服务台票。得到了他们的回应,所以我将其张贴在这里。感谢Heroku的支持!


简短的答案是,不,当前您需要heroku scale web=0 service=1在没有公共web流程的情况下运行服务。详细说明:

早期,Node.js Buildpack检查a的存在Procfile,如果缺少,则使用创建一个默认的web: npm start。这使得无需Web流程即可轻松创建应用程序,因为您可以提供一个Procfile定义了某些流程的,而无需web列出。

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

因此,我们停止了创建默认的Procfile,而是在bin /
release中使用了default_process_types
。这解决了后续的buildpack继承不正确的默认Procfiles的问题,但由于default_process_types
扩展 而不是 Procfile进程列表 取代
,因此未在其中web定义进程的应用Procfileweb合并默认进程。这就是为什么web即使在中没有web输入也出现的原因Procfile

我们也不想给任何客户带来意想不到的账单。一些应用程序具有多种流程类型,其中某些仅偶尔运行,某些仅限于单个实例,某些需要按比例缩放等,因此将所有内容默认设置为1而不是0可能还会导致额外的账单由于应用出现故障。这就是为什么非Web进程默认缩放为零的原因。

2020-07-07