1 { config, lib, pkgs, ... }:
6 cfg = config.services.myPhpfpm;
7 enabled = cfg.poolConfigs != {} || cfg.pools != {};
9 stateDir = "/run/phpfpm";
11 poolConfigs = cfg.poolConfigs // mapAttrs mkPool cfg.pools;
18 fpmCfgFile = pool: poolConfig: pkgs.writeText "phpfpm-${pool}.conf" ''
28 phpIni = poolPhpOptions: (pkgs.runCommand "php.ini" {
29 inherit (cfg) phpPackage phpOptions;
30 inherit poolPhpOptions;
32 sendmail_path = "/run/wrappers/bin/sendmail -t -i"
34 passAsFile = [ "nixDefaults" "phpOptions" "poolPhpOptions" ];
36 cat $phpPackage/etc/php.ini $nixDefaultsPath $phpOptionsPath $poolPhpOptionsPath > $out
43 extraConfig = mkOption {
47 Extra configuration that should be put in the global section of
48 the PHP-FPM configuration file. Do not specify the options
49 <literal>error_log</literal> or
50 <literal>daemonize</literal> here, since they are generated by
55 phpPackage = mkOption {
58 defaultText = "pkgs.php";
60 The PHP package to use for running the PHP-FPM service.
64 phpOptions = mkOption {
72 "Options appended to the PHP configuration file <filename>php.ini</filename>.";
75 serviceDependencies = mkOption {
77 type = types.attrsOf (types.listOf types.string);
78 example = literalExample ''
79 { mypool = ["postgresql.service"]; }
82 Extra service dependencies specific to pool.
88 type = types.attrsOf types.string;
89 example = literalExample ''
90 { mypool = "path/to/file";
94 Extra environment file go into the service script.
98 poolPhpConfigs = mkOption {
100 type = types.attrsOf types.lines;
101 example = literalExample ''
103 extension = some_extension.so
108 Extra lines that go into the php configuration specific to pool.
112 poolConfigs = mkOption {
114 type = types.attrsOf types.lines;
115 example = literalExample ''
117 listen = /run/phpfpm/mypool
121 pm.start_servers = 10
122 pm.min_spare_servers = 5
123 pm.max_spare_servers = 20
124 pm.max_requests = 500
129 A mapping between PHP-FPM pool names and their configurations.
130 See the documentation on <literal>php-fpm.conf</literal> for
131 details on configuration directives. If no pools are defined,
132 the phpfpm service is disabled.
137 type = types.attrsOf (types.submodule (import ./pool-options.nix {
141 example = literalExample ''
144 listen = "/path/to/unix/socket";
149 pm.start_servers = 10
150 pm.min_spare_servers = 5
151 pm.max_spare_servers = 20
152 pm.max_requests = 500
157 PHP-FPM pools. If no pools or poolConfigs are defined, the PHP-FPM
164 config = mkIf enabled {
166 systemd.slices.phpfpm = {
167 description = "PHP FastCGI Process manager pools slice";
170 systemd.targets.phpfpm = {
171 description = "PHP FastCGI Process manager pools target";
172 wantedBy = [ "multi-user.target" ];
175 systemd.services = flip mapAttrs' poolConfigs (pool: poolConfig:
176 nameValuePair "phpfpm-${pool}" {
177 description = "PHP FastCGI Process Manager service for pool ${pool}";
178 after = [ "network.target" ] ++ (cfg.serviceDependencies.${pool} or []);
179 wants = cfg.serviceDependencies.${pool} or [];
180 wantedBy = [ "phpfpm.target" ];
181 partOf = [ "phpfpm.target" ];
186 cfgFile = fpmCfgFile pool poolConfig;
187 poolPhpIni = cfg.poolPhpConfigs.${pool} or "";
189 EnvironmentFile = if builtins.hasAttr pool cfg.envFile then [cfg.envFile.${pool}] else [];
190 Slice = "phpfpm.slice";
191 PrivateDevices = true;
192 ProtectSystem = "full";
194 # XXX: We need AF_NETLINK to make the sendmail SUID binary from postfix work
195 RestrictAddressFamilies = "AF_UNIX AF_INET AF_INET6 AF_NETLINK";
197 ExecStart = "${cfg.phpPackage}/bin/php-fpm -y ${cfgFile} -c ${phpIni poolPhpIni}";
198 ExecReload = "${pkgs.coreutils}/bin/kill -USR2 $MAINPID";