传送静态文件

除了处理动态请求之外,应用通常还需要传送静态文件(如 JavaScript、图片和 CSS)。柔性环境中的应用可以通过 Google Cloud 选项(如 Cloud Storage)传送静态文件,直接传送或使用第三方内容分发网络 (CDN)。

从 Cloud Storage 传送文件

Cloud Storage 可为动态 Web 应用托管静态资源。与直接从应用传送内容相比,使用 Cloud Storage 进行传送可为您带来以下好处:

  • Cloud Storage 实际起到内容分发网络的作用。这不需要任何特殊配置,因为默认情况下,任何可公开读取的对象都会在全球 Cloud Storage 网络中进行缓存。
  • 将传送静态资源的工作转交给 Cloud Storage 处理,应用本身的负载将降低。根据您拥有的静态资源数量以及访问频率,这有可能大幅度降低应用的运行费用。
  • 访问 Cloud Storage 内容的带宽费用通常较低。

您可以使用 gsutil 命令行工具Cloud Storage API 将资源上传到 Cloud Storage。

Google Cloud 客户端库中为 Cloud Storage 提供了符合语言习惯的 Ruby 客户端,让您可以在 App Engine 应用中使用 Cloud Storage 存储和检索数据。

从 Cloud Storage 存储分区传送文件的示例

下面这个简单的示例创建一个 Cloud Storage 存储分区,并使用 Cloud SDK 上传静态资源:

  1. 创建存储分区。通常以项目 ID 命名存储分区(并非必需)。存储分区名称必须保持全局唯一。

    gsutil mb gs://<your-bucket-name>
    
  2. 设置 ACL,授予对存储分区中内容的读取访问权限。

    gsutil defacl set public-read gs://<your-bucket-name>
    
  3. 将内容上传到存储分区。rsync 命令通常是上传和更新资源最快速、最便捷的方法。此外,您也可以使用 cp

    gsutil -m rsync -r ./static gs://<your-bucket-name>/static
    

现在,您可以通过 https://storage.googleapis.com/<your-bucket-name>/static/... 访问静态资源了。

如需详细了解如何使用 Cloud Storage 传送静态资源(包括如何从自定义域名进行传送),请参阅如何托管静态网站

从其他 Google Cloud 服务传送文件

您还可以选择使用 Cloud CDN 或其他 Google Cloud 存储服务。

直接从您的应用传送文件

从应用传送文件通常较为简单,但应注意这种方式存在以下两个弊端:

  • 针对静态文件的请求会使用本可用于动态请求的资源。
  • 从应用传送文件可能会导致响应延迟(具体取决于您的配置),还可能影响系统何时创建新实例来处理负载。

通过应用传送静态文件的示例

大多数 Web 框架均支持传送静态文件。

Sinatra

Sinatra 网络框架默认从 ./public 目录传送文件。此应用包含一个指向 /application.css 的视图。

doctype html
html
  head
    title Serving Static Files
    link rel="stylesheet" href="/application.css"
    script src="/application.js"
  body
    p This is a static file serving example.

样式表位于 ./public/application.css,从 /application.css 传送。

body {
  font-family: Verdana, Helvetica, sans-serif;
  background-color: #CCCCFF;
}

Ruby on Rails

Ruby on Rails网络框架默认从 ./public 目录传送文件。Rails 资源流水线也可以生成静态 JavaScript 和 CSS 文件。

此示例应用的布局视图包含应用的所有样式表:

doctype html
html
  head
    title Serving Static Files
    = stylesheet_link_tag "application", media: "all"
    = javascript_include_tag "application"
    = csrf_meta_tags
  body
    = yield

样式表本身是位于 ./app/assets/stylesheets/main.css.sassSass 文件。

body
  font-family: Verdana, Helvetica, sans-serif
  background-color: #CCCCFF

默认情况下,Rails 应用在生产环境中运行时不会生成或传送静态资源。

Ruby 运行时会在部署期间执行 rake assets:precompile 来生成静态资源,并设置 RAILS_SERVE_STATIC_FILES 环境变量以在生产环境中实现静态文件传送。

从第三方内容分发网络进行传送

您可以使用任何外部第三方 CDN 传送静态文件并缓存动态请求,但您的应用可能会遇到延迟和费用增加的情况。

为了提升性能,您应该使用支持 CDN Interconnect 的第三方 CDN。