From mboxrd@z Thu Jan 1 00:00:00 1970 From: Julien Lepiller Subject: Re: [PATCH] improve nginx-service Date: Wed, 26 Oct 2016 21:45:07 +0200 Message-ID: <20161026214507.45445d14@lepiller.eu> References: <20161016143347.38d8a6f2@polymos.lepiller.eu> <874m483vap.fsf@gnu.org> <20161020143744.516a1184@polymos.lepiller.eu> <87shrlzd0w.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="MP_/dotCVzu1IS_=1TxAO7Osy1n" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:41707) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bzU8f-0000SU-Pj for guix-devel@gnu.org; Wed, 26 Oct 2016 15:45:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bzU8c-00087o-MB for guix-devel@gnu.org; Wed, 26 Oct 2016 15:45:29 -0400 Received: from dau94-h03-89-91-205-84.dsl.sta.abo.bbox.fr ([89.91.205.84]:46903 helo=skaro.lepiller.eu) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1bzU8c-00087R-2p for guix-devel@gnu.org; Wed, 26 Oct 2016 15:45:26 -0400 Received: from localhost (localhost [127.0.0.1]) by skaro.lepiller.eu (Postfix) with ESMTP id E98D580B28 for ; Wed, 26 Oct 2016 21:43:38 +0200 (CEST) Received: from skaro.lepiller.eu ([127.0.0.1]) by localhost (skaro.lepiller.eu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id abHQm1wSW7Tj for ; Wed, 26 Oct 2016 21:43:32 +0200 (CEST) Received: from localhost (89-93-157-164.hfc.dyn.abo.bbox.fr [89.93.157.164]) by skaro.lepiller.eu (Postfix) with ESMTPSA id 029447FB40 for ; Wed, 26 Oct 2016 21:43:31 +0200 (CEST) In-Reply-To: <87shrlzd0w.fsf@gnu.org> List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: "Guix-devel" To: guix-devel@gnu.org --MP_/dotCVzu1IS_=1TxAO7Osy1n Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline On Mon, 24 Oct 2016 22:51:27 +0200 ludo@gnu.org (Ludovic Court=C3=A8s) wrote: > Hi, >=20 > Julien Lepiller skribis: >=20 > > On Wed, 19 Oct 2016 23:04:14 +0200 > > ludo@gnu.org (Ludovic Court=C3=A8s) wrote: > > =20 > >> Hi Julien, > >>=20 > >> This looks like a great improvement to me! Sounds nicer than > >> fiddling with config files. > >>=20 > >> I suppose we could make =E2=80=98nginx-service-type=E2=80=99 extensibl= e (info > >> "(guix) Service Types and Services") so that people can write > >> services that define new vhosts? =20 > > > > You mean something like udev-service-type where you could extend it > > with a list of vhosts? =20 >=20 > Yes, exactly. So for example one could write a service for some > high-level Web service that would in turn create an nginx vhost. > WDYT? Sounds great. I tried to work on it, but I'm stuck. I'm trying to implement a service that extends nginx-service-type with a vhost (default-nginx-vhost-service-type), and it creates a root directory for a default empty index file. Now I would like to pass the absolute path of this directory to the , but it is too early for that. System configuration with this new service fails with: Backtrace: In guix/ui.scm: 1220: 19 [run-guix-command system "reconfigure" "/etc/config.scm"] In ice-9/boot-9.scm: 157: 18 [catch srfi-34 # ...] 157: 17 [catch system-error ...] In guix/scripts/system.scm: 870: 16 [#] 776: 15 [process-action reconfigure ("/etc/config.scm") ...] In guix/store.scm: 1182: 14 [run-with-store # ...] In guix/scripts/system.scm: 788: 13 [# #] 552: 12 [perform-action reconfigure # # ...] In gnu/system.scm: 627: 11 [operating-system-derivation # # #f] In gnu/services.scm: 585: 10 [loop #] In srfi/srfi-1.scm: 578: 9 [map # (# # #)] In gnu/services.scm: 585: 8 [loop #< type: # parameters: #>] In srfi/srfi-1.scm: 578: 7 [map # (# # # # ...)] In gnu/services.scm: 585: 6 [loop #< type: # parameters: ()>] In srfi/srfi-1.scm: 578: 5 [map # (# # # # ...)] In gnu/services/web.scm: 189: 4 [nginx-shepherd-service #] 181: 3 [nginx-action "-p" "/var/run/nginx"] 141: 2 [nginx-config-file "/var/log/nginx" "/var/run/nginx" ...] In srfi/srfi-1.scm: 576: 1 [map # (# #)] In unknown file: ?: 0 [string-append " server {\n" " listen 80;\n" ...] ERROR: In procedure string-append: ERROR: In procedure string-append: Wrong type (expecting string): #< name: "default-nginx-vhost" gexp: #) (symlink # name: "index.html" content: "[...]" references: ()>:out> (string-append # "/index.html"))) 5959270> options: (#:local-build? #t)> >=20 > > From 8bda6fdd53b3cc7470fac67228a88e0d165134dd Mon Sep 17 00:00:00 > > 2001 From: Julien Lepiller > > Date: Mon, 26 Sep 2016 23:55:58 +0200 > > Subject: [PATCH] services: improve nginx-service configuration > > > > * gnu/services/web.scm (): 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'. =20 >=20 > Applied with the minor changes below. >=20 > Thank you! >=20 > Ludo=E2=80=99. >=20 --MP_/dotCVzu1IS_=1TxAO7Osy1n Content-Type: text/x-patch Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=0001-services-Make-nginx-service-type-extensible.patch >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 #$@args)))))) + (system* #$nginx-binary "-c" #$(nginx-config-file + log-directory + run-directory + vhosts) #$@args)))))) ;; 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 --MP_/dotCVzu1IS_=1TxAO7Osy1n--