我有一个托管简单 HTTP 服务的 Go 程序,localhost:8080
因此我可以nginx
通过该指令将我的公共主机连接到它proxy_pass
,作为反向代理来服务我网站的部分请求。这一切都很好,没有问题。
我想将 Go 程序转换为在 Unix 域套接字而不是本地 TCP 套接字上托管 HTTP 服务,以提高安全性并减少 TCP 的不必要的协议开销。
问题bind()
:问题是 Unix 域套接字一旦被重用,即使在程序终止后也不能重用。第二次(以及之后的每次)我运行 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)))
}