localhost:8080
に簡単なHTTPサービスをホストしているGoプログラムがあるので、proxy_pass
ディレクティブを使用して公開するnginx
ホストをリバースプロキシとして接続します私のサイトの要求の一部。これはすごくうまくいっていて問題はありません。Goプログラミング言語でUnixドメインソケットを確実にunlink()する方法
セキュリティを強化し、TCPの不要なプロトコルオーバーヘッドを減らすために、GoプログラムをローカルTCPソケットの代わりにUnixドメインソケットでホストするように変換したいとします。
問題: 問題は、彼らがにbind()
あるいったんUNIXドメインソケットでもプログラム終了後、再利用することができないということです。 2回目(そして毎回)、Goプログラムを実行して致命的なエラー"address already in use"
で終了します。
通常、サーバがシャットダウンすると、unlink()
Unixドメインソケット(ファイルを削除)が行われます。しかし、これはGoでは難しいです。私の最初の試みは、メインのfunc(下記参照)にdefer
文を使用することでしたが、CTRL-Cのようなシグナルでプロセスを中断すると実行されません。これが期待されると思います。失望していますが、予期せぬものではありません。
QUESTION:サーバプロセスが(どちらか正常または不正に)シャットダウン時にソケットを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 ")'を試してください、それは動作していますか? –