~ruther/guix-local

5ee26f0bf427608697a976c5261ac4588249809c — Leo Nikkilä 2 years ago 8db6cfe
services: nginx: Make log formats configurable.

* gnu/services/web.scm (<nginx-log-format-configuration>): New record.
(<nginx-configuration>)[log-format, log-formats]: New fields.
(assert-valid-log-format-escape): New procedure.
(emit-nginx-log-format-config): New procedure.
(default-nginx-config): Make log formats configurable.
* doc/guix.texi (Web Services): Document it.

Signed-off-by: Ludovic Courtès <ludo@gnu.org>
Change-Id: I8a16a1a9a20f64606dac0a1e14f1c5217d351f90
2 files changed, 76 insertions(+), 5 deletions(-)

M doc/guix.texi
M gnu/services/web.scm
M doc/guix.texi => doc/guix.texi +37 -3
@@ 32403,10 32403,19 @@ started.
@item @code{log-directory} (default: @code{"/var/log/nginx"})
The directory to which NGinx will write log files.

@item @code{log-format} (default: @code{'combined}) (type: symbol)
Logging format for the access log. Nginx defaults to the httpd-like
format named @code{'combined}.  Other formats can be defined using
@code{log-formats}.

@item @code{log-formats} (default: @code{'()})
A list of additional @dfn{log formats} to define, the elements should be
of type @code{<nginx-log-format-configuration>}.

@item @code{log-level} (default: @code{'error}) (type: symbol)
Logging level, which can be any of the following values: @code{'debug},
@code{'info}, @code{'notice}, @code{'warn}, @code{'error}, @code{'crit},
@code{'alert}, or @code{'emerg}.
Logging level for the error log, which can be any of the following
values: @code{'debug}, @code{'info}, @code{'notice}, @code{'warn},
@code{'error}, @code{'crit}, @code{'alert}, or @code{'emerg}.

@item @code{run-directory} (default: @code{"/var/run/nginx"})
The directory in which NGinx will create a pid file, and write temporary


@@ 32539,6 32548,31 @@ flattened into one line.
@end table
@end deftp

@deftp {Data Type} nginx-log-format-configuration
Data type representing the configuration of a custom Nginx log format.
This type has the following parameters:

@table @asis
@item @code{name} (type: symbol)
The name of the log format as a symbol.

@item @code{escape} (default: @code{'default}) (type: symbol)
The mode used to escape values of variables in the format.  The
supported values are:

@itemize
@item @code{'default}, to escape all characters outside of the ASCII
      printable range.
@item @code{'json}, to escape all characters invalid in JSON strings.
@item @code{'none}, to disable escaping.
@end itemize

@item @code{format} (type: string)
The format as accepted by the @code{log_format} directive.

@end table
@end deftp

@anchor{nginx-server-configuration}
@deftp {Data Type} nginx-server-configuration
Data type representing the configuration of an nginx server block.

M gnu/services/web.scm => gnu/services/web.scm +39 -2
@@ 17,6 17,7 @@
;;; Copyright © 2022 Simen Endsjø <simendsjo@gmail.com>
;;; Copyright © 2023 Bruno Victal <mirai@makinata.eu>
;;; Copyright © 2023 Miguel Ángel Moreno <mail@migalmoreno.com>
;;; Copyright © 2024 Leo Nikkilä <hello@lnikki.la>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 103,6 104,8 @@
            nginx-configuration-nginx
            nginx-configuration-shepherd-requirement
            nginx-configuration-log-directory
            nginx-configuration-log-format
            nginx-configuration-log-formats
            nginx-configuration-log-level
            nginx-configuration-run-directory
            nginx-configuration-server-blocks


@@ 114,6 117,12 @@
            nginx-configuration-extra-content
            nginx-configuration-file

            nginx-log-format-configuration
            nginx-log-format-configuration?
            nginx-log-format-configuration-name
            nginx-log-format-configuration-escape
            nginx-log-format-configuration-format

            nginx-server-configuration
            nginx-server-configuration?
            nginx-server-configuration-listen


@@ 525,6 534,23 @@
                  (httpd-configuration))
                (description "Run the Apache httpd Web server.")))

(define-record-type* <nginx-log-format-configuration>
  nginx-log-format-configuration make-nginx-log-format-configuration
  nginx-log-format-configuration?
  (name                nginx-log-format-configuration-name)
  (escape              nginx-log-format-configuration-escape
                       (sanitize assert-valid-log-format-escape)
                       (default 'default))
  (format              nginx-log-format-configuration-format))

(define (assert-valid-log-format-escape escape)
  "Ensure @var{escape} is one of @code{'default}, @code{'json}, or
@code{'none}."
  (unless (memq escape '(default json none))
    (raise
     (formatted-message (G_ "unknown log format escape '~a'~%") escape)))
  escape)

(define-record-type* <nginx-server-configuration>
  nginx-server-configuration make-nginx-server-configuration
  nginx-server-configuration?


@@ 583,6 609,10 @@
  (log-level     nginx-configuration-log-level
                 (sanitize assert-valid-log-level)
                 (default 'error))
  (log-format    nginx-configuration-log-format     ;symbol
                 (default 'combined))
  (log-formats   nginx-configuration-log-formats    ;list of <nginx-log-format-configuration>
                 (default '()))
  (run-directory nginx-configuration-run-directory  ;string
                 (default "/var/run/nginx"))
  (server-blocks nginx-configuration-server-blocks


@@ 638,6 668,12 @@ of index files."
    ((key . value)
     (format #f "~a ~a;~%" key value))))

(define emit-nginx-log-format-config
  (match-lambda
    (($ <nginx-log-format-configuration> name escape format)
     (list "    log_format " (symbol->string name) " escape="
           (symbol->string escape) " " format ";\n"))))

(define emit-nginx-location-config
  (match-lambda
    (($ <nginx-location-configuration> uri body)


@@ 723,7 759,7 @@ of index files."
  (match-record config
                <nginx-configuration>
                (nginx log-directory run-directory
                 log-level
                 log-level log-format log-formats
                 server-blocks upstream-blocks
                 server-names-hash-bucket-size
                 server-names-hash-bucket-max-size


@@ 745,7 781,8 @@ of index files."
           "    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"
           (map emit-nginx-log-format-config log-formats)
           "    access_log " log-directory "/access.log " (symbol->string log-format) ";\n"
           "    include " nginx "/share/nginx/conf/mime.types;\n"
           (if lua-package-path
               #~(format #f "    lua_package_path ~s;~%"