シンプルな HTTP サービスをホストする Go プログラムがあるので、サイトのリクエストの一部を処理するリバース プロキシとして、ディレクティブを介しlocalhost:8080
てパブリックnginx
ホストをそれに接続できます。proxy_pass
これはすべてうまく機能しており、問題はありません。
セキュリティを向上させ、TCP の不要なプロトコル オーバーヘッドを削減するために、ローカル TCP ソケットではなく Unix ドメイン ソケットで HTTP サービスをホストするように Go プログラムを変換したいと考えています。
問題bind()
: 問題は、プログラムが終了した後でも、Unix ドメイン ソケットを再利用できないことです。2 回目 (およびそれ以降) に 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)))
}