Graceful HTTP Server Shutdown
Listen for termination signals and shut an HTTP server down gracefully so in-flight requests finish before the process exits.
Code
package main
import (
"context"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
server := &http.Server{Addr: ":8080", Handler: http.NewServeMux()}
go func() {
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("listen: %v", err)
}
}()
stop := make(chan os.Signal, 1)
signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM)
<-stop
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
if err := server.Shutdown(ctx); err != nil {
log.Fatalf("shutdown: %v", err)
}
log.Println("server stopped cleanly")
}Report a problem with this exampleOpens a pre-filled issue on GitHub.