mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	FCGI: Allow FCGI over unix sockets (#9298)
* FCGI: Allow FCGI over unix sockets * fixup! FCGI: Allow FCGI over unix sockets
This commit is contained in:
		@@ -122,6 +122,7 @@ func runWeb(ctx *cli.Context) error {
 | 
			
		||||
		switch setting.Protocol {
 | 
			
		||||
		case setting.UnixSocket:
 | 
			
		||||
		case setting.FCGI:
 | 
			
		||||
		case setting.FCGIUnix:
 | 
			
		||||
		default:
 | 
			
		||||
			// Save LOCAL_ROOT_URL if port changed
 | 
			
		||||
			cfg := ini.Empty()
 | 
			
		||||
@@ -149,7 +150,7 @@ func runWeb(ctx *cli.Context) error {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	listenAddr := setting.HTTPAddr
 | 
			
		||||
	if setting.Protocol != setting.UnixSocket {
 | 
			
		||||
	if setting.Protocol != setting.UnixSocket && setting.Protocol != setting.FCGIUnix {
 | 
			
		||||
		listenAddr += ":" + setting.HTTPPort
 | 
			
		||||
	}
 | 
			
		||||
	log.Info("Listen: %v://%s%s", setting.Protocol, listenAddr, setting.AppSubURL)
 | 
			
		||||
@@ -183,10 +184,13 @@ func runWeb(ctx *cli.Context) error {
 | 
			
		||||
		err = runHTTPS("tcp", listenAddr, setting.CertFile, setting.KeyFile, context2.ClearHandler(m))
 | 
			
		||||
	case setting.FCGI:
 | 
			
		||||
		NoHTTPRedirector()
 | 
			
		||||
		err = runFCGI(listenAddr, context2.ClearHandler(m))
 | 
			
		||||
		err = runFCGI("tcp", listenAddr, context2.ClearHandler(m))
 | 
			
		||||
	case setting.UnixSocket:
 | 
			
		||||
		NoHTTPRedirector()
 | 
			
		||||
		err = runHTTP("unix", listenAddr, context2.ClearHandler(m))
 | 
			
		||||
	case setting.FCGIUnix:
 | 
			
		||||
		NoHTTPRedirector()
 | 
			
		||||
		err = runFCGI("unix", listenAddr, context2.ClearHandler(m))
 | 
			
		||||
	default:
 | 
			
		||||
		log.Fatal("Invalid protocol: %s", setting.Protocol)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -37,9 +37,9 @@ func NoMainListener() {
 | 
			
		||||
	graceful.Manager.InformCleanup()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func runFCGI(listenAddr string, m http.Handler) error {
 | 
			
		||||
func runFCGI(network, listenAddr string, m http.Handler) error {
 | 
			
		||||
	// This needs to handle stdin as fcgi point
 | 
			
		||||
	fcgiServer := graceful.NewServer("tcp", listenAddr)
 | 
			
		||||
	fcgiServer := graceful.NewServer(network, listenAddr)
 | 
			
		||||
 | 
			
		||||
	err := fcgiServer.ListenAndServe(func(listener net.Listener) error {
 | 
			
		||||
		return fcgi.Serve(listener, m)
 | 
			
		||||
 
 | 
			
		||||
@@ -140,7 +140,7 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`.
 | 
			
		||||
 | 
			
		||||
## Server (`server`)
 | 
			
		||||
 | 
			
		||||
- `PROTOCOL`: **http**: \[http, https, fcgi, unix\]
 | 
			
		||||
- `PROTOCOL`: **http**: \[http, https, fcgi, unix, fcgi+unix\]
 | 
			
		||||
- `DOMAIN`: **localhost**: Domain name of this server.
 | 
			
		||||
- `ROOT_URL`: **%(PROTOCOL)s://%(DOMAIN)s:%(HTTP\_PORT)s/**:
 | 
			
		||||
   Overwrite the automatically generated public URL.
 | 
			
		||||
@@ -155,7 +155,7 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`.
 | 
			
		||||
- `HTTP_ADDR`: **0.0.0.0**: HTTP listen address.
 | 
			
		||||
   - If `PROTOCOL` is set to `fcgi`, Gitea will listen for FastCGI requests on TCP socket
 | 
			
		||||
     defined by `HTTP_ADDR` and `HTTP_PORT` configuration settings.
 | 
			
		||||
   - If `PROTOCOL` is set to `unix`, this should be the name of the Unix socket file to use.
 | 
			
		||||
   - If `PROTOCOL` is set to `unix` or `fcgi+unix`, this should be the name of the Unix socket file to use.
 | 
			
		||||
- `HTTP_PORT`: **3000**: HTTP listen port.
 | 
			
		||||
   - If `PROTOCOL` is set to `fcgi`, Gitea will listen for FastCGI requests on TCP socket
 | 
			
		||||
     defined by `HTTP_ADDR` and `HTTP_PORT` configuration settings.
 | 
			
		||||
 
 | 
			
		||||
@@ -42,6 +42,7 @@ const (
 | 
			
		||||
	HTTP       Scheme = "http"
 | 
			
		||||
	HTTPS      Scheme = "https"
 | 
			
		||||
	FCGI       Scheme = "fcgi"
 | 
			
		||||
	FCGIUnix   Scheme = "fcgi+unix"
 | 
			
		||||
	UnixSocket Scheme = "unix"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -553,6 +554,14 @@ func NewContext() {
 | 
			
		||||
		KeyFile = sec.Key("KEY_FILE").String()
 | 
			
		||||
	case "fcgi":
 | 
			
		||||
		Protocol = FCGI
 | 
			
		||||
	case "fcgi+unix":
 | 
			
		||||
		Protocol = FCGIUnix
 | 
			
		||||
		UnixSocketPermissionRaw := sec.Key("UNIX_SOCKET_PERMISSION").MustString("666")
 | 
			
		||||
		UnixSocketPermissionParsed, err := strconv.ParseUint(UnixSocketPermissionRaw, 8, 32)
 | 
			
		||||
		if err != nil || UnixSocketPermissionParsed > 0777 {
 | 
			
		||||
			log.Fatal("Failed to parse unixSocketPermission: %s", UnixSocketPermissionRaw)
 | 
			
		||||
		}
 | 
			
		||||
		UnixSocketPermission = uint32(UnixSocketPermissionParsed)
 | 
			
		||||
	case "unix":
 | 
			
		||||
		Protocol = UnixSocket
 | 
			
		||||
		UnixSocketPermissionRaw := sec.Key("UNIX_SOCKET_PERMISSION").MustString("666")
 | 
			
		||||
@@ -607,6 +616,8 @@ func NewContext() {
 | 
			
		||||
		defaultLocalURL = "http://unix/"
 | 
			
		||||
	case FCGI:
 | 
			
		||||
		defaultLocalURL = AppURL
 | 
			
		||||
	case FCGIUnix:
 | 
			
		||||
		defaultLocalURL = AppURL
 | 
			
		||||
	default:
 | 
			
		||||
		defaultLocalURL = string(Protocol) + "://"
 | 
			
		||||
		if HTTPAddr == "0.0.0.0" {
 | 
			
		||||
 
 | 
			
		||||
@@ -133,7 +133,7 @@ func NewMacaron() *macaron.Macaron {
 | 
			
		||||
	if setting.EnableGzip {
 | 
			
		||||
		m.Use(gzip.Middleware())
 | 
			
		||||
	}
 | 
			
		||||
	if setting.Protocol == setting.FCGI {
 | 
			
		||||
	if setting.Protocol == setting.FCGI || setting.Protocol == setting.FCGIUnix {
 | 
			
		||||
		m.SetURLPrefix(setting.AppSubURL)
 | 
			
		||||
	}
 | 
			
		||||
	m.Use(public.Custom(
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user