草庐IT

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

coder 2024-07-19 原文

对于一些背景故事和引用,这里引用了一些 Heroku 文档页面。

来自Heroku Node.js Support > Activation :

The Heroku Node.js buildpack is employed when the application has a package.json file in the root directory.

来自 Heroku Node.js Support > Default web process type :

First, Heroku looks for a Procfile specifying your process types.

If no Procfile is present in the root directory of your app during the build process, your web process will be started by running npm start, [...]

来自 Process Types and the Procfile > Process types as templates :

A Procfile contains a number of process type declarations, each on a new line. Each process type is a declaration of a command that is executed when a dyno of that process type is started.

For example, if a web process type is declared, then when a dyno of this type is started, the command associated with the web process type, will be executed. This could mean starting a web server, for example.


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

service: npm start

我假设不定义 web dyno 会导致它无法创建;仅应创建 service dyno,遵循 Procfile 中声明的配置。

相反,发生的事情是使用 npm start自动 创建了一个 active web dyno strong>inactive service dyno 是使用 Procfile 中的定义创建的。然后我不得不:

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

我完全可以想象想要在 Heroku 上运行一个 Node.js“服务”应用程序,它不接受任何传入连接,只进行传出连接。有没有一种方法可以将 Node.js 构建包配置为在未定义时不自动创建 web dyno?我查阅了很多文档以寻找一种方法来:(1) 如此定义它或(2) 自动删除生成 web dyno;但是,我还没有找到任何东西。

感谢您的帮助!

最佳答案

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


简短的回答是,不,目前您需要 heroku scale web=0 service=1 以便在没有公共(public) web 进程的情况下运行服务.更详细的解释:

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

但是,随着越来越多的用户需要构建包阵列而不是单个构建包,该解决方案产生了问题。 Node 是最流行的第一个构建包,因为 Java、Python、PHP 和 Ruby 应用程序经常使用它来构建前端 Assets 。每当没有 Procfile 的应用首先运行 Node,然后再运行另一个 buildpack 时,Node 会注入(inject)它自己的默认 Procfile(web: npm start),并且第二个 buildpack 将不会创建其默认的 Procfile,因为它已经存在于文件系统中。因此,在应用程序中缺少默认 Procfile 时注入(inject)默认 Procfile 会给多语言应用程序的下游带来问题。

所以,我们 stopped creating a default Procfile and instead used default_process_types in bin/release .这解决了后续构建包继承不正确的默认 Procfile 的问题,但由于 default_process_typesextended 而不是 replaced Procfile 进程列表,在其 Procfile 中没有定义 web 进程的应用程序将获得默认的 web 进程合并。这就是为什么 web 即使在 Procfile 中没有 web 条目也会出现。

我们也不想让任何客户收到意想不到的账单。有些应用程序有很多进程类型,其中一些只是偶尔运行,一些仅限于单个实例,一些需要放大和缩小等,所以将所有内容默认为 1 而不是 0 也可能导致额外计费作为应用程序故障。这就是默认情况下将非 Web 进程缩放为零的原因。

关于javascript - 是否可以在没有 web dyno 的情况下将 Node.js 应用程序部署到 Heroku?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40265699/

有关javascript - 是否可以在没有 web dyno 的情况下将 Node.js 应用程序部署到 Heroku?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  3. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  4. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  5. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  6. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  7. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  8. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  9. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  10. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

随机推荐