Maison > développement back-end > Golang > 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 ?

王林
Libérer: 2024-02-09 20:27:09
avant
529 Les gens l'ont consulté

为什么我的 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{})
   }
}
Copier après la connexion

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,
    }
Copier après la connexion

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 de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal