Корректный порядок: перехватить сигнал завершения (SIGINT/SIGTERM), вызвать server.Shutdown(ctx) с context с таймаутом. Shutdown перестаёт принимать новые соединения и ждёт завершения активных запросов; по истечении ctx соединения обрываются.
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer stop()
srv := &http.Server{Addr: ":8080", Handler: mux}
go srv.ListenAndServe()
<-ctx.Done()
shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
srv.Shutdown(shutdownCtx)
Close() сразу обрывает все соединения; Shutdown даёт время дообработать запросы.