summaryrefslogtreecommitdiff
path: root/gnu/services/web.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/services/web.scm')
-rw-r--r--gnu/services/web.scm100
1 files changed, 59 insertions, 41 deletions
diff --git a/gnu/services/web.scm b/gnu/services/web.scm
index 59e1e54e04..db895405a2 100644
--- a/gnu/services/web.scm
+++ b/gnu/services/web.scm
@@ -27,11 +27,12 @@
#: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?
- nginx-vhost-configuration
- nginx-vhost-configuration?
+ nginx-server-configuration
+ nginx-server-configuration?
nginx-service
nginx-service-type))
@@ -41,24 +42,24 @@
;;;
;;; Code:
-(define-record-type* <nginx-vhost-configuration>
- nginx-vhost-configuration make-nginx-vhost-configuration
- nginx-vhost-configuration?
- (http-port nginx-vhost-configuration-http-port
+(define-record-type* <nginx-server-configuration>
+ nginx-server-configuration make-nginx-server-configuration
+ nginx-server-configuration?
+ (http-port nginx-server-configuration-http-port
(default 80))
- (https-port nginx-vhost-configuration-https-port
+ (https-port nginx-server-configuration-https-port
(default 443))
- (server-name nginx-vhost-configuration-server-name
+ (server-name nginx-server-configuration-server-name
(default (list 'default)))
- (root nginx-vhost-configuration-root
+ (root nginx-server-configuration-root
(default "/srv/http"))
- (index nginx-vhost-configuration-index
+ (index nginx-server-configuration-index
(default (list "index.html")))
- (ssl-certificate nginx-vhost-configuration-ssl-certificate
+ (ssl-certificate nginx-server-configuration-ssl-certificate
(default "/etc/nginx/cert.pem"))
- (ssl-certificate-key nginx-vhost-configuration-ssl-certificate-key
+ (ssl-certificate-key nginx-server-configuration-ssl-certificate-key
(default "/etc/nginx/key.pem"))
- (server-tokens? nginx-vhost-configuration-server-tokens?
+ (server-tokens? nginx-server-configuration-server-tokens?
(default #f)))
(define-record-type* <nginx-configuration>
@@ -67,56 +68,57 @@
(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)
"Return a string denoting the nginx config representation of NAMES, a list
of domain names."
- (string-concatenate
+ (string-join
(map (match-lambda
- ('default "_")
- ((? string? str) str))
+ ('default "_ ")
+ ((? string? str) (string-append str " ")))
names)))
(define (config-index-strings names)
"Return a string denoting the nginx config representation of NAMES, a list
of index files."
- (string-concatenate
+ (string-join
(map (match-lambda
- ((? string? str) str))
+ ((? string? str) (string-append str " ")))
names)))
-(define (default-nginx-vhost-config vhost)
+(define (default-nginx-server-config server)
(string-append
" server {\n"
- (if (nginx-vhost-configuration-http-port vhost)
+ (if (nginx-server-configuration-http-port server)
(string-append " listen "
- (number->string (nginx-vhost-configuration-http-port vhost))
+ (number->string (nginx-server-configuration-http-port server))
";\n")
"")
- (if (nginx-vhost-configuration-https-port vhost)
+ (if (nginx-server-configuration-https-port server)
(string-append " listen "
- (number->string (nginx-vhost-configuration-https-port vhost))
+ (number->string (nginx-server-configuration-https-port server))
" ssl;\n")
"")
" server_name " (config-domain-strings
- (nginx-vhost-configuration-server-name vhost))
+ (nginx-server-configuration-server-name server))
";\n"
- (if (nginx-vhost-configuration-ssl-certificate vhost)
+ (if (nginx-server-configuration-ssl-certificate server)
(string-append " ssl_certificate "
- (nginx-vhost-configuration-ssl-certificate vhost) ";\n")
+ (nginx-server-configuration-ssl-certificate server) ";\n")
"")
- (if (nginx-vhost-configuration-ssl-certificate-key vhost)
+ (if (nginx-server-configuration-ssl-certificate-key server)
(string-append " ssl_certificate_key "
- (nginx-vhost-configuration-ssl-certificate-key vhost) ";\n")
+ (nginx-server-configuration-ssl-certificate-key server) ";\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)
+ " root " (nginx-server-configuration-root server) ";\n"
+ " index " (config-index-strings (nginx-server-configuration-index server)) ";\n"
+ " server_tokens " (if (nginx-server-configuration-server-tokens? server)
"on" "off") ";\n"
" }\n"))
-(define (default-nginx-config log-directory run-directory vhost-list)
+(define (default-nginx-config log-directory run-directory server-list)
(plain-file "nginx.conf"
(string-append
"user nginx nginx;\n"
@@ -129,7 +131,7 @@ of index files."
" 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)))
+ (let ((http (map default-nginx-server-config server-list)))
(do ((http http (cdr http))
(block "" (string-append (car http) "\n" block )))
((null? http) block)))
@@ -148,7 +150,8 @@ of index files."
(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 @@ 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 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 @@ 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 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")
- (vhost-list (list (nginx-vhost-configuration)))
- (config-file
- (default-nginx-config log-directory run-directory vhost-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 @@ files in LOG-DIRECTORY, and stores temporary runtime files in RUN-DIRECTORY."
(nginx nginx)
(log-directory log-directory)
(run-directory run-directory)
+ (server-blocks server-list)
(file config-file))))