【问题标题】:Heroku - hosting files and static files for my projectHeroku - 为我的项目托管文件和静态文件
【发布时间】:2021-02-10 02:05:05
【问题描述】:

我想使用 Heroku 来托管我的 Ruby on Rails 项目。它将涉及大量文件上传,主要是图像。我可以在 Heroku 上托管和提供这些静态文件,还是使用 Amazon S3 之类的服务更明智。您对这种方法有何看法?在 Heroku 上托管这些静态文件有哪些选择?

【问题讨论】:

标签: ruby-on-rails heroku


【解决方案1】:

为了回答您的问题,Heroku 的“临时文件系统”不会用作静态上传的存储。 Heroku 是一个应用服务器。您必须在其他地方插入数据存储。

来自 Heroku 的spec

临时文件系统

每个 dyno 都有自己的临时文件系统,以及最近部署的代码的新副本。在测功机的生命周期中,其运行的进程可以将文件系统用作临时暂存器,但是任何其他测功机中的进程都看不到写入的文件,并且在测功机停止或重新启动时,写入的任何文件都将被丢弃。 例如,每当由于应用程序部署而更换测功机时都会发生这种情况,并且作为正常测功机管理的一部分,大约每天一次。

【讨论】:

    【解决方案2】:

    在我看来,Heroku 是 RoR 的绝佳选择。我亲自使用过它并遇到了这里已经提到的问题(你不能在 Heroku 的文件系统中存储任何东西)。因此,我在本教程之后使用了 S3:https://devcenter.heroku.com/articles/s3

    希望对你有帮助!

    PD:确保不要将 S3 凭据存储在任何文件中,而是按照此处所述创建变量:https://devcenter.heroku.com/articles/config-vars 我曾经将它们放在一个文件中,长话短说,有人访问了我的亚马逊账户,我的账户被收取了数千美元(仅几天)。亚马逊员工很友好地放弃了这些。只是需要记住的事情。

    【讨论】:

    • 有非常相似的经历。我投赞成票是因为你永远不知道谁会因此而从紧张的几天中解救出来。
    【解决方案3】:

    正如所指出的,出于临时存储的特定原因,您不应该对 Heroku 执行此操作,但要更广泛地回答您的问题,将用户上传的内容存储在任何主机上的本地文件系统上存在一些固有问题:

    • 您可以快速用完磁盘上的本地存储空间
    • 如果硬件崩溃/目录被删除/等,您可能会丢失所有用户上传的内容。
    • Heroku、EC2、Digital Ocean 等都提供不提供任何持久性保证的服务器(尤其是临时存储)。这意味着您的实例可能随时关闭、被换出等。
    • 您无法水平扩展应用程序。一台服务器上的文件将无法从另一台服务器(或 dyno 或您选择的提供商所称的任何名称)访问。

    然而,S3 是一个如此广泛使用的解决方案,因为:

    • 非常便宜(我们以每月 500 美元的价格存储 20 TB 数据)
    • 您上传的文件不会因硬件故障而消失
    • 您上传的文件与应用程序解耦,这意味着任何服务器/测功机/任何东西都可以访问它们。
    • 如果您需要 CDN,您可以随时将 S3 存储桶发布到云端,无需任何额外工作。

    当然还有更多的原因。要记住的最重要的事情是,通过将上传的内容本地存储在服务器上,无论您如何托管应用程序,您都无法横向扩展。

    【讨论】:

    • 这个答案似乎错误地暗示在 Heroku 上托管用户上传的内容实际上是可能的。
    • 很公平,只是试图在不太特定于主机的意义上回答这个问题。我将添加说明。
    【解决方案4】:

    在 S3 上托管文件更明智,实际上使用直接上传到 S3 更明智。

    您可以阅读参数,例如,here

    要点:Heroku 真的,真的昂贵的东西。

    因此,您需要节省所有资源。在 Heroku 上存储静态文件的唯一选择是为您提供单独的 dyno 运行应用程序服务器。并且静态文件不需要应用服务器。所以这只是在浪费 CPU 时间(你应该把它理解为“浪费了我很多钱”)。

    另外,上传大量的大文件会很快让你超出内存配额(读作“会浪费我更多的钱,因为我需要运行更多的测功机”)。所以最好直接上传文件到S3。

    Heroku 非常适合托管您的应用程序。使用最适合任务的工具。

    UPD。忘了告诉你——不仅静态资源需要单独的测功机,每次重新启动测功机时,你的静态资源都会死掉。

    【讨论】:

    • 我同意你的观点 EugZol...论点,只有论点不反对。我有时很生气。人们在不提供任何帮助的情况下投票。然后我必须在这里写下话题来表达我的挫败感。
    • 这个答案似乎错误地暗示在 Heroku 上托管用户上传的内容实际上是可能的。
    • @BradWerth 好点。更新了我的答案。谢谢!现在你可以对我投反对票了,你应该有权:D
    【解决方案5】:

    我遇到了同样的问题。我确实通过在我的 rails 应用程序中添加我所有的图像来解决它。然后,我使用可能类似于

    的链接引用图像

    myapp.herokuapp.com/assets/image1.jpg

    我可能会添加来自 CMS 的链接。这可能不是最好的选择,但它确实有效。

    【讨论】:

      猜你喜欢
      • 2011-11-28
      • 2021-10-28
      • 2019-11-23
      • 2020-10-14
      • 2012-01-30
      • 2011-08-06
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多