Mam program Go hostujący prostą usługę HTTP pod numerem localhost:8080
, dzięki czemu mogę podłączyć do niego mój publiczny host nginx
poprzez dyrektywę proxy_pass
, jako odwrotne proxy do wyświetlenia część żądań mojej witryny. To wszystko działa świetnie, bez problemów.Jak skutecznie rozłączyć() gniazdo domeny uniksowej w języku programowania Go
Chcę przekonwertować program Go na host usługi HTTP na gniazdo domeny uniksowej zamiast lokalnego gniazda TCP w celu poprawy bezpieczeństwa i zmniejszenia niepotrzebnego obciążenia protokołu TCP.
PROBLEM: Problem polega na tym, że gniazda Unix domeny nie może być ponownie użyty raz są bind()
się, nawet po zakończeniu programu. Za drugim razem (i za każdym razem po) uruchamiam program Go, który kończy się z błędem krytycznym "address already in use"
.
Powszechną praktyką jest unlink()
gniazd domen uniksowych (to znaczy usunięcie pliku) po wyłączeniu serwera. Jednak w Go to jest trudne. Moją pierwszą próbą było użycie instrukcji defer
w moim głównym funku (zobacz poniżej), ale nie jest ona uruchamiana, jeśli przerywam proces sygnałem takim jak CTRL-C. Przypuszczam, że tego można się spodziewać. Rozczarowujące, ale nie niespodziewane.
PYTANIE: Czy istnieje najlepszych praktyk, jak unlink()
gniazdo gdy proces serwera wyłącza (albo wdzięcznie lub niezgrabnie)?
Oto część mojego func main()
który uruchamia serwer nasłuchuje na odniesienie:
// 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 Dzięki. To pytanie/odpowiedź ma rok i Go wciąż się poprawia, więc chciałem zobaczyć, czy coś nowego/lepszego pojawiło się. –
Spróbuj 'os.Remove ("/tmp/mysocket ")' przed pierwszym wierszem, czy działa? –