d88b9464b0
Primary reasons: remove implicit dependencies and force uniformity. See nixos/modules/system/service/README.md for detailed rationale.
195 lines
4.9 KiB
Nix
195 lines
4.9 KiB
Nix
# Tests in: nixos/tests/php/fpm-modular.nix
|
|
|
|
# Non-module dependencies (importApply)
|
|
{ formats, coreutils }:
|
|
|
|
# Service module
|
|
{
|
|
options,
|
|
config,
|
|
lib,
|
|
...
|
|
}:
|
|
let
|
|
cfg = config.php-fpm;
|
|
format = formats.iniWithGlobalSection { };
|
|
configFile = format.generate "php-fpm.conf" {
|
|
globalSection = lib.filterAttrs (_: v: !lib.isAttrs v) cfg.settings;
|
|
sections = lib.filterAttrs (_: lib.isAttrs) cfg.settings;
|
|
};
|
|
|
|
poolOpts =
|
|
{ name, ... }:
|
|
{
|
|
freeformType =
|
|
with lib.types;
|
|
attrsOf (oneOf [
|
|
str
|
|
int
|
|
bool
|
|
]);
|
|
options = {
|
|
listen = lib.mkOption {
|
|
type =
|
|
with lib.types;
|
|
oneOf [
|
|
path
|
|
port
|
|
str
|
|
];
|
|
default = "/run/php-fpm/${name}.sock";
|
|
description = ''
|
|
The address on which to accept FastCGI requests. Valid syntaxes are: `ip.add.re.ss:port`, `port`, `/path/to/unix/socket`.
|
|
'';
|
|
};
|
|
|
|
pm = lib.mkOption {
|
|
type = lib.types.enum [
|
|
"static"
|
|
"ondemand"
|
|
"dynamic"
|
|
];
|
|
description = ''
|
|
Choose how the process manager will control the number of child processes.
|
|
|
|
`static` - the number of child processes is fixed (`pm.max_children`).
|
|
`ondemand` - the processes spawn on demand (when requested, as opposed to `dynamic`, where `pm.start_servers` are started when the service is started).
|
|
`dynamic` - the number of child processes is set dynamically based on the following directives: `pm.max_children`, `pm.start_servers`, pm.min_spare_servers, `pm.max_spare_servers`.
|
|
'';
|
|
};
|
|
|
|
"pm.max_children" = lib.mkOption {
|
|
type = lib.types.int;
|
|
description = ''
|
|
The number of child processes to be created when `pm` is set to `static` and the maximum
|
|
number of child processes to be created when `pm` is set to `dynamic`.
|
|
|
|
This option sets the limit on the number of simultaneous requests that will be served.
|
|
'';
|
|
};
|
|
|
|
user = lib.mkOption {
|
|
type = lib.types.str;
|
|
description = ''
|
|
Unix user of FPM processes.
|
|
'';
|
|
};
|
|
};
|
|
};
|
|
in
|
|
{
|
|
_class = "service";
|
|
|
|
options.php-fpm = {
|
|
package = lib.mkOption {
|
|
type = lib.types.package;
|
|
description = "PHP package to use for php-fpm";
|
|
defaultText = lib.literalMD ''The PHP package that provided this module.'';
|
|
example = lib.literalExpression ''
|
|
php.buildEnv {
|
|
extensions =
|
|
{ all, ... }:
|
|
with all;
|
|
[
|
|
imagick
|
|
opcache
|
|
];
|
|
extraConfig = "memory_limit=256M";
|
|
}
|
|
'';
|
|
};
|
|
|
|
settings = lib.mkOption {
|
|
type = lib.types.submodule {
|
|
freeformType =
|
|
with lib.types;
|
|
attrsOf (oneOf [
|
|
str
|
|
int
|
|
bool
|
|
(submodule poolOpts)
|
|
]);
|
|
options = {
|
|
log_level = lib.mkOption {
|
|
type = lib.types.enum [
|
|
"alert"
|
|
"error"
|
|
"warning"
|
|
"notice"
|
|
"debug"
|
|
];
|
|
default = "notice";
|
|
description = ''
|
|
Error log level.
|
|
'';
|
|
};
|
|
};
|
|
};
|
|
default = { };
|
|
example = lib.literalExpression ''
|
|
{
|
|
log_level = "debug";
|
|
log_limit = 2048;
|
|
|
|
mypool = {
|
|
"user" = "php";
|
|
"group" = "php";
|
|
"listen.owner" = "caddy";
|
|
"listen.group" = "caddy";
|
|
"pm" = "dynamic";
|
|
"pm.max_children" = 75;
|
|
"pm.start_servers" = 10;
|
|
"pm.min_spare_servers" = 5;
|
|
"pm.max_spare_servers" = 20;
|
|
"pm.max_requests" = 500;
|
|
}
|
|
}
|
|
'';
|
|
description = ''
|
|
PHP FPM configuration. Refer to [upstream documentation](https://www.php.net/manual/en/install.fpm.configuration.php) for details on supported values.
|
|
'';
|
|
};
|
|
};
|
|
|
|
config = {
|
|
php-fpm.settings = {
|
|
error_log = "syslog";
|
|
daemonize = false;
|
|
};
|
|
|
|
process.argv = [
|
|
"${cfg.package}/bin/php-fpm"
|
|
"-y"
|
|
configFile
|
|
];
|
|
}
|
|
// lib.optionalAttrs (options ? systemd) {
|
|
|
|
systemd.service = {
|
|
after = [ "network.target" ];
|
|
documentation = [ "man:php-fpm(8)" ];
|
|
|
|
serviceConfig = {
|
|
Type = "notify";
|
|
ExecReload = "${coreutils}/bin/kill -USR2 $MAINPID";
|
|
RuntimeDirectory = "php-fpm";
|
|
RuntimeDirectoryPreserve = true;
|
|
Restart = "always";
|
|
};
|
|
};
|
|
|
|
}
|
|
// lib.optionalAttrs (options ? finit) {
|
|
|
|
finit.service = {
|
|
conditions = [ "service/syslogd/ready" ];
|
|
reload = "${coreutils}/bin/kill -USR2 $MAINPID";
|
|
notify = "systemd";
|
|
};
|
|
};
|
|
|
|
meta.maintainers = with lib.maintainers; [
|
|
aanderse
|
|
];
|
|
}
|