From 0431986dbe95913ff3103e34f47d86fbb45bc52e Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Tue, 19 Nov 2019 19:08:01 +0000 Subject: [PATCH 1/2] Graceful: Allow graceful restart for fcgi My previous interpretation was incorrect - we do not handle sockets being passed in over stdin --- cmd/web.go | 16 +--------------- cmd/web_graceful.go | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/cmd/web.go b/cmd/web.go index 22a7f9082db12..4305a3bc2dd72 100644 --- a/cmd/web.go +++ b/cmd/web.go @@ -8,7 +8,6 @@ import ( "fmt" "net" "net/http" - "net/http/fcgi" _ "net/http/pprof" // Used for debugging if enabled and a web server is running "os" "strings" @@ -185,20 +184,7 @@ func runWeb(ctx *cli.Context) error { err = runHTTPS(listenAddr, setting.CertFile, setting.KeyFile, context2.ClearHandler(m)) case setting.FCGI: NoHTTPRedirector() - // FCGI listeners are provided as stdin - this is orthogonal to the LISTEN_FDS approach - // in graceful and systemD - NoMainListener() - var listener net.Listener - listener, err = net.Listen("tcp", listenAddr) - if err != nil { - log.Fatal("Failed to bind %s: %v", listenAddr, err) - } - defer func() { - if err := listener.Close(); err != nil { - log.Fatal("Failed to stop server: %v", err) - } - }() - err = fcgi.Serve(listener, context2.ClearHandler(m)) + err = runFCGI(listenAddr, context2.ClearHandler(m)) case setting.UnixSocket: // This could potentially be inherited using LISTEN_FDS but currently // these cannot be inherited diff --git a/cmd/web_graceful.go b/cmd/web_graceful.go index a37f669d09093..3a0256d2d156c 100644 --- a/cmd/web_graceful.go +++ b/cmd/web_graceful.go @@ -6,9 +6,12 @@ package cmd import ( "crypto/tls" + "net" "net/http" + "net/http/fcgi" "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/log" ) func runHTTP(listenAddr string, m http.Handler) error { @@ -33,3 +36,17 @@ func NoHTTPRedirector() { func NoMainListener() { graceful.Manager.InformCleanup() } + +func runFCGI(listenAddr string, m http.Handler) error { + // This needs to handle stdin as fcgi point + fcgiServer := graceful.NewServer("tcp", listenAddr) + + err := fcgiServer.ListenAndServe(func(listener net.Listener) error { + return fcgi.Serve(listener, m) + }) + if err != nil { + log.Fatal("Failed to start FCGI main server: %v", err) + } + log.Info("FCGI Listener: %s Closed", listenAddr) + return err +} From 37a9b73629d683d0a457875f2cf9ae7a43612777 Mon Sep 17 00:00:00 2001 From: zeripath Date: Sun, 24 Nov 2019 07:59:44 +0000 Subject: [PATCH 2/2] Update web.go --- cmd/web.go | 1 - 1 file changed, 1 deletion(-) diff --git a/cmd/web.go b/cmd/web.go index dd746e0925087..3c346ef87a076 100644 --- a/cmd/web.go +++ b/cmd/web.go @@ -6,7 +6,6 @@ package cmd import ( "fmt" - "net" "net/http" _ "net/http/pprof" // Used for debugging if enabled and a web server is running "os"