我有一個Go程序託管在localhost:8080
上的簡單HTTP服務,因此我可以通過proxy_pass
指令將我的公開nginx
主機連接到它,作爲反向代理服務我網站的部分請求。這一切都很好,沒有問題。如何在Go編程語言中可靠地取消鏈接()一個Unix域套接字
我想將Go程序轉換爲在Unix域套接字上承載HTTP服務,而不是本地TCP套接字,以提高安全性並減少TCP不必要的協議開銷。
問題: 問題是Unix域套接字不能重複使用,一旦他們bind()
來,即使程序終止後。第二次(以及之後)我運行Go程序時,它會以致命錯誤"address already in use"
退出。
通常的做法是到unlink()
當服務器關閉時,Unix域套接字(即刪除文件)。但是,這在Go中很棘手。我的第一個嘗試是在我的主func中使用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)))
}
HTTP ://stackoverflow.com/questions/11268943/golang-is-it-possible-to-capture-a-ctrlc-sigterm-signal-and-run-a-cleanup-fu – thwd
@Tom謝謝。這個問題/答案已經過去了一年,Go仍然在不斷改進,所以我想看看是否有新的東西出現。 –
在第一行之前嘗試'os.Remove(「/ tmp/mysocket」)',它工作嗎? –