ソースを参照

Add the possiblity to listen on Unix socket

Frédéric Guillot 7 年 前
コミット
1315282c7f
2 ファイル変更32 行追加5 行削除
  1. 3 1
      miniflux.1
  2. 29 4
      service/httpd/httpd.go

+ 3 - 1
miniflux.1

@@ -89,7 +89,9 @@ Maximum number of database connections (default is 20)\&.
 Minimum number of database connections (default is 1)\&.
 .TP
 .B LISTEN_ADDR
-HTTP server listening address\&.
+Address to listen on. Default is 127.0.0.1:8080\&.
+.br
+Use absolute path to listen on Unix socket (/var/run/miniflux.sock)\&.
 .TP
 .B PORT
 Override LISTEN_ADDR to 0.0.0.0:$PORT\&.

+ 29 - 4
service/httpd/httpd.go

@@ -6,7 +6,10 @@ package httpd // import "miniflux.app/service/httpd"
 
 import (
 	"crypto/tls"
+	"net"
 	"net/http"
+	"os"
+	"strings"
 	"time"
 
 	"miniflux.app/api"
@@ -29,27 +32,49 @@ func Serve(cfg *config.Config, store *storage.Storage, pool *worker.Pool, feedHa
 	keyFile := cfg.KeyFile()
 	certDomain := cfg.CertDomain()
 	certCache := cfg.CertCache()
+	listenAddr := cfg.ListenAddr()
 	server := &http.Server{
 		ReadTimeout:  30 * time.Second,
 		WriteTimeout: 30 * time.Second,
 		IdleTimeout:  60 * time.Second,
-		Addr:         cfg.ListenAddr(),
 		Handler:      setupHandler(cfg, store, feedHandler, pool),
 	}
 
-	if certDomain != "" && certCache != "" {
+	switch {
+	case strings.HasPrefix(listenAddr, "/"):
+		startUnixSocketServer(server, listenAddr)
+	case certDomain != "" && certCache != "":
 		cfg.IsHTTPS = true
 		startAutoCertTLSServer(server, certDomain, certCache)
-	} else if certFile != "" && keyFile != "" {
+	case certFile != "" && keyFile != "":
 		cfg.IsHTTPS = true
+		server.Addr = listenAddr
 		startTLSServer(server, certFile, keyFile)
-	} else {
+	default:
+		server.Addr = listenAddr
 		startHTTPServer(server)
 	}
 
 	return server
 }
 
+func startUnixSocketServer(server *http.Server, socketFile string) {
+	os.Remove(socketFile)
+
+	go func(sock string) {
+		listener, err := net.Listen("unix", sock)
+		if err != nil {
+			logger.Fatal(`Server failed to start: %v`, err)
+		}
+		defer listener.Close()
+
+		logger.Info(`Listening on Unix socket %q`, sock)
+		if err := server.Serve(listener); err != http.ErrServerClosed {
+			logger.Fatal(`Server failed to start: %v`, err)
+		}
+	}(socketFile)
+}
+
 func startAutoCertTLSServer(server *http.Server, certDomain, certCache string) {
 	server.Addr = ":https"
 	certManager := autocert.Manager{