【问题标题】:Google App Engine -- Deploying a new version will make my site go downGoogle App Engine -- 部署新版本会使我的网站宕机
【发布时间】:2021-05-19 19:59:30
【问题描述】:

我有一个部署在 Google App Engine 上的烧瓶 + react 应用程序。最近发现每次在GAE上部署一个新版本,我的网站都会宕机几个小时,并且有几个网页无法正常加载。我检查了控制台,Web 应用程序正在尝试从上一个版本中获取静态文件,这导致了 404 错误。谁能帮我找出问题所在?

这是我的 app.yaml 文件:

runtime: python37
env: standard

default_expiration: "5m"

entrypoint: gunicorn -b :$PORT main:app --timeout 150

instance_class: F4

automatic_scaling:
  max_instances: 5
  min_instances: 1
  min_pending_latency: "5s"
  target_cpu_utilization: 0.75

inbound_services:
  - warmup

handlers:
  - url: /static/js/(.*)
    static_files: build/static/js/\1
    upload: build/static/js/(.*)
  - url: /static/css/(.*)
    static_files: build/static/css/\1
    upload: build/static/css/(.*)
  - url: /static/media/(.*)
    static_files: build/static/media/\1
    upload: build/static/media/(.*)
  - url: /(.*\.(json|ico))$
    static_files: build/\1
    upload: build/.*\.(json|ico)$
  - url: /
    static_files: build/index.html
    upload: build/index.html
  - url: /.*
    script: auto

【问题讨论】:

    标签: reactjs google-app-engine flask


    【解决方案1】:

    我是来回答我自己的问题的。我似乎找到了问题以及如何解决它。

    主要问题似乎是缓存问题。对于app.yaml 设置,虽然默认过期时间设置为5m,但带有路径的url 没有设置过期时间。例如,页面www.example.com/about 将具有与js 包不同的缓存时间。这意味着当部署新的构建文件夹时,js 包已经更改,但您的后端应用程序生成的www.example.com/about 页面仍然是旧版本,它会尝试从之前请求js 包构建文件夹。因此,导致 404 错误。

    解决此问题的方法是为您的后端应用程序生成的响应设置过期时间。我使用的是 Flask 环境,所以代码是(记入this answer

    response["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
    response["Pragma"] = "no-cache" # HTTP 1.0.
    response["Expires"] = "0" # Proxies.
    

    【讨论】:

      【解决方案2】:

      Web 应用程序正在尝试从最新版本获取静态文件

      那么这些文件是在您刚刚部署的新版本中删除的吗?

      一般来说,听起来您的问题与过时的浏览器缓存有关。出于这个原因,我不会立即从您部署的应用程序中删除静态资产。

      我看到你正在使用 ReactJS。您是否使用将所有 js 和 css 组合成一个名称包含哈希的单个文件的功能?这应该有助于缓存清除。

      令人困惑的部分是你说它会下降几个小时。你的app.yaml 中有default_expiration: "5m",所以几个小时听起来有点极端。当您尝试检查浏览器中的更改时,您是否没有进行硬重新加载(甚至完全重新加载)?

      【讨论】:

      • 这是我很困惑的事情。我没有删除任何东西。我所做的是部署一个新版本并将所有流量迁移到新版本。我将过期时间设置为 5 分钟以防止出现缓存问题。我也尝试过重载shift + F5,但也没有用
      • 如果你没有删除任何东西,那么"static files from the last version"是什么意思?因为这听起来像是新版本不再需要这些文件。最好看看这些 404 的几个示例并将它们与您的项目目录中的文件进行比较。
      • 当我部署一个新版本时,我会部署一个由npm run build 生成的新构建文件夹。因此,例如,以前的构建文件夹将有一个 main.12345.js 包,而新的构建文件夹将有一个 main.67890.js 包。当我部署新文件夹时,通常网站应该获取main.67890.js 包,但它却试图获取main.12345.js。当我说我没有删除任何内容时,我的意思是我没有从应用引擎云存储桶中删除任何内容。
      • 我不明白为什么它试图获取以前的包。这样看来,这似乎是一个缓存问题,但是default_expiration设置为5分钟,理论上应该可以防止这个问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 2022-12-14
      • 2011-09-23
      • 2013-09-23
      • 2017-01-14
      • 1970-01-01
      • 2013-02-07
      相关资源
      最近更新 更多