mirror of
https://github.com/nais/wonderwall.git
synced 2026-05-07 08:57:07 +00:00
Reduces IdleConnTimeout to 5 seconds. Reverse proxying to a server that has a shorter keep-alive may cause "EOF" and "connection reset by peer" issues as the connections may be closed by the upstream before our client notices.
74 lines
1.3 KiB
Go
74 lines
1.3 KiB
Go
package server
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"os"
|
|
"os/signal"
|
|
"sync"
|
|
"syscall"
|
|
"time"
|
|
|
|
"github.com/go-chi/chi/v5"
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
"github.com/nais/wonderwall/pkg/config"
|
|
)
|
|
|
|
var (
|
|
defaultTransport *http.Transport
|
|
once sync.Once
|
|
)
|
|
|
|
func DefaultTransport() *http.Transport {
|
|
once.Do(func() {
|
|
t := http.DefaultTransport.(*http.Transport).Clone()
|
|
t.MaxIdleConns = 200
|
|
t.MaxIdleConnsPerHost = 100
|
|
t.IdleConnTimeout = 5 * time.Second
|
|
|
|
defaultTransport = t
|
|
})
|
|
|
|
return defaultTransport
|
|
}
|
|
|
|
func Start(cfg *config.Config, r chi.Router) error {
|
|
server := http.Server{
|
|
Addr: cfg.BindAddress,
|
|
Handler: r,
|
|
}
|
|
|
|
serverCtx, serverStopCtx := context.WithCancel(context.Background())
|
|
|
|
sig := make(chan os.Signal, 1)
|
|
signal.Notify(sig, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
|
|
go func() {
|
|
<-sig
|
|
|
|
shutdownCtx, shutdownStopCtx := context.WithTimeout(serverCtx, 20*time.Second)
|
|
|
|
go func() {
|
|
<-shutdownCtx.Done()
|
|
if shutdownCtx.Err() == context.DeadlineExceeded {
|
|
log.Fatal("graceful shutdown timed out.. forcing exit.")
|
|
}
|
|
}()
|
|
|
|
err := server.Shutdown(shutdownCtx)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
shutdownStopCtx()
|
|
serverStopCtx()
|
|
}()
|
|
|
|
err := server.ListenAndServe()
|
|
if err != nil && err != http.ErrServerClosed {
|
|
return err
|
|
}
|
|
|
|
<-serverCtx.Done()
|
|
return nil
|
|
}
|