Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa soket saya digantung dengan 502 dalam Postman dan nginX manakala Gin-Gonic mengembalikan StatusOk dalam kedua-dua kes?

Mengapa soket saya digantung dengan 502 dalam Postman dan nginX manakala Gin-Gonic mengembalikan StatusOk dalam kedua-dua kes?

王林
王林ke hadapan
2024-02-09 20:27:09328semak imbas

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

editor php Yuzi akan menjawab soalan biasa untuk semua orang dalam artikel ini: "Mengapa soket saya digantung pada 502 dalam Posman dan nginX, manakala Gin-Gonic gagal dalam kedua-dua kes "Soalan ini melibatkan perbezaan dalam tingkah laku rangka kerja rangkaian dan pelayan yang berbeza Kami akan menganalisis sebab dan memberikan penyelesaian untuk membantu pembaca menyelesaikan masalah yang sama.

Kandungan soalan

Untuk memudahkan masalah saya, saya mempunyai laluan yang sangat panjang yang boleh mengambil masa sehingga 2 minit untuk membalas respons. Sekarang inilah contoh pengendali http saya:

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

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

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

Kini, dengan projek yang sama di belakang nginX sebagai proksi terbalik, saya mendapat ralat 502 nginX pada respons API apabila perkhidmatan saya dilog 200 Ok .

Persoalannya ialah Mengapa saya mendapat ralat di pihak pelanggan walaupun gin-gonic telah berjaya mengembalikan respons? Bagaimanakah saya boleh menyelesaikan masalah ini?

Saya menggunakan perpustakaan github.com/gin-contrib/timeout kerana saya fikir ia berkaitan dengan penghalaan tamat masa, tetapi tidak berjaya. github.com/gin-contrib/timeout 库,因为我认为它与路由超时有关,但没有成功。

解决方法

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

Penyelesaian

Dalam gin-gonic, anda boleh menetapkan WriteTimeout pada http.Server untuk mengelakkan soket daripada tergantung atau nginx 502. 🎜 🎜Menariknya, walaupun masa tamat, ia sentiasa mencatatkan 200, tetapi pelanggan mendapat ralat: 🎜
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,
    }

Atas ialah kandungan terperinci Mengapa soket saya digantung dengan 502 dalam Postman dan nginX manakala Gin-Gonic mengembalikan StatusOk dalam kedua-dua kes?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam