On Fri, 4 Nov 2016 23:34:31 +0100 Hartmut Goebel <h.goe...@crazy-compilers.com> wrote:
> Am 04.11.2016 um 23:12 schrieb Julien Lepiller: > >> > gnu/services/web.scm:118:34: In procedure > >> > default-nginx-vhost-config: gnu/services/web.scm:118:34: In > >> > procedure struct_vtable: Wrong type argument in position 1 > >> > (expecting struct): (nginx-vhost-configuration (root > >> > taler-landing-page)) > > What is your configuration exactly, and what is taler-landing-page? > > > > The configuration is like in your gtk-doc-vhost, except that I'm not > using gtk+2 and omitting the "string-append" for the path. > I attached new patches that add more documentation (I hope it helps). Using this configuration works for me: (nginx-service) (service (service-type (name 'foo) (extensions (list (service-extension nginx-service-type (const (list ;; a vhost that actually serves html files (nginx-vhost-configuration (https-port #f) (ssl-certificate #f) (ssl-certificate-key #f) (root #~(string-append #$cups "/share/doc/cups/ja"))) ;; just to show how to use a package ;; directly (nginx-vhost-configuration (server-name (list "help")) (https-port #f) (ssl-certificate #f) (ssl-certificate-key #f) (root cups)))))))) #t) It would work with simple-service too. It generates this configuration file for nginx: user nginx nginx; pid /var/run/nginx/pid; error_log /var/log/nginx/error.log info; http { client_body_temp_path /var/run/nginx/client_body_temp; proxy_temp_path /var/run/nginx/proxy_temp; fastcgi_temp_path /var/run/nginx/fastcgi_temp; uwsgi_temp_path /var/run/nginx/uwsgi_temp; scgi_temp_path /var/run/nginx/scgi_temp; access_log /var/log/nginx/access.log; server { listen 80; server_name help ; root /gnu/store/l6n860s5fmaxhwcx17mjrfw4wcqx8xy8-cups-2.1.0; index index.html ; server_tokens off; } server { listen 80; server_name _ ; root /gnu/store/l6n860s5fmaxhwcx17mjrfw4wcqx8xy8-cups-2.1.0/share/doc/cups/ja; index index.html ; server_tokens off; } } events {}
>From 0478b5720a8fcc71d682ccf62bae839a71453b86 Mon Sep 17 00:00:00 2001 From: Julien Lepiller <jul...@lepiller.eu> Date: Sun, 6 Nov 2016 10:26:45 +0100 Subject: [PATCH 1/3] Make nginx-service extensible * gnu/services/web.scm (nginx-service-type): Make extensible. --- doc/guix.texi | 38 ++++++++++++++++++++++++++++++++++++-- gnu/services/web.scm | 33 +++++++++++++++++++++++++-------- 2 files changed, 61 insertions(+), 10 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 1075a7e..4b60a4a 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -10400,8 +10400,8 @@ The @code{(gnu services web)} module provides the following service: @deffn {Scheme Procedure} nginx-service [#:nginx nginx] @ [#:log-directory ``/var/log/nginx''] @ [#:run-directory ``/var/run/nginx''] @ - [#:vhost-list (list (nginx-vhost-configuration))] @ - [#:config-file] + [#:vhost-list '()] @ + [#:config-file @code{#f}] Return a service that runs @var{nginx}, the nginx web server. @@ -10417,6 +10417,40 @@ this to work, use the default value for @var{config-file}. @end deffn +@deffn {Scheme Variable} nginx-service-type +This is the type for the nginx web server. + +This service can be extended to add more vhosts than the default ones. To add +@dfn{virtual hosts}, you can either put them in the @var{vhost-lists} of the +@code{nginx-service} procedure, or create a separate service for all or parts +of them. For example: + +@example +(define vh nginx-vhost-configuration + (root "/var/www/extra-website")) +(nginx-service) +(simple-service 'foo nginx-service-type + (list vh)) +@end example + +Is a service that adds a new @dfn{virtual host} to the list of existing ones. +You can add as many such services as you want. + +You can also use a more complete service definition: + +@example +(define foo + (service-type (name 'foo) + (extensions (list (service-extension nginx-service-type + (const (list vh))))))) +(nginx-service) +(service foo #t) +@end example + +Note that @code{(nginx-service)} needs to be defined only once. + +@end deffn + @deftp {Data Type} nginx-vhost-configuration Data type representing the configuration of an nginx virtual host. This type has the following parameters: diff --git a/gnu/services/web.scm b/gnu/services/web.scm index 59e1e54..50f83f3 100644 --- a/gnu/services/web.scm +++ b/gnu/services/web.scm @@ -28,6 +28,7 @@ #: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 @@ -67,6 +68,8 @@ (nginx nginx-configuration-nginx) ;<package> (log-directory nginx-configuration-log-directory) ;string (run-directory nginx-configuration-run-directory) ;string + (vhosts nginx-configuration-vhosts + (default '())) ;list of <nginx-vhost-configuration> (file nginx-configuration-file)) ;string | file-like (define (config-domain-strings names) @@ -148,7 +151,7 @@ of index files." (define nginx-activation (match-lambda - (($ <nginx-configuration> nginx log-directory run-directory config-file) + (($ <nginx-configuration> nginx log-directory run-directory vhosts config-file) #~(begin (use-modules (guix build utils)) @@ -164,17 +167,25 @@ of index files." (mkdir-p (string-append #$run-directory "/scgi_temp")) ;; Check configuration file syntax. (system* (string-append #$nginx "/sbin/nginx") - "-c" #$config-file "-t"))))) + "-c" #$(or config-file + (default-nginx-config log-directory + run-directory vhosts)) + "-t"))))) (define nginx-shepherd-service (match-lambda - (($ <nginx-configuration> nginx log-directory run-directory config-file) + (($ <nginx-configuration> nginx log-directory run-directory vhosts config-file) (let* ((nginx-binary (file-append nginx "/sbin/nginx")) (nginx-action (lambda args #~(lambda _ (zero? - (system* #$nginx-binary "-c" #$config-file #$@args)))))) + (system* #$nginx-binary "-c" #$(or config-file + (default-nginx-config + log-directory + run-directory + vhosts)) + #$@args)))))) ;; TODO: Add 'reload' action. (list (shepherd-service @@ -192,14 +203,19 @@ of index files." (service-extension activation-service-type nginx-activation) (service-extension account-service-type - (const %nginx-accounts)))))) + (const %nginx-accounts)))) + (compose concatenate) + (extend (lambda (config vhosts) + (nginx-configuration + (inherit config) + (vhosts (append (nginx-configuration-vhosts config) + vhosts))))))) (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))) + (vhost-list '()) + (config-file #f)) "Return a service that runs NGINX, the nginx web server. The nginx daemon loads its runtime configuration from CONFIG-FILE, stores log @@ -209,4 +225,5 @@ files in LOG-DIRECTORY, and stores temporary runtime files in RUN-DIRECTORY." (nginx nginx) (log-directory log-directory) (run-directory run-directory) + (vhosts vhost-list) (file config-file)))) -- 2.10.2
>From 3f6ecc72032affa3e6ba1e704f13ac6a20b4f4ed Mon Sep 17 00:00:00 2001 From: Julien Lepiller <jul...@lepiller.eu> Date: Sun, 6 Nov 2016 10:52:34 +0100 Subject: [PATCH 2/3] service: Fix multiple nginx index and server name * gnu/services/web.scm (config-index strings and config-vhost-strings): Add a space between entries. --- gnu/services/web.scm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gnu/services/web.scm b/gnu/services/web.scm index 50f83f3..e36d284 100644 --- a/gnu/services/web.scm +++ b/gnu/services/web.scm @@ -77,8 +77,8 @@ of domain names." (string-concatenate (map (match-lambda - ('default "_") - ((? string? str) str)) + ('default "_ ") + ((? string? str) (string-append str " "))) names))) (define (config-index-strings names) @@ -86,7 +86,7 @@ of domain names." of index files." (string-concatenate (map (match-lambda - ((? string? str) str)) + ((? string? str) (string-append str " "))) names))) (define (default-nginx-vhost-config vhost) -- 2.10.2
>From c7f6944a7483edf2719ecf47a2adf2d4b346700a Mon Sep 17 00:00:00 2001 From: Julien Lepiller <jul...@lepiller.eu> Date: Sun, 6 Nov 2016 11:28:01 +0100 Subject: [PATCH 3/3] services: Accept gexps as nginx configuration value. * gnu/services/web.scm (default-nginx-config): Use computed-file instead of plain-file. --- doc/guix.texi | 9 +++++ gnu/services/web.scm | 96 +++++++++++++++++++++++++++------------------------- 2 files changed, 59 insertions(+), 46 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 4b60a4a..d125546 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -10433,6 +10433,15 @@ of them. For example: (list vh)) @end example +or if you want to make a package available, you can write something like: + +@example +(define vh (nginx-vhost-configuration + (root my-package))) +(define vh2 (nginx-vhost-configuration + (root #~(string-append #$cups "/share/doc/cups/ja")))) +@end example + Is a service that adds a new @dfn{virtual host} to the list of existing ones. You can add as many such services as you want. diff --git a/gnu/services/web.scm b/gnu/services/web.scm index e36d284..df6e680 100644 --- a/gnu/services/web.scm +++ b/gnu/services/web.scm @@ -90,54 +90,58 @@ of index files." names))) (define (default-nginx-vhost-config vhost) - (string-append - " server {\n" - (if (nginx-vhost-configuration-http-port vhost) - (string-append " listen " - (number->string (nginx-vhost-configuration-http-port vhost)) - ";\n") - "") - (if (nginx-vhost-configuration-https-port vhost) - (string-append " listen " - (number->string (nginx-vhost-configuration-https-port vhost)) - " ssl;\n") - "") - " server_name " (config-domain-strings - (nginx-vhost-configuration-server-name vhost)) - ";\n" - (if (nginx-vhost-configuration-ssl-certificate vhost) - (string-append " ssl_certificate " - (nginx-vhost-configuration-ssl-certificate vhost) ";\n") - "") - (if (nginx-vhost-configuration-ssl-certificate-key vhost) - (string-append " ssl_certificate_key " - (nginx-vhost-configuration-ssl-certificate-key vhost) ";\n") - "") - " root " (nginx-vhost-configuration-root vhost) ";\n" - " index " (config-index-strings (nginx-vhost-configuration-index vhost)) ";\n" - " server_tokens " (if (nginx-vhost-configuration-server-tokens? vhost) - "on" "off") ";\n" - " }\n")) + #~(string-append + " server {\n" + #$(if (nginx-vhost-configuration-http-port vhost) + (string-append " listen " + (number->string (nginx-vhost-configuration-http-port vhost)) + ";\n") + "") + #$(if (nginx-vhost-configuration-https-port vhost) + (string-append " listen " + (number->string (nginx-vhost-configuration-https-port vhost)) + " ssl;\n") + "") + " server_name " #$(config-domain-strings + (nginx-vhost-configuration-server-name vhost)) + ";\n" + #$(if (nginx-vhost-configuration-ssl-certificate vhost) + (string-append " ssl_certificate " + (nginx-vhost-configuration-ssl-certificate vhost) ";\n") + "") + #$(if (nginx-vhost-configuration-ssl-certificate-key vhost) + (string-append " ssl_certificate_key " + (nginx-vhost-configuration-ssl-certificate-key vhost) ";\n") + "") + " root " #$(nginx-vhost-configuration-root vhost) ";\n" + " index " #$(config-index-strings (nginx-vhost-configuration-index vhost)) ";\n" + " server_tokens " #$(if (nginx-vhost-configuration-server-tokens? vhost) + "on" "off") ";\n" + " }\n")) (define (default-nginx-config log-directory run-directory vhost-list) - (plain-file "nginx.conf" - (string-append - "user nginx nginx;\n" - "pid " run-directory "/pid;\n" - "error_log " log-directory "/error.log info;\n" - "http {\n" - " client_body_temp_path " run-directory "/client_body_temp;\n" - " proxy_temp_path " run-directory "/proxy_temp;\n" - " fastcgi_temp_path " run-directory "/fastcgi_temp;\n" - " uwsgi_temp_path " run-directory "/uwsgi_temp;\n" - " scgi_temp_path " run-directory "/scgi_temp;\n" - " access_log " log-directory "/access.log;\n" - (let ((http (map default-nginx-vhost-config vhost-list))) - (do ((http http (cdr http)) - (block "" (string-append (car http) "\n" block ))) - ((null? http) block))) - "}\n" - "events {}\n"))) + (computed-file + "nginx.conf" + #~(call-with-output-file #$output + (lambda (port) + (format port + (string-append + "user nginx nginx;\n" + "pid " #$run-directory "/pid;\n" + "error_log " #$log-directory "/error.log info;\n" + "http {\n" + " client_body_temp_path " #$run-directory "/client_body_temp;\n" + " proxy_temp_path " #$run-directory "/proxy_temp;\n" + " fastcgi_temp_path " #$run-directory "/fastcgi_temp;\n" + " uwsgi_temp_path " #$run-directory "/uwsgi_temp;\n" + " scgi_temp_path " #$run-directory "/scgi_temp;\n" + " access_log " #$log-directory "/access.log;\n" + #$(let ((http (map default-nginx-vhost-config vhost-list))) + (do ((http http (cdr http)) + (block "" #~(string-append #$(car http) "\n" #$block ))) + ((null? http) block))) + "}\n" + "events {}\n")))))) (define %nginx-accounts (list (user-group (name "nginx") (system? #t)) -- 2.10.2