diff --git a/nixos/doc/manual/release-notes/rl-1909.xml b/nixos/doc/manual/release-notes/rl-1909.xml
index 53f5b8bb732..9a4aac0df55 100644
--- a/nixos/doc/manual/release-notes/rl-1909.xml
+++ b/nixos/doc/manual/release-notes/rl-1909.xml
@@ -137,9 +137,9 @@
Several of the apache subservices have been replaced with full NixOS
- modules including LimeSurvey and WordPress.
- These modules can be enabled using the
- and options.
+ modules including LimeSurvey, WordPress, and Zabbix.
+ These modules can be enabled using the ,
+ , and options.
diff --git a/nixos/modules/misc/ids.nix b/nixos/modules/misc/ids.nix
index 14ba5a573b1..1047df95cdf 100644
--- a/nixos/modules/misc/ids.nix
+++ b/nixos/modules/misc/ids.nix
@@ -516,7 +516,7 @@
tss = 176;
#memcached = 177; # unused, removed 2018-01-03
#ntp = 179; # unused
- #zabbix = 180; # unused
+ zabbix = 180;
#redis = 181; # unused, removed 2018-01-03
#unifi = 183; # unused
#uptimed = 184; # unused
diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index 1d1995eda25..32f542290b5 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -782,6 +782,7 @@
./services/web-apps/virtlyst.nix
./services/web-apps/wordpress.nix
./services/web-apps/youtrack.nix
+ ./services/web-apps/zabbix.nix
./services/web-servers/apache-httpd/default.nix
./services/web-servers/caddy.nix
./services/web-servers/fcgiwrap.nix
diff --git a/nixos/modules/services/web-apps/zabbix.nix b/nixos/modules/services/web-apps/zabbix.nix
new file mode 100644
index 00000000000..4b5334579a9
--- /dev/null
+++ b/nixos/modules/services/web-apps/zabbix.nix
@@ -0,0 +1,225 @@
+{ config, lib, pkgs, ... }:
+
+let
+
+ inherit (lib) mkDefault mkEnableOption mkForce mkIf mkMerge mkOption types;
+ inherit (lib) literalExample mapAttrs optionalString;
+
+ cfg = config.services.zabbixWeb;
+ fpm = config.services.phpfpm.pools.zabbix;
+
+ user = "zabbix";
+ group = "zabbix";
+ stateDir = "/var/lib/zabbix";
+
+ zabbixConfig = pkgs.writeText "zabbix.conf.php" ''
+ database.user.
+ '';
+ };
+
+ socket = mkOption {
+ type = types.nullOr types.path;
+ default = null;
+ example = "/run/postgresql";
+ description = "Path to the unix socket file to use for authentication.";
+ };
+ };
+
+ virtualHost = mkOption {
+ type = types.submodule ({
+ options = import ../web-servers/apache-httpd/per-server-options.nix {
+ inherit lib;
+ forMainServer = false;
+ };
+ });
+ example = {
+ hostName = "zabbix.example.org";
+ enableSSL = true;
+ adminAddr = "webmaster@example.org";
+ sslServerCert = "/var/lib/acme/zabbix.example.org/full.pem";
+ sslServerKey = "/var/lib/acme/zabbix.example.org/key.pem";
+ };
+ description = ''
+ Apache configuration can be done by adapting services.httpd.virtualHosts.<name>.
+ See for further information.
+ '';
+ };
+
+ poolConfig = mkOption {
+ type = types.lines;
+ default = ''
+ pm = dynamic
+ pm.max_children = 32
+ pm.start_servers = 2
+ pm.min_spare_servers = 2
+ pm.max_spare_servers = 4
+ pm.max_requests = 500
+ '';
+ description = ''
+ Options for the Zabbix PHP pool. See the documentation on php-fpm.conf for details on configuration directives.
+ '';
+ };
+
+ };
+ };
+
+ # implementation
+
+ config = mkIf cfg.enable {
+
+ systemd.tmpfiles.rules = [
+ "d '${stateDir}' 0750 ${user} ${group} - -"
+ "d '${stateDir}/session' 0750 ${user} ${config.services.httpd.group} - -"
+ ];
+
+ services.phpfpm.pools.zabbix = {
+ phpOptions = ''
+ # https://www.zabbix.com/documentation/current/manual/installation/install
+ memory_limit = 128M
+ post_max_size = 16M
+ upload_max_filesize = 2M
+ max_execution_time = 300
+ max_input_time = 300
+ session.auto_start = 0
+ mbstring.func_overload = 0
+ always_populate_raw_post_data = -1
+ # https://bbs.archlinux.org/viewtopic.php?pid=1745214#p1745214
+ session.save_path = ${stateDir}/session
+ '' + optionalString (config.time.timeZone != null) ''
+ date.timezone = "${config.time.timeZone}"
+ '' + optionalString (cfg.database.type == "oracle") ''
+ extension=${pkgs.phpPackages.oci8}/lib/php/extensions/oci8.so
+ '';
+ listen = "/run/phpfpm/zabbix.sock";
+ extraConfig = ''
+ listen.owner = ${config.services.httpd.user};
+ listen.group = ${config.services.httpd.group};
+ user = ${user};
+ group = ${config.services.httpd.group};
+ env[ZABBIX_CONFIG] = ${zabbixConfig}
+ ${cfg.poolConfig}
+ '';
+ };
+
+ services.httpd = {
+ enable = true;
+ adminAddr = mkDefault cfg.virtualHost.adminAddr;
+ extraModules = [ "proxy_fcgi" ];
+ virtualHosts = [ (mkMerge [
+ cfg.virtualHost {
+ documentRoot = mkForce "${cfg.package}/share/zabbix";
+ extraConfig = ''
+
+
+
+ SetHandler "proxy:unix:${fpm.listen}|fcgi://localhost/"
+
+
+ AllowOverride all
+ Options -Indexes
+ DirectoryIndex index.php
+
+ '';
+ }
+ ]) ];
+ };
+
+ users.users.${user} = mapAttrs (name: mkDefault) {
+ description = "Zabbix daemon user";
+ uid = config.ids.uids.zabbix;
+ inherit group;
+ };
+
+ users.groups.${group} = mapAttrs (name: mkDefault) {
+ gid = config.ids.gids.zabbix;
+ };
+
+ };
+}
diff --git a/nixos/modules/services/web-servers/apache-httpd/zabbix.nix b/nixos/modules/services/web-servers/apache-httpd/zabbix.nix
deleted file mode 100644
index cab16593bcb..00000000000
--- a/nixos/modules/services/web-servers/apache-httpd/zabbix.nix
+++ /dev/null
@@ -1,84 +0,0 @@
-{ config, lib, pkgs, serverInfo, ... }:
-
-with lib;
-
-let
-
- # The Zabbix PHP frontend needs to be able to write its
- # configuration settings (the connection info to the database) to
- # the "conf" subdirectory. So symlink $out/conf to some directory
- # outside of the Nix store where we want to keep this stateful info.
- # Note that different instances of the frontend will therefore end
- # up with their own copies of the PHP sources. !!! Alternatively,
- # we could generate zabbix.conf.php declaratively.
- zabbixPHP = pkgs.runCommand "${pkgs.zabbix.server.name}-php" {}
- ''
- cp -rs ${pkgs.zabbix.server}/share/zabbix/php "$out"
- chmod -R u+w $out
- ln -s "${if config.configFile == null
- then "${config.stateDir}/zabbix.conf.php"
- else config.configFile}" "$out/conf/zabbix.conf.php"
- '';
-
-in
-
-{
-
- enablePHP = true;
-
- phpOptions =
- ''
- post_max_size = 32M
- max_execution_time = 300
- max_input_time = 300
- '';
-
- extraConfig = ''
- Alias ${config.urlPrefix}/ ${zabbixPHP}/
-
-
- DirectoryIndex index.php
- Order deny,allow
- Allow from *
-
- '';
-
- startupScript = pkgs.writeScript "zabbix-startup-hook" ''
- mkdir -p ${config.stateDir}
- chown -R ${serverInfo.serverConfig.user} ${config.stateDir}
- '';
-
- # The frontend needs "ps" to find out whether zabbix_server is running.
- extraServerPath = [ pkgs.procps ];
-
- options = {
-
- urlPrefix = mkOption {
- default = "/zabbix";
- description = "
- The URL prefix under which the Zabbix service appears.
- Use the empty string to have it appear in the server root.
- ";
- };
-
- configFile = mkOption {
- default = null;
- type = types.nullOr types.path;
- description = ''
- The configuration file (zabbix.conf.php) which contains the database
- connection settings. If not set, the configuration settings will created
- by the web installer.
- '';
- };
-
- stateDir = mkOption {
- default = "/var/lib/zabbix/frontend";
- description = "
- Directory where the dynamically generated configuration data
- of the PHP frontend will be stored.
- ";
- };
-
- };
-
-}