App Engine:静态文件未在部署时更新

App Engine: Static Files Not Updating on Deploy

我推送了一个 HTML 静态文件,其中包含一个 Angular SPA 作为我的自定义域的包罗万象的处理程序,设置如下:

- url: /(api|activate|associate|c|close_fb|combine|import|password|sitemap)($|/.*)
  script: gae.php

- url: /.*
  static_files: public/static/app/v248/es/app.html
  upload: public/static/app/v248/es/app.html
  expiration: "1h"

效果很好,但如果我推送新的 app.html,它不会更新。我尝试更改本地路径,部署新的应用程序版本,甚至用自定义 php 端点替换 catch-all 处理程序,但它不起作用,响应仍然是 [= 的第一个版本18=] 我上传了。

其他人遇到了同样的问题(CSS File Not Updating on Deploy (Google AppEngine)),看起来与 Google CDN 缓存有关,但据我所知,没有任何方法可以刷新它。

在 App Engine 应用程序中执行静态文件更改时,由于 cache,更改将不会立即可用,正如您已经想象的那样。 Google 云中的缓存无法手动刷新,所以如果你想测试它是如何工作的,我建议你将过期时间更改为更短的时间(默认为 10 分钟),然后设置一个根据您的要求适当的到期时间。

请记住,您可以更改静态缓存过期时间 for all static files or for just the ones you choose,只需在 app.yaml 文件中设置适当的元素即可。

有一种方法可以刷新您的应用在 Google 云上缓存的静态文件。

前往您的 Google Cloud Console 并打开您的项目。在左侧汉堡包菜单下,前往存储 -> 云存储 -> 浏览器。在那里您应该至少找到一个 Bucket:your-project-name.appspot.com。在 Lifecycle 列下,单击与 your-project-name.appspot.com 有关的 link。删除所有现有规则,因为它们可能与您现在要创建的规则冲突。

单击 'Add A Rule' 按钮创建新规则。对于操作,select“将存储设置为近线”。对于对象条件,选择 'Number of newer versions' 选项并将其设置为 1。单击 'Continue' 按钮,然后单击 'Create'。

这条新规则最多需要 24 小时才能生效,但至少对于我的项目来说只需要几分钟。一旦启动并且 运行,您的应用程序在您的项目-name.appspot.com 下提供的文件版本将始终是最新部署的,解决了问题。此外,如果您经常编辑静态文件,则应从与这些静态文件相关的处理程序中删除任何 expiration 元素,并从 app.yaml 文件中删除 default_expiration 元素,这将有助于避免意外被其他服务器缓存。

我通过 Google Cloud Platform 中的一项服务获取静态文件。我的问题是我没有执行

gcloud app deploy dispatch.yaml

执行后,一切正常。希望对你有帮助

2020 年更新:

对于我的应用程序,我发现在我的版本列表中达到 50 Versions 后,App Engine 开始无法检测到我最新的应用程序部署。

查看(汉堡菜单)-> App Engine -> 版本

在下次部署时删除了一堆旧版本后,它立即获取了我的最新更改。不确定这是否特定于我的帐户或计费设置,但这为我解决了这个问题。

可能导致此问题的另一个问题是 Google 前端中的缓存,这取决于您的应用程序返回的缓存 header。就我而言,我在“网络”选项卡上打开了 Firefox 的检查器,看到陈旧文件的 cache-control 设置为 43200 秒,即 12 小时:

这是针对从 Flask 返回的文件,因此我通过在来自我的 GAE 代码的 Flask 响应中明确指定 max-age 来修复此问题:

return flask.send_from_directory(directory, filename, max_age=600)

这会导致中间缓存(例如 Google 的前端)仅将文件缓存 600 秒(10 分钟)。

不幸的是,一旦文件被缓存,就无法刷新它,因此您将不得不等待 12 小时。不过下一次就解决问题了