当前位置: 首页 > 面试题库 >

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

贝自怡
2023-03-14
问题内容

有关一些背景知识和参考,以下是一些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测功器;但是,我什么都没找到。

谢谢您的帮助!


问题答案:

最后,我在此与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进程默认缩放为零的原因。



 类似资料:
  • 我可以用cloud foundry grails插件和cf-push将我的grails 2.0.3应用程序部署到云中,一切都很好。 现在,我想使用STS/eclipse cloud foundry扩展来部署eclipse(而不是使用grails命令cf-push!)并在服务器视图中查看服务器实例等等。

  • 我已经从源代码处构建并安装了另一个glibc,并且我想让现有的用C++编写的可执行文件与自定义glibc一起运行,以供实验之用。为了做到这一点,我尝试更改可执行文件的加载程序。首先,在/lib64下创建了一个名为的链接,其路径指向新的加载程序 其次,通过文本编辑器修改了可执行文件中的加载器路径,将“/lib64/ld-linux-x86-64.so.2”更改为“/lib64/ld_linux-x8

  • 我在网站上做了一个小研究,并在这个网站上回顾了相关主题,但答案是矛盾的:有人说这是不可能的,有人说这是可能的,但很危险。 目标是传递匿名类的对象作为RMI方法的参数。由于RMI要求,这个类必须是可序列化的。这里没有问题,很容易使类序列化。 但是我们知道内部类的实例包含对外部类的引用(匿名类是内部类)。因此,当我们序列化内部类的实例时,外部类的实例也被序列化为一个字段。问题来了:外部类是不可序列化的

  • 有了Tomcat7,我可以部署几个应用程序,误用MyFaces 1. x/2. x在TomEE中,如果我用MyFaces 1. x部署应用程序,我会运行到许多异常,因为tomee有内置的myfaces2支持...有什么想法吗,有可能像jboss那样切换模块吗?

  • 是否可以在没有实体的情况下使用JpaRepository?在这种情况下,将其替换为DTO。 如下示例所示 这种情况有替代方案吗? 注意:DTO已经映射,但我不想创建视图来将此DTO转换为实体。 我已经验证了这个主题,但没有重大进展,请使用无实体的JpaRepository交互样式 我在试这个 接口- 公共接口BffDTOInterface2{ } 我有这个错误

  • 我想使用并使其直接进入给定的url,而不是从ribbon配置中获取主机。 我知道在Spring,cloud-feign默认与ribbon和eureka一起出现。 根据这个:https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-ribbon.html#spring-cloud-ribbon-without-eure