跳到內容

部署

Gin 專案可以輕鬆部署到任意雲主機商。

Koyeb

Koyeb 是一個開發者友善的無伺服器平台,可透過基於 Git 的部署在全球部署應用程式,支援 TLS 加密、本地自動擴展、全球邊緣網絡,以及內建的服務網格與發現功能。

請參照 Koyeb 指南部署您的 Gin 專案

Qovery

Qovery 提供免費的雲端主機托管,包括資料庫、SSL、全球 CDN,以及使用 Git 進行自動部署。

請參照 Qovery 指南來部署您的 Gin 項目

Render

Render 是一個原生支援 Go 語言的現代化雲平台,並支持管理 SSL、資料庫、不停機部署、HTTP/2 和 websocket。

請參考 Render 文件部署 Gin 專案.

Google App Engine

GAE 提供兩種方式部署 Go 應用。標準環境簡單使用但是比較客製化,且出於安全考量禁止使用 syscalls。在靈活的還輕可以運行任何框架跟套件。

前往 Google App Engine 了解更多並選擇您喜歡的環境。

自主部署

Gin 專案也可以採用自主部署的方式。部署架構和安全性考量會依據目標環境而有所不同。以下章節僅提供規劃部署時需要考慮的設定選項概觀。

設定選項

Gin 專案部署可以透過環境變數或直接在程式碼中進行調整。

以下是可用於設定 Gin 的環境變數:

環境變數說明
PORT使用 router.Run() 啟動 Gin 伺服器時要監聽的 TCP 連接埠(即不帶任何參數時)。
GIN_MODE可設定為 debugreleasetest。用於管理 Gin 模式,例如是否輸出除錯資訊。也可以在程式碼中使用 gin.SetMode(gin.ReleaseMode)gin.SetMode(gin.TestMode) 來設定。

以下程式碼可用於設定 Gin:

// 不指定 Gin 的綁定位址或連接埠。預設會綁定在所有介面的 8080 連接埠。
// 使用不帶參數的 `Run()` 時可透過 `PORT` 環境變數更改監聽連接埠。
router := gin.Default()
router.Run()
// 指定 Gin 的綁定位址和連接埠。
router := gin.Default()
router.Run("192.168.1.100:8080")
// 只指定監聽連接埠。將綁定在所有介面。
router := gin.Default()
router.Run(":8080")
// 設定哪些 IP 位址或 CIDR 被視為可信任的代理,用於設定紀錄真實客戶端 IP 的標頭。
// 詳細資訊請參閱文件。
router := gin.Default()
router.SetTrustedProxies([]string{"192.168.1.2"})

不要信任所有代理

Gin 允許您指定哪些標頭可以保存真實的客戶端 IP(如果有的話),以及指定您信任哪些代理(或直接客戶端)可以設定這些標頭。

gin.Engine 上使用 SetTrustedProxies() 函式來指定可信任的網路位址或網路 CIDR,這些來源的請求標頭中與客戶端 IP 相關的資訊將被視為可信任。可以是 IPv4 位址、IPv4 CIDR、IPv6 位址或 IPv6 CIDR。

注意: 如果您沒有使用上述函式指定可信任的代理,Gin 預設會信任所有代理,這是不安全的。同時,如果您不使用任何代理,可以使用 Engine.SetTrustedProxies(nil) 來停用此功能,這樣 Context.ClientIP() 將直接回傳遠端位址,避免不必要的運算。

import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
router.SetTrustedProxies([]string{"192.168.1.2"})
router.GET("/", func(c *gin.Context) {
// 如果客戶端是 192.168.1.2,則使用 X-Forwarded-For
// 標頭中可信任的部分來推斷原始客戶端 IP。
// 否則,直接回傳客戶端 IP
fmt.Printf("ClientIP: %s\n", c.ClientIP())
})
router.Run()
}

提醒: 如果您使用 CDN 服務,可以設定 Engine.TrustedPlatform 來跳過 TrustedProxies 檢查,它的優先順序高於 TrustedProxies。 請看以下範例:

import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
// 使用預定義的標頭 gin.PlatformXXX
// Google App Engine
router.TrustedPlatform = gin.PlatformGoogleAppEngine
// Cloudflare
router.TrustedPlatform = gin.PlatformCloudflare
// Fly.io
router.TrustedPlatform = gin.PlatformFlyIO
// 或者,您可以設定自己的可信任請求標頭。但請確保您的 CDN
// 會防止使用者傳遞此標頭!例如,如果您的 CDN 將客戶端 IP
// 放在 X-CDN-Client-IP 中:
router.TrustedPlatform = "X-CDN-Client-IP"
router.GET("/", func(c *gin.Context) {
// 如果您設定了 TrustedPlatform,ClientIP() 將會解析
// 對應的標頭並直接回傳 IP
fmt.Printf("ClientIP: %s\n", c.ClientIP())
})
router.Run()
}