aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--miniflux.14
-rw-r--r--service/httpd/httpd.go33
2 files changed, 32 insertions, 5 deletions
diff --git a/miniflux.1 b/miniflux.1
index 4a687d4..1730af9 100644
--- a/miniflux.1
+++ b/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\&.
diff --git a/service/httpd/httpd.go b/service/httpd/httpd.go
index 4ab7cfd..a365353 100644
--- a/service/httpd/httpd.go
+++ b/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{