我有一个Go程序,在本地HTTP服务的localhost:8080
上托管一个简单的HTTP服务,以便通过proxy_pass
指令将公共nginx
主机连接到它,作为反向代理来处理网站请求的一部分。这一切都很好,没有问题。
我想将Go程序转换为在Unix域套接字上托管HTTP服务,而不是在本地TCP套接字上托管,以提高安全性并减少TCP的不必要协议开销。
问题:
问题是Unix域套接字一旦被bind()
后就无法再次使用,即使在程序终止后也是如此。第二次(以及之后每一次)运行Go程序时,它会退出,并显示致命错误"address already in use"
。
通常做法是在服务器关闭时unlink()
Unix域套接字(即删除文件)。然而,在Go中这很棘手。我的第一次尝试是在我的主函数中使用defer
语句(见下文),但如果我使用CTRL-C等信号中断进程,则不会运行它。我想这是可以预料的。令人失望,但不出所料。
问题:是否有最佳实践可以在服务器进程关闭时(无论是优雅地还是不优雅地)unlink()
套接字?
以下是我启动服务器监听的func main()
的部分参考代码:
// Create the HTTP server listening on the requested socket:
l, err := net.Listen("unix", "/tmp/mysocket")
if err != nil {
log.Fatal(err)
} else {
// Unix sockets must be unlink()ed before being reused again.
// Unfortunately, this defer is not run when a signal is received, e.g. CTRL-C.
defer func() {
os.Remove("/tmp/mysocket")
}()
log.Fatal(http.Serve(l, http.HandlerFunc(indexHtml)))
}
os.Remove("/tmp/mysocket")
,它是否有效? - Shane Hou