Ruby 執行階段

Ruby 執行階段是一種軟體堆疊,負責安裝應用程式程式碼和依附元件,然後在彈性環境中執行該應用程式。

Ruby 版本

Ruby 3.4 使用Buildpack。如需支援的 Ruby 版本完整清單及其對應的 Ubuntu 版本,請參閱「Runtime support schedule」。

如要使用支援的 Ruby 版本,您必須:

  • Gemfile 中指定 Ruby 版本。

    RUBY VERSION
      ruby 3.4.x
    
  • 安裝 420.0.0 以上版本的 gcloud CLI。您可以執行 gcloud components update 指令來更新 CLI 工具。如要查看已安裝的版本,您可以執行 gcloud version 指令。

  • app.yaml 檔案中指定 operating_system 設定:

      runtime: ruby
      env: flex
    
      runtime_config:
          operating_system: "ubuntu22"
    
  • 您也可以在應用程式目錄中使用 .ruby-version 檔案,指定 Ruby 解譯器的版本。例如:3.4.x

舊版本

如要使用 Ruby 執行階段 3.1 以下版本,請在應用程式目錄中使用 .ruby-version 檔案指定 Ruby 解譯器版本。

如果這個檔案存在,當您使用 rbenv 部署應用程式時,執行階段會安裝要求的 Ruby 版本。如果要求的版本無法安裝,App Engine 會在部署期間顯示錯誤訊息。

如果您未提供 .ruby-version 檔案,Ruby 執行階段會預設為 2.7 版。請注意,預設設定隨時可能變更,因此建議您為應用程式指定 Ruby 版本。

支援其他 Ruby 執行階段

如果您需要使用不支援的 Ruby 版本,可以建立自訂執行階段,並選取含有所需 Ruby 版本的有效基礎映像檔。

如需瞭解 Google 提供的基本映像檔或 Docker Ruby 基本映像檔,請參閱「建構自訂執行階段」一文。

依附元件

執行階段會在應用程式的來源目錄中尋找 Gemfile 檔案,並在啟動應用程式前使用 Bundler 安裝任何依附元件。如要進一步瞭解如何宣告及管理套件,請參閱「使用 Ruby 程式庫」一文。

搭配使用 C 資料庫與 Ruby

針對需要 C 擴充功能的 Ruby 資料庫,當前 Ruby 版本的標頭和下列 Ubuntu 套件都已預先安裝在系統中。

  • autoconf
  • build-essential
  • ca-certificates
  • cmake
  • curl
  • file
  • git
  • imagemagick
  • libcurl3
  • libcurl3-gnutls
  • libcurl4-openssl-dev
  • libffi-dev
  • libgdbm-dev
  • libgit2-dev
  • libgmp-dev
  • libicu-dev
  • libjemalloc-dev
  • libjemalloc1
  • libmagickwand-dev
  • libmysqlclient-dev
  • libncurses5-dev
  • libpq-dev
  • libqdbm-dev
  • libreadline6-dev
  • libsqlite3-dev
  • libssl-dev
  • libxml2-dev
  • libxslt-dev
  • libyaml-dev
  • libz-dev
  • systemtap
  • tzdata

這些套件可允許安裝最熱門的 Ruby 資料庫。如果您的應用程式需要額外的作業系統層級依附元件,您需要以此執行階段為基礎,使用自訂執行階段,才能安裝適當套件。

啟動應用程式

執行階段會使用 app.yaml 中定義的 entrypoint 啟動應用程式。此進入點應啟動程序,在 PORT 環境變數定義的通訊埠回應 HTTP 要求。例如:

entrypoint: bundle exec rails server -p $PORT

大多數網頁應用程式均使用支援 Rack 的網路伺服器,例如 PumaUnicornThin

您必須在應用程式的 Gemfile 設定檔中,將伺服器新增為依附元件。執行階段會在呼叫進入點之前安裝所有依附元件。

source "https://rubygems.org"

gem "rack"
gem "puma"

針對 Rails 應用程式使用 Puma 的進入點範例如下:

entrypoint: bundle exec rails server Puma -p $PORT

針對任何 Rack 應用程式使用 Puma 的進入點範例如下:

entrypoint: bundle exec rackup -s Puma -p $PORT

如果應用程式不需要 Rack 伺服器即可處理要求,您可以直接執行 Ruby 指令碼:

entrypoint: bundle exec ruby app.rb

環境變數

執行階段環境會設定下列環境變數:

環境變數 說明
GAE_INSTANCE 目前執行個體的名稱。
GAE_MEMORY_MB 應用程式程序可用的記憶體量。
GAE_SERVICE 應用程式的 app.yaml 檔案中指定的服務名稱;如果未指定服務名稱,則設為 default
GAE_VERSION 目前應用程式的版本標籤。
GOOGLE_CLOUD_PROJECT 與應用程式相關聯的專案 ID,會在 Google Cloud 控制台上顯示
PORT 接收 HTTP 要求的通訊埠。
RACK_ENV 設為 production
RAILS_ENV 設為 production
RAILS_SERVE_STATIC_FILES 設為 true

您可以使用 app.yaml 設定其他環境變數。

中繼資料伺服器

您應用程式中的每個執行個體都可以使用 Compute Engine 中繼資料伺服器查詢與該執行個體相關的資訊,包括主機名稱、外部 IP 位址、執行個體 ID、自訂中繼資料,以及服務帳戶資訊。雖然 App Engine 不允許您為每個執行個體設定自訂中繼資料,但是您可以設定全專案的自訂中繼資料,並從您的 App Engine 及 Compute Engine 執行個體讀取該中繼資料。

這個函式範例使用中繼資料伺服器,以取得執行個體的外部 IP 位址。

require "sinatra"
require "net/http"

get "/" do
  uri = URI.parse(
    "http://metadata.google.internal/computeMetadata/v1" +
    "/instance/network-interfaces/0/access-configs/0/external-ip"
  )

  request = Net::HTTP::Get.new uri.path
  request.add_field "Metadata-Flavor", "Google"

  http = Net::HTTP.new uri.host, uri.port

  response = http.request request

  "External IP: #{response.body}"
end