← ко всем постам
2026-07-10 · #web

Graceful shutdown HTTP-сервера

Просто убить процесс — плохо: запросы в полёте оборвутся, транзакции не докатятся. Правильный способ — поймать сигнал ОС и вызвать Shutdown.

srv := &http.Server{Addr: ":8080"}
go srv.ListenAndServe()

quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGTERM, syscall.SIGINT)
<-quit

ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
srv.Shutdown(ctx)

Shutdown перестаёт принимать новые соединения, но ждёт завершения активных — в пределах таймаута из контекста. Ровно тот случай, где context из раннего поста работает по назначению.

В контейнерах это критично: оркестратор шлёт SIGTERM перед остановкой пода, и корректный shutdown избавляет от оборванных запросов при выкатке.