Maison  >  Article  >  développement back-end  >  Pourquoi mes sockets se bloquent-elles avec 502 dans Postman et nginX alors que Gin-Gonic renvoie StatusOk dans les deux cas ?

Pourquoi mes sockets se bloquent-elles avec 502 dans Postman et nginX alors que Gin-Gonic renvoie StatusOk dans les deux cas ?

王林
王林avant
2024-02-09 20:27:09328parcourir

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

L'éditeur php Yuzi répondra à une question courante pour tout le monde dans cet article : "Pourquoi mes sockets se bloquent-ils sur 502 dans Postman et nginX, alors que Gin-Gonic échoue dans les deux cas ? Return StatusOk ? » le comportement de différents cadres de réseau et serveurs. Nous analyserons les raisons et donnerons des solutions pour aider les lecteurs à résoudre des problèmes similaires.

Contenu de la question

Pour simplifier mon problème, j'ai un parcours très long qui peut prendre jusqu'à 2 minutes pour renvoyer une réponse. Voici maintenant mon exemple de gestionnaire http :

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

Maintenant, quand j'appelle [GET] /health 路由邮递员返回 Error: 套接字挂起 在从 gin-gonic 返回响应的确切时间,记录了 200 Ok :

[GIN] 2024/01/24 - 11:10:58 | 200 | 200 30.084587215s | ::1 |获取“/health”

Maintenant, avec le même projet derrière nginX comme proxy inverse, j'obtiens une erreur 502 nginX sur la réponse de l'API lorsque mon service se connecte 200 Ok .

La question est Pourquoi est-ce que j'obtiens une erreur côté client même si gin-gonic a renvoyé une réponse avec succès ? Comment puis-je résoudre ce problème?

J'ai utilisé la bibliothèque github.com/gin-contrib/timeout car je pensais que c'était lié aux délais d'attente de routage, mais sans succès. github.com/gin-contrib/timeout 库,因为我认为它与路由超时有关,但没有成功。

解决方法

gin-gonic 中,您可以在 http.Server 上设置 WriteTimeout 以防止 socket 挂起

Solution de contournement

Dans gin-gonic, vous pouvez définir WriteTimeout sur http.Server pour empêcher le socket de se bloquer ou nginx 502. 🎜 🎜Fait intéressant, même s'il expire, il enregistre toujours 200, mais le client obtient l'erreur : 🎜
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,
    }

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer