Graceful: Allow graceful restart for fcgi (#9112)
* Graceful: Allow graceful restart for fcgi My previous interpretation was incorrect - we do not handle sockets being passed in over stdin * Update web.go
This commit is contained in:
parent
d779deef6e
commit
7523314ef8
2 changed files with 18 additions and 16 deletions
17
cmd/web.go
17
cmd/web.go
|
@ -6,9 +6,7 @@ package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/fcgi"
|
|
||||||
_ "net/http/pprof" // Used for debugging if enabled and a web server is running
|
_ "net/http/pprof" // Used for debugging if enabled and a web server is running
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -185,20 +183,7 @@ func runWeb(ctx *cli.Context) error {
|
||||||
err = runHTTPS("tcp", listenAddr, setting.CertFile, setting.KeyFile, context2.ClearHandler(m))
|
err = runHTTPS("tcp", listenAddr, setting.CertFile, setting.KeyFile, context2.ClearHandler(m))
|
||||||
case setting.FCGI:
|
case setting.FCGI:
|
||||||
NoHTTPRedirector()
|
NoHTTPRedirector()
|
||||||
// FCGI listeners are provided as stdin - this is orthogonal to the LISTEN_FDS approach
|
err = runFCGI(listenAddr, context2.ClearHandler(m))
|
||||||
// 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))
|
|
||||||
case setting.UnixSocket:
|
case setting.UnixSocket:
|
||||||
NoHTTPRedirector()
|
NoHTTPRedirector()
|
||||||
err = runHTTP("unix", listenAddr, context2.ClearHandler(m))
|
err = runHTTP("unix", listenAddr, context2.ClearHandler(m))
|
||||||
|
|
|
@ -6,9 +6,12 @@ package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/http/fcgi"
|
||||||
|
|
||||||
"code.gitea.io/gitea/modules/graceful"
|
"code.gitea.io/gitea/modules/graceful"
|
||||||
|
"code.gitea.io/gitea/modules/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
func runHTTP(network, listenAddr string, m http.Handler) error {
|
func runHTTP(network, listenAddr string, m http.Handler) error {
|
||||||
|
@ -33,3 +36,17 @@ func NoHTTPRedirector() {
|
||||||
func NoMainListener() {
|
func NoMainListener() {
|
||||||
graceful.Manager.InformCleanup()
|
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
|
||||||
|
}
|
||||||
|
|
Reference in a new issue