正在提供Google App Engine旧版本的静态文件

时间:2018-07-01 16:35:48

标签: google-app-engine caching google-cloud-platform

我有一个烧瓶应用程序,正在部署到Google App Engine。

我一直在对此应用程序中的js和css脚本进行更改,并将更新的存储库部署到gae。但是,当我在部署后重新加载*.appspot.com网址时,浏览器中加载的js和css文件不是最新版本。

我不确定该如何解决。我不知道这是浏览器中的缓存问题,app.yaml文件的问题还是其他原因。

当我在应用程序引擎中查看已部署的文件时,css和js是应该在浏览器中加载的当前版本,而不是。

enter image description here

这是我的app.yaml

runtime: python27
api_version: 1
threadsafe: true

libraries:
- name: ssl
  version: 2.7.11

handlers:
- url: /.*
  script: app.app

我是新手。如果有人有什么好建议。

谢谢!

UDPATE:

我已经根据@GAEfan的建议和@Dave W. Smith链接到的页面添加到了我的app.yaml文件中,现在看起来如下:

runtime: python27
api_version: 1
threadsafe: true

libraries:
- name: ssl
  version: 2.7.11

handlers:
- url: /.*
  script: app.app
- url: /static
  static_dir: static
  expiration: '10s'

但是问题仍然存在。我现在希望它与@Dave W. Smith的其他建议有关,即“有旧实例为请求提供服务,直到它们消失。”

这是GCP平台的另一幅屏幕截图,显示了我的应用程序正在运行的多个实例,每个新的deploy命令中的一个:

Multiple versions/instances of my app running on google app engine

最新版本是默认版本,屏幕截图显示该版本上有100%的流量分配。我应该在每次部署时都删除旧版本的应用程序吗?如果是这样,可以使用gcloud cli来完成吗?有什么办法可以保留这些旧版本,并确保从最新版本中绝对提供静态文件?

再次感谢。

3 个答案:

答案 0 :(得分:2)

是的,听起来像是一个缓存问题。阅读:https://cloud.google.com/appengine/docs/standard/python/config/appref#static_cache_expiration

您可以通过为静态文件设置一个小的缓存时间来进行测试,如下所示:

- url: /static
  static_dir: static/
  expiration: '10s'

或者通过以下方式更细化:

- url: /static/css
  static_dir: static/css/
  expiration: '10s'

- url: /static/js
  static_dir: static/js/
  expiration: '5m'

或在全球范围内通过:

default_expiration: '2s'

然后,当您对静态文件感到满意时,请将缓存时间设置为更长的时间,以加快站点速度并节省服务器时间。

答案 1 :(得分:1)

如果这是您的app.yaml,则可能会认为您有静态文件,但应用程序会提供这些文件。要使该静态真正静态,您需要在我们的app.yaml中增加一些内容。参见https://cloud.google.com/appengine/docs/standard/python/getting-started/serving-static-files

除非您修改命令行的版本,否则您可能会看到的是旧实例正在处理请求,直到它们消失。

答案 2 :(得分:1)

GAEfan 指出,Pyhton标准环境的文档指出static cache expiration,单个元素expiration和顶级元素{ {1}}负责定义“将在default_expirationCache-Control HTTP响应标头中发送的到期时间”。这意味着“文件可能会被用户的浏览器以及中间缓存的代理服务器(如Internet服务提供商)缓存”。

这里的问题是“重新部署该应用程序的新版本将重置任何缓存”。因此,如果将Expires设置为例如15天,但是更改了CSS或JS文件并重新部署了该应用程序,则不能保证由于活动的缓存会自动为这些文件提供服务,特别是由于中间缓存代理服务器(其中可能包括Google Cloud服务器)的情况似乎如此,因为访问your-project-name.appspot.com还提供过时的文件。

上面链接的同一文档指出:“如果您打算修改静态文件,则其有效期应短(少于一小时)。在大多数情况下,默认的10分钟有效期为宜”。在设置任何静态缓存过期之前,应该考虑一下 。但是对于像我一样事先不知道所有这些并且已经被这个问题困扰的人,我已经找到了解决方案。

即使文档指出无法清除这些中间缓存代理,也可以至少删除Google Cloud缓存。

为此,请转到您的Google Cloud Console并打开您的项目。在左侧汉堡菜单下,转到“存储”->“浏览器”。在这里,您应该至少找到一个存储桶:your-project-name.appspot.com。在“生命周期”列下,单击有关your-project-name.appspot.com的链接。删除所有现有规则,因为它们可能会与您现在创建的规则冲突。

通过点击“添加规则”按钮来创建新规则。对于对象条件,选择“较新版本”选项并将其设置为1。请不要忘记单击“继续”按钮。对于操作,选择“删除”,然后单击“继续”按钮。保存新规则。

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