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

ua4mk5z4  于 2023-10-19  发布在  Node.js
关注(0)|答案(3)|浏览(139)

对于一些背景故事和参考,这里有一些来自Heroku文档页面的引用。
从Heroku Node.js支持>激活:
当应用程序在根目录中有一个package.json文件时,使用Heroku Node.js构建包。
从Heroku Node.js Support > Default web process type:
首先,Heroku查找指定进程类型的Procfile
如果在构建过程中应用的根目录中没有Procfile,则Web进程将通过运行npm start启动,[...]
从Process Types和Procfile > Process types作为模板:
Procfile包含许多进程类型声明,每一个都在一个新的行上。每个进程类型都是一个命令的声明,该命令在该进程类型的dyno启动时执行。
例如,如果声明了web进程类型,则当启动此类型的dyno时,将执行与web进程类型相关联的命令。例如,这可能意味着启动Web服务器。
我在根目录下有一个package.json文件(它将激活Node.js buildpack),我还在根目录下包含了一个Procfile,内容如下:

service: npm start

我假设不定义web dyno会导致它不被创建;应该只创建service dyno,遵循Procfile中声明的配置。
相反,发生的情况是,使用npm start * 自动 * 创建了一个活动web dyno,使用Procfile中的定义创建了一个非活动service dyno。然后我不得不:

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

我完全可以想象在Heroku上运行一个Node.js“服务”应用程序,它不接受任何传入连接,只发出传出连接。有没有一种方法可以配置Node.js buildpack,使其在未定义web dyno时不自动创建dyno?我看了很多文档,想找到一种方法:**(1)定义它或(2)* 删除 * 自动生成的web dyno;但我什么都没找到
谢谢你的帮助!

cu6pst1q

cu6pst1q1#

我最终打开了一个服务台票与Heroku在这一个。我收到了他们的回复,所以我会把它贴在这里。感谢Heroku的支持!
简短的回答是,不,目前您需要heroku scale web=0 service=1才能在没有公共web进程的情况下运行服务。更长的解释:
在早期,Node.js Buildpack检查是否存在Procfile,如果缺少,则使用web: npm start创建默认值。这使得创建没有web进程的应用程序变得很容易,因为你可以只提供一个定义了一些进程的Procfile,从列表中省略web
然而,随着越来越多的用户需要构建包阵列而不是单个构建包,该解决方案产生了问题。Node是最受欢迎的第一个构建包,因为它经常被Java、Python、PHP和Ruby应用程序用来构建前端资产。当一个没有Procfile的应用程序首先运行Node,然后运行另一个buildpack时,Node将注入自己的默认Procfileweb: npm start),第二个buildpack将不会创建其默认Procfile,因为文件系统中已经存在一个。因此,当应用程序中缺少一个文件时,注入一个默认的Procfile会给多语言应用程序的下游带来问题。
所以,我们stopped creating a default Procfile and instead used default_process_types in bin/release。这解决了后续构建包继承错误的默认Procfiles的问题,但由于default_process_types是 * 扩展 * 而不是 * 替换 * 为Procfile进程列表,因此在Procfile中没有定义web进程的应用程序将合并默认的web进程。这就是为什么即使Procfile中没有web条目,web也会出现的原因。
我们也不想让任何客户对意外的账单感到惊讶。一些应用程序有许多进程类型,其中一些只是偶尔运行,一些仅限于单个示例,一些需要扩展和缩小等,因此将所有内容默认为1而不是0可能会导致额外的计费以及应用程序故障。这就是为什么非Web进程默认情况下缩放为零的原因。

vwhgwdsa

vwhgwdsa2#

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

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

vsikbqxv3#

实际正确的方法是在你的终端上运行:

heroku scale web=0 worker=1 --app YOUR_APP_NAME_HERE

它将禁用web并设置一个worker
Procfile上,必须保留worker: your-startup-command

相关问题