部署时未更新CSS文件(Google AppEngine)

时间:2010-05-06 17:23:54

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

我推出了我的网站的新版本,但现在CSS和静态图像没有正确部署。

以下是混乱的页面:http://www.gaiagps.com

Appengine显示最新版本是正确的:http://1.latest.gaiagps.appspot.com/

任何帮助?

12 个答案:

答案 0 :(得分:26)

我之前在App Engine上看过这个,即使使用像/stylesheets/default.css?{{ App.Version }}这样的缓存破坏查询参数。

这是我的(未经证实的)理论:

  1. 您可以通过将新版本部署或更改为default来推送新版本。
  2. 此更新正在传播到运行您的应用的所有GAE实例...
  3. ......有人点击了您的网站。
  4. 静态资源default.css{{ App.Version }}的请求会发送到Google的CDN,而该CDN还没有。
  5. Google的CDN要求GAE提供资源,然后才会为所有实例执行第2步的传播。
  6. 如果你运气不好,GAE会从运行旧版本的实例中提供资源......
  7. ...现在作为权威的“新”版本在Google的CDN中缓存。
  8. 如果发生这种情况(如果发生这种情况),我可以确认没有任何缓存破坏浏览器的工作量会有所帮助。 Google CDN服务器版本错误。

    修复:我发现解决此问题的唯一方法是部署另一个版本。您不会再次冒这种风险(如果您在竞争条件后没有进行任何CSS更改),因为即使出现竞争条件,可能是您第一次更新是在部署第二次更新时完成的,因此无论如何,所有实例都将提供正确的版本。

答案 1 :(得分:3)

以下是对我有用的。

  1. 从静态域提供您的css文件。这是由GAE自动创建的。

    //静态的。{你的应用内-ID} .appspot.com访问/ {CSS文件路径}

  2. 部署您的应用程序。此时您的应用将被破坏。

  3. 更改css文件的版本

    //静态的。{您的应用ID} .appspot.com访问/ {CSS文件路径}?V = {版本名称}

  4. 再次部署。

  5. 每次更改css文件。你将不得不重复2,3和4.

答案 2 :(得分:2)

你的链接对我来说很好,除非我遗漏了什么。

您可能已经缓存了旧的CSS,并且在更新后没有获得新的CSS。尝试清除浏览器缓存,看看是否有效。

转到1.latest下载新的CSS,因为它不在您的缓存中,所以它正确地显示给您。

答案 3 :(得分:2)

我也有这个问题。我正在使用带GAE的烧瓶,所以我的app.yaml中没有静态处理程序。当我添加它时,部署工作。尝试添加这样的东西

handlers:
- url: /static
  static_dir: static

到您的app.yaml并再次部署。它对我有用。显然谷歌试图通过不更新它认为用户看不到的文件进行优化。

答案 4 :(得分:0)

这对我有用:

首先,我更改了 app.yaml 上的版本

然后按照以下步骤

转到您的控制台 - >点击你的项目。

在侧边菜单上,点击计算 - >的版本

它将是所有版本,哪个版本是默认版本。我被设置为旧版本。

标记新版本。

对我来说工作。有什么顾虑吗?

答案 5 :(得分:0)

来自Pyhton标准环境的文档:static_cache_expiration

  

以给定的到期时间传输文件后,   通常,即使从   用户清除自己的浏览器缓存。重新部署新版本的   应用程序不会重置任何缓存。因此,如果您打算修改   静态文件,到期时间应短(少于一小时)   时间。在大多数情况下,默认的10分钟到期时间是   合适的。

答案 6 :(得分:0)

shoresh 发现,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 下提供的文件版本将始终是最新部署的,从而解决了问题。另外,如果您要定期编辑静态文件,则应从app.yaml文件中删除default_expiration元素,这将有助于避免其他服务器意外缓存。

答案 7 :(得分:0)

对于有新问题的新人,我想提供一个更新的答案。我认为在2018-19年度,以下信息可能会解决人们遇到的大多数CSS更新问题:

确保您的app.yaml具有以下内容:

 handlers:
   - url: /static
     static_dir: static
  • 运行gcloud app deploy
  • 冷却10分钟..并轮班重新加载您的网站

答案 8 :(得分:0)

好吧,对于较新的人来说,我尝试了缓存爆发方法,并且似乎已经解决了此问题,这是我为app.cfg文件上的css导入所做的示例,创建了一个变量来保存您的appid app.yaml文件并将其设置为以下文件之一

<link href="{{ url_for('static', filename='file.css') }}?{{config.APP_ID}}" rel="stylesheet"> 

对于app.yaml文件,请将此配置添加到安全的一侧

处理程序:

  • 网址:/ static static_dir:静态

答案 9 :(得分:0)

请确保在 dispatch.yaml 文件的网址和服务设置的末尾添加通配符。

示例:

dispatch:
  - url: "example.com/*"
    service: default

  - url: "sub.example.com/*"
    service: subexample

答案 10 :(得分:0)

如果您使用的是2020 GCP App Engine,只需将val extraConsumerProps = CommandLineUtils.parseKeyValueArgs(options.valuesOf(consumerPropertyOpt).asScala) val consumerProps = if (options.has(consumerConfigOpt)) Utils.loadProps(options.valueOf(consumerConfigOpt)) else new Properties() 添加到您的app.yaml文件中并将其设置为default_expiration

1m

更多信息:https://cloud.google.com/appengine/docs/standard/python3/config/appref/#runtime_and_app_elements

答案 11 :(得分:-1)

尝试清除浏览器上的缓存。有完全相同的问题,只需清除缓存就可以解决问题。