services: nginx: Make service extensible.

* gnu/services/web.scm (<nginx-configuration>)[server-blocks]: New
field.
(nginx-activation): When CONFIG-FILE is #f, use 'default-nginx-config'.
(nginx-shepherd-service): Likewise.
(nginx-service-type): Add 'compose' and 'extend' fields.
(nginx-service): Change default value of #:server-list to '(), and
default value of #:config-file to #f.
* doc/guix.texi (Web Services): Document it.

Co-authored-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
Julien Lepiller 2016-12-13 21:00:53 +01:00 committed by Ludovic Courtès
parent 4e9ae301ce
commit d338237d8c
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
2 changed files with 42 additions and 10 deletions

View file

@ -11827,8 +11827,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''] @
[#:server-list (list (nginx-server-configuration))] @
[#:config-file]
[#:server-list '()] @
[#:config-file @code{#f}]
Return a service that runs @var{nginx}, the nginx web server.
@ -11844,6 +11844,20 @@ this to work, use the default value for @var{config-file}.
@end deffn
@deffn {Scheme Variable} nginx-service-type
This is type for the nginx web server.
This service can be extended to add server blocks in addition to the
default one, as in this example:
@example
(simple-service 'my-extra-server nginx-service-type
(list (nginx-server-configuration
(https-port #f)
(root "/srv/http/extra-website"))))
@end example
@end deffn
@deftp {Data Type} nginx-server-configuration
Data type representing the configuration of an nginx server block.
This type has the following parameters:

View file

@ -27,6 +27,7 @@ (define-module (gnu services web)
#:use-module (gnu packages web)
#:use-module (guix records)
#:use-module (guix gexp)
#:use-module (srfi srfi-1)
#:use-module (ice-9 match)
#:export (nginx-configuration
nginx-configuration?
@ -67,6 +68,7 @@ (define-record-type* <nginx-configuration>
(nginx nginx-configuration-nginx) ;<package>
(log-directory nginx-configuration-log-directory) ;string
(run-directory nginx-configuration-run-directory) ;string
(server-blocks nginx-configuration-server-blocks) ;list
(file nginx-configuration-file)) ;string | file-like
(define (config-domain-strings names)
@ -148,7 +150,8 @@ (define %nginx-accounts
(define nginx-activation
(match-lambda
(($ <nginx-configuration> nginx log-directory run-directory config-file)
(($ <nginx-configuration> nginx log-directory run-directory server-blocks
config-file)
#~(begin
(use-modules (guix build utils))
@ -164,17 +167,25 @@ (define nginx-activation
(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 server-blocks))
"-t")))))
(define nginx-shepherd-service
(match-lambda
(($ <nginx-configuration> nginx log-directory run-directory config-file)
(($ <nginx-configuration> nginx log-directory run-directory server-blocks
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 server-blocks))
#$@args))))))
;; TODO: Add 'reload' action.
(list (shepherd-service
@ -192,14 +203,20 @@ (define nginx-service-type
(service-extension activation-service-type
nginx-activation)
(service-extension account-service-type
(const %nginx-accounts))))))
(const %nginx-accounts))))
(compose concatenate)
(extend (lambda (config servers)
(nginx-configuration
(inherit config)
(server-blocks
(append (nginx-configuration-server-blocks config)
servers)))))))
(define* (nginx-service #:key (nginx nginx)
(log-directory "/var/log/nginx")
(run-directory "/var/run/nginx")
(server-list (list (nginx-server-configuration)))
(config-file
(default-nginx-config log-directory run-directory server-list)))
(server-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 +226,5 @@ (define* (nginx-service #:key (nginx nginx)
(nginx nginx)
(log-directory log-directory)
(run-directory run-directory)
(server-blocks server-list)
(file config-file))))