Google App Engine-保留先前版本的静态文件

时间:2019-10-01 19:33:03

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

我们已经将Vue SPA部署到Google App Engine,并且完全由静态处理程序提供服务。

我们面临的问题是,如果用户在我们的站点中期部署中处于活动状态,那么他们的旧Webpack块清单将变得无效(因为某些块的哈希值被覆盖)。如果他们现在尝试路由到新页面,并且该页面尝试获取被覆盖的块,则会出现以下错误:

ChunkLoadError: Loading chunk Conversations failed.
(error: https://example.com/js/Conversations.71762189.js)

理想情况下,我们希望保留N(2-3个)应用程序静态文件的先前版本。

是将所有资产推送到Cloud Storage Bucket的唯一选择吗?如果是这样,我们将如何修剪较旧的版本?

这里是我的app.yaml供参考:

runtime: nodejs10
instance_class: F4
automatic_scaling:
  min_instances: 2
  max_instances: 10
default_expiration: "30d"
error_handlers:
  - file: default_error.html
handlers:
- url: /api/*
  secure: always
  redirect_http_response_code: 301
  script: auto
- url: /js/*
  secure: always
  redirect_http_response_code: 301
  static_dir: dist/js
- url: /css/*
  secure: always
  redirect_http_response_code: 301
  static_dir: dist/css
- url: /img/*
  secure: always
  redirect_http_response_code: 301
  static_dir: dist/img
- url: /(.*\.(json|js|txt))$
  secure: always
  redirect_http_response_code: 301
  static_files: dist/\1
  upload: dist/.*\.(json|js|txt)$
  expiration: "10m"
- url: /.*
  secure: always
  redirect_http_response_code: 301
  static_files: dist/index.html
  upload: dist/index.html
  expiration: "2m"

2 个答案:

答案 0 :(得分:3)

当部署覆盖接收到流量的现有服务版本(即服务版本未更改)时,通常会发生此问题。来自Deploying an app

  

注意:如果您部署的版本指定的版本ID与App Engine上已经存在的版本相同,则您将   deploy将覆盖现有版本。如果这可能会出现问题   该版本正在提供流量,因为到您的应用程序的流量   可能会被打乱。如果您进行部署,则可以避免干扰流量   您的新版本具有不同的版本ID,然后将流量移至   该版本。

只要已部署服务版本且未删除或覆盖该服务版本,其相应的静态资产仍可访问。

为防止出现此问题,请始终使用新的服务版本进行部署,然后(逐步)将流量迁移到新部署的版本。保持最新的N种服务版本将为您提供所需的N套静态资产。

通常,出于其他一些原因,这种部署做法是好的/推荐的做法:

可能感兴趣的:Google Frontend Retention between deployments

答案 1 :(得分:3)

使用--no-promote标志进行部署,并利用标准环境中的Traffic Migration功能将流量逐渐迁移到新版本,以便所有用户在新版本出现时都不会立即切换版本上线。 App Engine将在一段时间内托管新旧版本(或“蓝色”和“绿色”),直到所有流量都指向新版本,然后旧版本将被关闭。

另请参阅: