在 Go 中使用默认 ServeMux 的服务器使用多个侦听器(HTTP 和 HTTPS)是否安全?

问题描述 投票:0回答:1

我正在尝试使用带有默认 http.ServeMux 的 http.server 在 Go 应用程序上设置 HTTP 和 HTTPS 服务器。具体来说,我希望一个侦听器处理 HTTP 流量,另一个侦听器处理 HTTPS 流量。但是,我担心在同一服务器上运行两个侦听器的安全性和性能影响。

以这种方式使用多个侦听器是否安全且明智?同时处理 HTTP 和 HTTPS 请求时,默认的 http.ServeMux 是否存在任何潜在问题?

我尝试为 HTTP 和 HTTPS 创建单独的侦听器。

server := &http.server{
  ...
} // http server

httpListener, err := net.Listen("tcp", ":8080") // Http listener
httpsListener, err := net.Listen("tcp", ":8081") // Https listener

wg := &sync.WaitGroup{}
wg.Add(2)

// Start the http and https server via different go-routines
go func(){
   defer wg.Done()
   server.ServerTLS(httpsListener, certFile, keyFile)
}

go func(){
   defer wg.Done()
   server.Serve(httpListener)
}

wg.Wait()

我预计它会起作用,但我不确定此设置是否安全,或者是否可能导致并发性、安全性或多路复用器本身出现任何问题。

go http https concurrency http.server
1个回答
0
投票

我必须在工作中编写一个微服务,在单独的端口上发布 API,并在不同的端口上发布 Prometheus 指标。我完全按照你的做法。到现在已经运行了五年了。到目前为止我还没有发现任何安全问题。

有一件事我五年前没有考虑到。如果 kubernetes 关闭了 POD,那么我应该在关闭之前进行扫描。我不会那样做。作为建议,我建议您查看 Mat Ryer 的“优雅地响应 Ctrl+C 中断信号”。

© www.soinside.com 2019 - 2024. All rights reserved.