首页 > 解决方案 > Heroku 工作人员无法在同一个 Dyno 上的 Web 文件夹上写入

问题描述

我有一个免费的测功机实例,它运行一个简单的工作程序,它创建一个 RSS 文件并将其上传到 PythonAnywhere(就像使用该静态rss.xml文件的 Web 服务器一样使用它)。

我正在尝试从 PythonAnywhere 迁移到heroku-buildpack-static在同一个工作人员测功机上使用网络,但我无法使其工作。看起来工人和网络在不同的文件夹/环境中运行,我找不到它的位置。

worker: python main.py
web: bin/boot

main.py脚本将文件写入当前文件夹并成功上传到 PythonAnywhere,但我看不到该文件在 Heroku 上的写入位置。我试图创建一个文件夹/app/web并修改它main.py以写入它,但我也看不到创建/更新的文件,我使用 Heroku 控制台检查了这一点。我认为工作人员使用不同的家或实例来运行,但我不确定这个结构位于什么位置。我还.profile使用以下命令创建了一个但没有成功:

chmod -R 777 /app/web

该应用程序还包含一个static.json文件,其中包含以下内容以指向正确的文件夹并避免缓存

{
  "root": "/app/web/",
  "headers": {
    "/": {
      "Cache-Control": "no-store, no-cache"
    }
  }
}

标签: pythonheroku

解决方案


看起来工人和网络在不同的文件夹/环境中运行

是的,这正是正在发生的事情。

在同一个工人测功机上

事实上,你不在同一个测功机上。您的web流程和您的worker流程在隔离的环境中执行。考虑标题“过程类型与测功机”下的文档的这一部分

流程类型是一个或多个测机实例化的原型。这类似于在面向对象编程中,是一个或多个对象实例化的原型。

web您不能从测功机将文件写入您的测worker功机。它们是完全隔离的,不共享文件系统。

正如 msche 所指出的,dyno 文件系统是短暂的。即使您确实设法编写了此文件,例如通过运行 Web 服务而不是具有 API 端点来接受文件的静态主机,该文件也会在每次 dyno 重新启动时丢失。这种情况经常发生(至少每天一次)。

即使您在评论中所说的每两分钟编写一次文件,您的网站平均每天也会被破坏一分钟。我建议将此数据存储在其他地方,例如作为 Amazon S3 上的文件客户端-服务器数据存储

请注意,您还可以直接从 Amazon S3 托管静态站点,这可能很适合这里。


推荐阅读