>From 13748b6bfffef19080f4fa3bde2a6ae7d5c8d067 Mon Sep 17 00:00:00 2001 From: Julien Lepiller Date: Wed, 26 Oct 2016 21:33:34 +0200 Subject: [PATCH] services: Make nginx-service-type extensible gnu/services/web.scm (nginx-service): Removed. gnu/services/web.scm (nginx-service-sytsem): Make extensible. gnu/services/web.scm (default-nginx-vhost-service-type): New variable. --- gnu/services/web.scm | 87 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 34 deletions(-) diff --git a/gnu/services/web.scm b/gnu/services/web.scm index 59e1e54..0f06c99 100644 --- a/gnu/services/web.scm +++ b/gnu/services/web.scm @@ -28,12 +28,13 @@ #:use-module (guix records) #:use-module (guix gexp) #:use-module (ice-9 match) + #:use-module (srfi srfi-1) #:export (nginx-configuration nginx-configuration? nginx-vhost-configuration nginx-vhost-configuration? - nginx-service - nginx-service-type)) + nginx-service-type + default-nginx-vhost-service-type)) ;;; Commentary: ;;; @@ -64,10 +65,14 @@ (define-record-type* nginx-configuration make-nginx-configuration nginx-configuration? - (nginx nginx-configuration-nginx) ; - (log-directory nginx-configuration-log-directory) ;string - (run-directory nginx-configuration-run-directory) ;string - (file nginx-configuration-file)) ;string | file-like + (nginx nginx-configuration-nginx ; + (default nginx)) + (log-directory nginx-configuration-log-directory ;string + (default "/var/log/nginx")) + (run-directory nginx-configuration-run-directory ;string + (default "/var/run/nginx")) + (vhosts nginx-configuration-vhosts ;list + (default (list (nginx-vhost-configuration (https-port #f)))))) (define (config-domain-strings names) "Return a string denoting the nginx config representation of NAMES, a list @@ -102,11 +107,15 @@ of index files." " server_name " (config-domain-strings (nginx-vhost-configuration-server-name vhost)) ";\n" - (if (nginx-vhost-configuration-ssl-certificate vhost) + (if (and + (nginx-vhost-configuration-ssl-certificate vhost) + (nginx-vhost-configuration-https-port vhost)) (string-append " ssl_certificate " (nginx-vhost-configuration-ssl-certificate vhost) ";\n") "") - (if (nginx-vhost-configuration-ssl-certificate-key vhost) + (if (and + (nginx-vhost-configuration-ssl-certificate-key vhost) + (nginx-vhost-configuration-https-port vhost)) (string-append " ssl_certificate_key " (nginx-vhost-configuration-ssl-certificate-key vhost) ";\n") "") @@ -116,7 +125,7 @@ of index files." "on" "off") ";\n" " }\n")) -(define (default-nginx-config log-directory run-directory vhost-list) +(define (nginx-config-file log-directory run-directory vhost-list) (plain-file "nginx.conf" (string-append "user nginx nginx;\n" @@ -148,7 +157,7 @@ of index files." (define nginx-activation (match-lambda - (($ nginx log-directory run-directory config-file) + (($ nginx log-directory run-directory vhosts) #~(begin (use-modules (guix build utils)) @@ -161,20 +170,20 @@ of index files." (mkdir-p (string-append #$run-directory "/proxy_temp")) (mkdir-p (string-append #$run-directory "/fastcgi_temp")) (mkdir-p (string-append #$run-directory "/uwsgi_temp")) - (mkdir-p (string-append #$run-directory "/scgi_temp")) - ;; Check configuration file syntax. - (system* (string-append #$nginx "/sbin/nginx") - "-c" #$config-file "-t"))))) + (mkdir-p (string-append #$run-directory "/scgi_temp")))))) (define nginx-shepherd-service (match-lambda - (($ nginx log-directory run-directory config-file) + (($ nginx log-directory run-directory vhosts) (let* ((nginx-binary (file-append nginx "/sbin/nginx")) (nginx-action (lambda args #~(lambda _ (zero? - (system* #$nginx-binary "-c" #$config-file address@hidden)))))) + (system* #$nginx-binary "-c" #$(nginx-config-file + log-directory + run-directory + vhosts) address@hidden)))))) ;; TODO: Add 'reload' action. (list (shepherd-service @@ -192,21 +201,31 @@ of index files." (service-extension activation-service-type nginx-activation) (service-extension account-service-type - (const %nginx-accounts)))))) - -(define* (nginx-service #:key (nginx nginx) - (log-directory "/var/log/nginx") - (run-directory "/var/run/nginx") - (vhost-list (list (nginx-vhost-configuration))) - (config-file - (default-nginx-config log-directory run-directory vhost-list))) - "Return a service that runs NGINX, the nginx web server. - -The nginx daemon loads its runtime configuration from CONFIG-FILE, stores log -files in LOG-DIRECTORY, and stores temporary runtime files in RUN-DIRECTORY." - (service nginx-service-type - (nginx-configuration - (nginx nginx) - (log-directory log-directory) - (run-directory run-directory) - (file config-file)))) + (const %nginx-accounts)))) + (compose concatenate) + (extend (lambda (config additional-vhosts) + (match config + (($ nginx log-directory + run-directory vhosts) + (nginx-configuration + (nginx nginx) + (log-directory log-directory) + (run-directory run-directory) + (vhosts (append vhosts additional-vhosts))))))))) + +(define (default-nginx-vhost-configuration root) + (lambda (_) + (list (nginx-vhost-configuration (https-port #f) + (root root))))) + +(define default-nginx-vhost-service-type + (let* ((index (plain-file "index.html" + "")) + (root (computed-file "default-nginx-vhost" + #~(begin + (mkdir #$output) + (symlink #$index (string-append #$output "/index.html")))))) + (service-type (name 'default-nginx-vhost) + (extensions + (list (service-extension nginx-service-type + (default-nginx-vhost-configuration root))))))) -- 2.10.1