首頁 >後端開發 >Golang >為什麼我的 Postman 和 nginX 中的 502 上的套接字掛起,而 Gin-Gonic 在這兩種情況下都會返回 StatusOk?

為什麼我的 Postman 和 nginX 中的 502 上的套接字掛起,而 Gin-Gonic 在這兩種情況下都會返回 StatusOk?

王林
王林轉載
2024-02-09 20:27:09380瀏覽

为什么我的 Postman 和 nginX 中的 502 上的套接字挂起,而 Gin-Gonic 在这两种情况下都返回 StatusOk?

php小編柚子在這篇文章中將為大家解答一個常見問題:「為什麼我的Postman 和nginX 中的502 上的套接字掛起,而Gin- Gonic 在這兩種情況下都會回傳StatusOk?」這個問題牽涉到不同的網路框架和伺服器的行為差異,我們將分析其中的原因並給出解決方案,幫助讀者解決類似的問題。

問題內容

為了簡化我的問題,我有一條很長的路線,可能需要長達 2 分鐘才能回傳回應。現在這是我的範例 http 處理程序:

func GetHealth(svc *service.Hotel) gin.HandlerFunc {
   return func(c *gin.Context) {
      time.Sleep(30 * time.Second)
      c.JSON(200, gin.H{})
   }
}

現在,當我呼叫[GET] /health 路由郵差回傳Error: 套接字掛起 在從gin-gonic 回傳回應的確切時間,記錄了200 Ok:

[GIN] 2024/01/24 - 11:10:58 | 200 | 200 30.084587215s | ::1 |取得「/health」

現在,在 nginX 後面作為反向代理的同一個項目,當我的服務記錄了 200 Ok 時,我在 API 回應上收到 502 nginX 錯誤。

問題是為什麼我在 gin-gonic 已成功回傳回應的情況下在客戶端收到錯誤?我該如何解決這個問題?

我使用了 github.com/gin-contrib/timeout 函式庫,因為我認為它與路由逾時有關,但沒有成功。

解決方法

gin-gonic 中,您可以在http.Server 上設定WriteTimeout 以防止socket 掛起 或nginx 502。

有趣的是,即使逾時,它總是記錄 200,但客戶端會收到錯誤:

srv := &http.Server{
        Addr: ":9000",
        // Good practice to set timeouts to avoid Slowloris attacks.
        WriteTimeout: time.Second * 120, // THIS TIMEOUT NEEDS TO BE SET
        ReadTimeout:  time.Second * 15,
        IdleTimeout:  time.Second * 60,
        Handler:      router,
    }

以上是為什麼我的 Postman 和 nginX 中的 502 上的套接字掛起,而 Gin-Gonic 在這兩種情況下都會返回 StatusOk?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除