nixos/httpd: allow user to specify a minimal list of apache modules
This commit is contained in:
parent
9c28599bfe
commit
5c3715379d
@ -29,41 +29,26 @@ let
|
|||||||
|
|
||||||
listenToString = l: "${l.ip}:${toString l.port}";
|
listenToString = l: "${l.ip}:${toString l.port}";
|
||||||
|
|
||||||
extraModules = attrByPath ["extraModules"] [] mainCfg;
|
|
||||||
extraForeignModules = filter isAttrs extraModules;
|
|
||||||
extraApacheModules = filter isString extraModules;
|
|
||||||
|
|
||||||
allHosts = [mainCfg] ++ mainCfg.virtualHosts;
|
allHosts = [mainCfg] ++ mainCfg.virtualHosts;
|
||||||
|
|
||||||
enableSSL = any (vhost: vhost.enableSSL) allHosts;
|
enableSSL = any (vhost: vhost.enableSSL) allHosts;
|
||||||
|
|
||||||
|
# NOTE: generally speaking order of modules is very important
|
||||||
# Names of modules from ${httpd}/modules that we want to load.
|
modules =
|
||||||
apacheModules =
|
[ # required apache modules our httpd service cannot run without
|
||||||
[ # HTTP authentication mechanisms: basic and digest.
|
"authn_core" "authz_core"
|
||||||
"auth_basic" "auth_digest"
|
"log_config"
|
||||||
|
"mime" "autoindex" "negotiation" "dir"
|
||||||
# Authentication: is the user who he claims to be?
|
"alias" "rewrite"
|
||||||
"authn_file" "authn_dbm" "authn_anon" "authn_core"
|
"unixd" "slotmem_shm" "socache_shmcb"
|
||||||
|
|
||||||
# Authorization: is the user allowed access?
|
|
||||||
"authz_user" "authz_groupfile" "authz_host" "authz_core"
|
|
||||||
|
|
||||||
# Other modules.
|
|
||||||
"ext_filter" "include" "log_config" "env" "mime_magic"
|
|
||||||
"cern_meta" "expires" "headers" "usertrack" /* "unique_id" */ "setenvif"
|
|
||||||
"mime" "dav" "status" "autoindex" "asis" "info" "dav_fs"
|
|
||||||
"vhost_alias" "negotiation" "dir" "imagemap" "actions" "speling"
|
|
||||||
"userdir" "alias" "rewrite" "proxy" "proxy_http"
|
|
||||||
"unixd" "cache" "cache_disk" "slotmem_shm" "socache_shmcb"
|
|
||||||
"mpm_${mainCfg.multiProcessingModule}"
|
"mpm_${mainCfg.multiProcessingModule}"
|
||||||
|
|
||||||
# For compatibility with old configurations, the new module mod_access_compat is provided.
|
|
||||||
"access_compat"
|
|
||||||
]
|
]
|
||||||
++ (if mainCfg.multiProcessingModule == "prefork" then [ "cgi" ] else [ "cgid" ])
|
++ (if mainCfg.multiProcessingModule == "prefork" then [ "cgi" ] else [ "cgid" ])
|
||||||
++ optional enableSSL "ssl"
|
++ optional enableSSL "ssl"
|
||||||
++ extraApacheModules;
|
++ optional mainCfg.enableMellon { name = "auth_mellon"; path = "${pkgs.apacheHttpdPackages.mod_auth_mellon}/modules/mod_auth_mellon.so"; }
|
||||||
|
++ optional mainCfg.enablePHP { name = "php${phpMajorVersion}"; path = "${php}/modules/libphp${phpMajorVersion}.so"; }
|
||||||
|
++ optional mainCfg.enablePerl { name = "perl"; path = "${mod_perl}/modules/mod_perl.so"; }
|
||||||
|
++ mainCfg.extraModules;
|
||||||
|
|
||||||
|
|
||||||
allDenied = "Require all denied";
|
allDenied = "Require all denied";
|
||||||
@ -87,6 +72,7 @@ let
|
|||||||
|
|
||||||
|
|
||||||
browserHacks = ''
|
browserHacks = ''
|
||||||
|
<IfModule mod_setenvif.c>
|
||||||
BrowserMatch "Mozilla/2" nokeepalive
|
BrowserMatch "Mozilla/2" nokeepalive
|
||||||
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
|
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
|
||||||
BrowserMatch "RealPlayer 4\.0" force-response-1.0
|
BrowserMatch "RealPlayer 4\.0" force-response-1.0
|
||||||
@ -96,6 +82,7 @@ let
|
|||||||
BrowserMatch "^WebDrive" redirect-carefully
|
BrowserMatch "^WebDrive" redirect-carefully
|
||||||
BrowserMatch "^WebDAVFS/1.[012]" redirect-carefully
|
BrowserMatch "^WebDAVFS/1.[012]" redirect-carefully
|
||||||
BrowserMatch "^gnome-vfs" redirect-carefully
|
BrowserMatch "^gnome-vfs" redirect-carefully
|
||||||
|
</IfModule>
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
|
||||||
@ -266,13 +253,12 @@ let
|
|||||||
Group ${mainCfg.group}
|
Group ${mainCfg.group}
|
||||||
|
|
||||||
${let
|
${let
|
||||||
load = {name, path}: "LoadModule ${name}_module ${path}\n";
|
mkModule = module:
|
||||||
allModules = map (name: {inherit name; path = "${httpd}/modules/mod_${name}.so";}) apacheModules
|
if isString module then { name = module; path = "${httpd}/modules/mod_${module}.so"; }
|
||||||
++ optional mainCfg.enableMellon { name = "auth_mellon"; path = "${pkgs.apacheHttpdPackages.mod_auth_mellon}/modules/mod_auth_mellon.so"; }
|
else if isAttrs module then { inherit (module) name path; }
|
||||||
++ optional mainCfg.enablePHP { name = "php${phpMajorVersion}"; path = "${php}/modules/libphp${phpMajorVersion}.so"; }
|
else throw "Expecting either a string or attribute set including a name and path.";
|
||||||
++ optional mainCfg.enablePerl { name = "perl"; path = "${mod_perl}/modules/mod_perl.so"; }
|
in
|
||||||
++ extraForeignModules;
|
concatMapStringsSep "\n" (module: "LoadModule ${module.name}_module ${module.path}") (unique (map mkModule modules))
|
||||||
in concatMapStrings load (unique allModules)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AddHandler type-map var
|
AddHandler type-map var
|
||||||
@ -387,7 +373,12 @@ in
|
|||||||
extraModules = mkOption {
|
extraModules = mkOption {
|
||||||
type = types.listOf types.unspecified;
|
type = types.listOf types.unspecified;
|
||||||
default = [];
|
default = [];
|
||||||
example = literalExample ''[ "proxy_connect" { name = "php5"; path = "''${pkgs.php}/modules/libphp5.so"; } ]'';
|
example = literalExample ''
|
||||||
|
[
|
||||||
|
"proxy_connect"
|
||||||
|
{ name = "jk"; path = "''${pkgs.tomcat_connectors}/modules/mod_jk.so"; }
|
||||||
|
]
|
||||||
|
'';
|
||||||
description = ''
|
description = ''
|
||||||
Additional Apache modules to be used. These can be
|
Additional Apache modules to be used. These can be
|
||||||
specified as a string in the case of modules distributed
|
specified as a string in the case of modules distributed
|
||||||
@ -588,6 +579,28 @@ in
|
|||||||
date.timezone = "${config.time.timeZone}"
|
date.timezone = "${config.time.timeZone}"
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
services.httpd.extraModules = mkBefore [
|
||||||
|
# HTTP authentication mechanisms: basic and digest.
|
||||||
|
"auth_basic" "auth_digest"
|
||||||
|
|
||||||
|
# Authentication: is the user who he claims to be?
|
||||||
|
"authn_file" "authn_dbm" "authn_anon"
|
||||||
|
|
||||||
|
# Authorization: is the user allowed access?
|
||||||
|
"authz_user" "authz_groupfile" "authz_host"
|
||||||
|
|
||||||
|
# Other modules.
|
||||||
|
"ext_filter" "include" "env" "mime_magic"
|
||||||
|
"cern_meta" "expires" "headers" "usertrack" "setenvif"
|
||||||
|
"dav" "status" "asis" "info" "dav_fs"
|
||||||
|
"vhost_alias" "imagemap" "actions" "speling"
|
||||||
|
"proxy" "proxy_http"
|
||||||
|
"cache" "cache_disk"
|
||||||
|
|
||||||
|
# For compatibility with old configurations, the new module mod_access_compat is provided.
|
||||||
|
"access_compat"
|
||||||
|
];
|
||||||
|
|
||||||
systemd.services.httpd =
|
systemd.services.httpd =
|
||||||
{ description = "Apache HTTPD";
|
{ description = "Apache HTTPD";
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user