对于一些背景故事和参考,这里有一些来自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;但我什么都没找到
谢谢你的帮助!
3条答案
按热度按时间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将注入自己的默认Procfile
(web: 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进程默认情况下缩放为零的原因。
vwhgwdsa2#
我只是遇到了同样的问题,并在阅读Shibumi的回答后在我的Procfile中解决了这个问题:
vsikbqxv3#
实际正确的方法是在你的终端上运行:
它将禁用
web
并设置一个worker
在
Procfile
上,必须保留worker: your-startup-command