Ich habe ein Go-Programm, das einen einfachen HTTP-Service unter localhost:8080
hostet, so dass ich meinen öffentlichen nginx
-Host über die proxy_pass
-Direktive als Reverse-Proxy verbinden kann Teil der Anfragen meiner Website. Das funktioniert alles super, keine Probleme dort.Wie man einen Unix-Domain-Socket in der Programmiersprache Go zuverlässig trennt
Ich möchte das Go-Programm konvertieren, um den HTTP-Dienst auf einem Unix-Domain-Socket anstelle eines lokalen TCP-Sockets für verbesserte Sicherheit zu hosten und den unnötigen Protokoll-Overhead von TCP zu reduzieren.
PROBLEM: Das Problem ist, dass Steckdosen Unix-Domain nicht wiederverwendet werden können, wenn sie bind()
zu, auch nach Beendigung des Programms sind. Das zweite Mal (und jedes Mal danach) führe ich das Go-Programm mit einem schwerwiegenden Fehler "address already in use"
aus.
Gemeinsame Praxis ist unlink()
Unix-Domain-Sockets (d. H. Entfernen Sie die Datei), wenn der Server heruntergefahren wird. Dies ist jedoch schwierig in Go. Mein erster Versuch war, die defer
-Anweisung in meinem Hauptfunc (siehe unten) zu verwenden, aber es wird nicht ausgeführt, wenn ich den Prozess mit einem Signal wie CTRL-C abbringe. Ich nehme an, das ist zu erwarten. Enttäuschend, aber nicht unerwartet.
FRAGE: Gibt es eine bewährte Methode, wie die Steckdose unlink()
, wenn der Server-Prozess (entweder elegant oder ungracefully) heruntergefahren?
Hier ist ein Teil meines func main()
, die den Server als Referenz zu hören beginnt:
// 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 Danke. Diese Frage/Antwort ist ein Jahr alt und Go verbessert sich immer noch, also wollte ich sehen, ob etwas Neues/Besseres aufkam. –
Versuchen Sie 'os.Remove ("/tmp/mysocket ")' vor der ersten Zeile, funktioniert es? –