On Wed, 19 Oct 2016 23:04:14 +0200 l...@gnu.org (Ludovic Courtès) wrote: > Hi Julien, > > This looks like a great improvement to me! Sounds nicer than fiddling > with config files. > > I suppose we could make ‘nginx-service-type’ extensible (info "(guix) > Service Types and Services") so that people can write services that > define new vhosts?
You mean something like udev-service-type where you could extend it with a list of vhosts? Except for that comment, I modified the patch following your advice. > > Julien Lepiller <jul...@lepiller.eu> skribis: > > > From 613d5db739d4010be2037fd2fcfc70baca4625aa Mon Sep 17 00:00:00 > > 2001 From: Julien Lepiller <jul...@lepiller.eu> > > Date: Mon, 26 Sep 2016 23:55:58 +0200 > > Subject: [PATCH] services: improve nginx-service configuration > > > > * gnu/services/web.scm (<nginx-vhost-configuration>): New record > > type. > > * doc/guix.texi (Web Services): Document > > 'nginx-vhost-configuration'. > > Please mention the other changes in web.scm: new procedures, changes > in existing procedures, etc. > > > +As an alternative to using a @var{config-file}, @var{vhost-list} > > can be +used to specify the list of vhosts required on the host. > > For this to work, > > “the list of @dfn{virtual hosts} or @dfn{vhosts}” > > > +@deftp {Data Type} nginx-vhost-configuration > > +Data type representing the configuration of an nginx virtual > > host. > > @dfn{virtual host} > > > +This type has the following parameters: > > +@table @asis > > +@item @code{http-port} (default: 80) > > @code{80}; likewise for all the other default values. > > > +Nginx will listen for http connection on this port. Set it at #f > > if nginx should +not listen for http (non secure) connection for > > this vhost. > > s/http/HTTP/ and s/#f/@code{#f}/ > Please leave two spaces after an end-of-sentence period. > > > +(define (list-names names) > > + (match names > > + ('() "") > > + ((head tail ...) (string-append (if (eq? head 'default) "_" head) > > + " " > > + (list-names tail))))) > > Maybe call it ‘config-value-strings’? Please add a docstring. I > think it’d be more readable like this: > > (define (config-value-strings names) > "Return a string denoting the nginx config representation of > NAMES, a list of foobars…" > (string-concatenate > (map (match-lambda > ('default "_") > ((? string? str) str)) > names))) > > Could you send an updated patch? > > Unless David, who initially wrote this service has objections, this > patch looks good to me with the changes as suggested above. > > Thanks! > > Ludo’.
From 8bda6fdd53b3cc7470fac67228a88e0d165134dd Mon Sep 17 00:00:00 2001 From: Julien Lepiller <jul...@lepiller.eu> Date: Mon, 26 Sep 2016 23:55:58 +0200 Subject: [PATCH] services: improve nginx-service configuration * gnu/services/web.scm (<nginx-vhost-configuration>): New record type. (config-domain-strings): New procedure. (config-index-strings): New procedure. (default-nginx-vhost-config): New procedure. (default-nginx-config): Add vhost support and temporary directories (nginx-activation): Create temporary directories (nginx-service): Add vhost-list key. * doc/guix.texi (Web Services): Document 'nginx-vhost-configuration'. --- doc/guix.texi | 46 ++++++++++++++++++++++++++ gnu/services/web.scm | 92 +++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 134 insertions(+), 4 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 0c5d641..c36a29c 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -10394,6 +10394,7 @@ 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] Return a service that runs @var{nginx}, the nginx web server. @@ -10404,8 +10405,53 @@ files are written to @var{run-directory}. For proper operation, these arguments should match what is in @var{config-file} to ensure that the directories are created when the service is activated. +As an alternative to using a @var{config-file}, @var{vhost-list} can be +used to specify the list of @dfn{virtual hosts} required on the host. For +this to work, use the default value for @var{config-file}. + @end deffn +@deftp {Data Type} nginx-vhost-configuration +Data type representing the configuration of an nginx virtual host. +This type has the following parameters: +@table @asis +@item @code{http-port} (default: @code{80}) +Nginx will listen for HTTP connection on this port. Set it at @code{#f} if +nginx should not listen for HTTP (non secure) connection for this +@dfn{virtual host}. + +@item @code{https-port} (default: @code{443}) +Nginx will listen for HTTPS connection on this port. Set it at @code{#f} if +nginx should not listen for HTTPS (secure) connection for this @dfn{virtual host}. + +Note that nginx can listen for HTTP and HTTPS connections in the same +@dfn{virtual host}. + +@item @code{server-name} (default: @code{(list 'default)}) +A list of server names this vhost represents. @code{'default} represents the +default vhost for connections matching no other vhost. + +@item @code{root} (default: @code{``/srv/http''}) +Root of the website nginx will serve. + +@item @code{index} (default: @code{(list ``index.html'')}) +Index files to look for when clients ask for a directory. If it cannot be found, +Nginx will send the list of files in the directory. + +@item @code{ssl-certificate} (default: @code{``/etc/nginx/cert.pem''}) +Where to find the certificate for secure connections. Set it to @code{#f} if +you don't have a certificate or you don't want to use HTTPS. + +@item @code{ssl-certificate-key} (default: @code{``/etc/nginx/key.pem''}) +Where to find the private key for secure connections. Set it to @code{#f} if +you don't have a key or you don't want to use HTTPS. + +@item @code{server-tokens?} (default: @code{#f}) +Whether the server should add its configuration to response. + +@end table +@end deftp + @node Network File System @subsubsection Network File System @cindex NFS diff --git a/gnu/services/web.scm b/gnu/services/web.scm index 0a2a09b..49a2962 100644 --- a/gnu/services/web.scm +++ b/gnu/services/web.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2015 David Thompson <da...@gnu.org> ;;; Copyright © 2015, 2016 Ludovic Courtès <l...@gnu.org> ;;; Copyright © 2016 ng0 <n...@we.make.ritual.n0.is> +;;; Copyright © 2016 Julien Lepiller <jul...@lepiller.eu> ;;; ;;; This file is part of GNU Guix. ;;; @@ -29,6 +30,8 @@ #:use-module (ice-9 match) #:export (nginx-configuration nginx-configuration? + nginx-vhost-configuration + nginx-vhost-configuration? nginx-service nginx-service-type)) @@ -38,6 +41,26 @@ ;;; ;;; Code: +(define-record-type* <nginx-vhost-configuration> + nginx-vhost-configuration make-nginx-vhost-configuration + nginx-vhost-configuration? + (http-port nginx-vhost-configuration-http-port + (default 80)) + (https-port nginx-vhost-configuration-https-port + (default 443)) + (server-name nginx-vhost-configuration-server-name + (default (list 'default))) + (root nginx-vhost-configuration-root + (default "/srv/http")) + (index nginx-vhost-configuration-index + (default (list "index.html"))) + (ssl-certificate nginx-vhost-configuration-ssl-certificate + (default "/etc/nginx/cert.pem")) + (ssl-certificate-key nginx-vhost-configuration-ssl-certificate-key + (default "/etc/nginx/key.pem")) + (server-tokens? nginx-vhost-configuration-server-tokens? + (default #f))) + (define-record-type* <nginx-configuration> nginx-configuration make-nginx-configuration nginx-configuration? @@ -46,16 +69,70 @@ (run-directory nginx-configuration-run-directory) ;string (file nginx-configuration-file)) ;string | file-like -(define (default-nginx-config log-directory run-directory) +(define (config-domain-strings names) + "Return a string denoting the nginx config representation of NAMES, a list +of domain names." + (string-concatenate + (map (match-lambda + ('default "_") + ((? string? str) str)) + names))) + +(define (config-index-strings names) + "Return a string denoting the nginx config representation of NAMES, a list +of index files." + (string-concatenate + (map (match-lambda + ((? string? str) str)) + 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")) + +(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" - " root /var/www;\n" - " server {}\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"))) @@ -79,6 +156,12 @@ (mkdir-p #$log-directory) (format #t "creating nginx run directory '~a'~%" #$run-directory) (mkdir-p #$run-directory) + (format #t "creating nginx temp directories '~a/{client_body,proxy,fastcgi,uwsgi,scgi}_temp'~%" #$run-directory) + (mkdir-p (string-append #$run-directory "/client_body_temp")) + (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"))))) @@ -114,8 +197,9 @@ (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))) + (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 -- 2.10.1