PHP Conference Kansai 2025

Configuración

FPM utiliza la sintaxis php.ini para su fichero de configuración - php-fpm.conf así como los ficheros de configuración de la cola de espera.

Lista de directivas globales de php-fpm.conf

pid string

Ruta hacia el fichero PID. Por omisión: none.

error_log string

Ruta hacia el fichero de registro. Por omisión: #INSTALL_PREFIX#/log/php-fpm.log. Si se define como "syslog", el registro se enviará a syslogd en lugar de ser escrito en un fichero local.

log_level string

Nivel de registro de errores. Valores posibles: alert, error, warning, notice, debug. Por omisión: notice.

log_limit int

Límite de historial para las líneas registradas que permite mensajes de eventos más largos que 1024 caracteres sin saturarse. Valor por omisión: 1024 Disponible a partir de PHP 7.3.0.

log_buffering bool

Historial experimental sin buffer. Valor por omisión: yes. Disponible a partir de PHP 7.3.0.

syslog.facility string

Utilizado para especificar qué tipo de programa escribe el mensaje. Valor por omisión: daemon.

syslog.ident string

Se añade al inicio de cada mensaje. Si tiene múltiples instancias FPM ejecutándose en el mismo servidor, puede cambiar el valor por omisión para que se adapte a sus necesidades. Valor por omisión: php-fpm.

emergency_restart_threshold int

Si este número de procesos hijos terminan con un SIGSEGV o SIGBUS en el intervalo de tiempo especificado en emergency_restart_interval, entonces FPM se reiniciará. Un valor de 0 significa 'Off'. Valor por omisión: 0 (Off).

emergency_restart_interval mixed

Intervalo de tiempo utilizado por emergency_restart_interval para determinar cuándo debe lanzarse un reinicio suave. Esto puede ser útil para evitar corrupciones accidentales en la memoria compartida de un acelerador. Unidades disponibles: s(econdes), m(inutes), h(eures), o d(ays). Unidad por omisión: secondes. Valor por omisión: 0 (Off).

process_control_timeout mixed

Tiempo límite que esperarán los procesos hijos para reaccionar a las señales del padre. Unidades disponibles: s(econdes), m(inutes), h(eures), o d(ays) Unidad por omisión: secondes. Valor por omisión: 0.

process.max int

El número máximo de procesos que FPM va a forker. Esto ha sido diseñado para controlar el número global de procesos al utilizar un gestor de procesos dinámico con muchos pools. Usar con precaución. Valor por omisión: 0.

process.priority int

Define la prioridad nice(2) a aplicar al proceso principal (solo si está definido) El valor puede variar de -19 (prioridad alta) a 20 (prioridad baja). Valor por omisión: no definido.

daemonize bool

Envía FPM al fondo. Ponga 'no' para mantener FPM en primer plano durante la depuración. Valor por omisión: yes.

rlimit_files int

Define la rlimit para los descriptores de ficheros abiertos para el proceso principal. Valor por omisión: valor definido por el sistema.

rlimit_core int

Define la talla máxima de rlimit para el proceso principal. Valor por omisión: 0.

events.mechanism string

Especifica el gestor de eventos que FPM va a utilizar. Las opciones siguientes están disponibles: epoll, kqueue (*BSD), port (Solaris), poll, select. Valor por omisión: no definido (detección automática privilegiando epoll y kqueue).

systemd_interval int

Cuando FPM es construido con el soporte de systemd, especifica el intervalo en segundos, entre las notificaciones de informe de salud enviadas a systemd. Definir a 0 para desactivar. Valor por omisión: 10.

Lista de directivas de pool

Con FPM puede ejecutar múltiples pools de procesos con diferentes parámetros. Aquí están los parámetros que pueden ser ajustados por pool.

listen string

La dirección para aceptar peticiones FastCGI. Sintaxis válidas: 'ip.add.re.ss:port', 'port', '/path/to/unix/socket'. Esta opción es obligatoria para cada pool.

listen.backlog int

Afecta listen(2) backlog. Un valor de -1 significa el máximo en los sistemas BSD. Valor por omisión: -1 (FreeBSD o OpenBSD) o 511 (Linux y otras plataformas).

listen.allowed_clients string

Lista de direcciones IPv4 o IPv6 de los clientes FastCGI autorizados a conectarse. Es equivalente a la variable de entorno FCGI_WEB_SERVER_ADDRS en el sistema FastCGI original de PHP (5.2.2+). No tiene sentido a menos que se utilice un socket tcp en escucha. Cada dirección debe estar separada por una coma. Si este valor no está especificado, las conexiones serán aceptadas desde cualquier dirección ip. Valor por omisión: no definido (toda dirección IP aceptada).

listen.owner string

Afecta los permisos para el socket Unix si se utiliza. En Linux, los permisos read/write deben ser afectados para autorizar conexiones desde un servidor web. Muchos sistemas derivados de BSD autorizan conexiones cualesquiera sean los permisos. Valores por omisión: user y group son los del usuario actual, el modo es 0660.

listen.group string

Véase listen.owner.

listen.mode string

Véase listen.owner.

listen.acl_users string

Cuando las listas de control de acceso POSIX son soportadas, pueden ser definidas usando esta opción. Cuando se define, listen.owner y listen.group son ignorados. El valor es una lista de nombres de usuarios separados por comas.

listen.acl_groups string

Véase listen.acl_users. El valor es una lista de nombres de grupos separados por comas.

user string

Usuario Unix de los procesos FPM. Esta opción es obligatoria.

group string

Grupo Unix de los procesos FPM. Si no se especifica, se utiliza el grupo del usuario.

pm string

Elige cómo el gestor de procesos va a controlar el número de procesos hijos. Valores posibles: static, ondemand, dynamic. Opción obligatoria.

static - número de procesos hijos fijos (pm.max_children).

ondemand - el proceso se reactiva a demanda (cuando se solicita, es lo opuesto a dinámico donde pm.start_servers se inician cuando el servicio se inicia).

dynamic - número de procesos hijos dinámicos basados en las directivas siguientes: pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers.

pm.max_children int

Número de procesos hijos a crear cuando pm está ajustado a static. Número máximo de procesos hijos a crear cuando pm está ajustado a dynamic. Opción obligatoria.

Esta opción afecta al límite del número de peticiones simultáneas que serán servidas. Equivalente a ApacheMaxClients con mpm_prefork y a PHP_FCGI_CHILDREN en la implementación original de FastCGI de PHP.

pm.start_servers int

Número de procesos hijos a crear al inicio. Utilizado solo si pm está ajustado a dynamic. Valor por omisión: (min_spare_servers + max_spare_servers) / 2.

pm.min_spare_servers int

Número mínimo de procesos en reposo (idle) deseados. Utilizado solo si pm está ajustado a dynamic. Obligatorio en este caso.

pm.max_spare_servers int

Número máximo de procesos en reposo (idle) deseados. Utilizado solo si pm está ajustado a dynamic. Obligatorio en este caso.

pm.max_spawn_rate int

Número máximo de tasa de generación de procesos hijos simultáneos. Utilizado solo si pm está definido a dynamic.

pm.process_idle_timeout mixed

Número de segundos después de los cuales un proceso inactivo será eliminado. Utilizado únicamente cuando pm está definido a ondemand. Unidades disponibles: s (segundos)(por omisión), m (minutos), h (hora), o d (día). Valor por omisión: 10s.

pm.max_requests int

Número de peticiones que cada proceso hijo debería ejecutar antes de renacer. Esto puede ser útil para evitar fugas de memoria en bibliotecas de terceros. Para un tratamiento sin fin de las peticiones, especifique '0'. Equivalente a PHP_FCGI_MAX_REQUESTS. Por omisión: 0.

pm.status_listen string

La dirección en la que aceptar la petición de estado FastCGI. Esto crea un nuevo pool invisible que puede tratar las peticiones de manera independiente. Esto es útil si el pool principal está ocupado por peticiones de larga duración ya que siempre es posible obtener el estado página de estado de FPM mientras no se hayan terminado. La sintaxis es la misma que para la directiva listen. Valor por omisión: none.

pm.status_path string

El URI hacia la página de estado de FPM. Este valor debe comenzar con una barra oblicua (/). Si este valor no está definido, ningún URI será reconocido como una página de estado. Valor por omisión: none.

ping.path string

El URI de ping para llamar a la página de monitoreo de FPM. Si no se especifica ningún valor, ninguna página de ping estará disponible. Esto podría ser utilizado para probar desde el exterior si FPM está aún disponible y listo para responder. Note que el valor debe comenzar con una barra oblicua (/).

ping.response string

Esta directiva es útil para personalizar la respuesta a una petición de ping. La respuesta está formateada como text/plain con un código de respuesta de 200. Valor por omisión: pong.

process.priority int

Especifica la prioridad nice(2) a aplicar al proceso de trabajo (solo si está definido). El valor puede variar de -19 (prioridad más alta) a 20 (prioridad más baja). Valor por omisión: no definido.

process.dumpable bool

Define el indicador de proceso dumpable (PR_SET_DUMPABLE prctl) incluso si el usuario o el grupo de procesos es diferente de el usuario del proceso maestro. Permite crear un core dump del proceso y ptrace el proceso para el usuario del pool. Valor por omisión: no. Desde PHP 7.0.29, 7.1.17 y 7.2.5.

prefix string

Especifica el prefijo para la evaluación del camino

request_terminate_timeout_track_finished bool

El timeout definido por request_terminate_timeout no se compromete después de un fastcgi_finish_request o cuando la aplicación ha terminado y las funciones internas de parada son llamadas. Esta directiva permite aplicar el límite de tiempo sin condición. Valor por omisión: no. A partir de PHP 7.3.0.

request_terminate_timeout mixed

El timeout para servir una petición después del cual el proceso concernido será eliminado. Esta opción debería ser utilizada cuando la opción 'max_execution_time' no detiene la ejecución del script por alguna razón. Un valor de '0' significa 'Off'. Unidades disponibles: s(econdes)(por omisión), m(inutes), h(eures), o d(ays). Por omisión: 0.

request_slowlog_timeout mixed

El timeout para servir una petición en la cual la backtrace PHP será volcada en el fichero 'slowlog'. Un valor de '0' significa 'Off'. Unidades disponibles: s(econdes)(por omisión), m(inutes), h(eures), o d(ays). Por omisión: 0.

request_slowlog_trace_depth int

El nivel de profundidad de la traza de la pila de log slowlog. Valor por omisión: 20. A partir de PHP 7.2.0.

slowlog string

El registro para las peticiones lentas, por omisión: #INSTALL_PREFIX#/log/php-fpm.log.slow.

rlimit_files int

Afecta la rlimit para los descriptores de ficheros abiertos de los procesos hijos de este pool. Valor por omisión: valor del sistema.

rlimit_core int

Afecta la talla máxima de rlimit de los procesos hijos de este pool. Valores posibles: 'unlimited' o un entero mayor o igual a 0. Valor por omisión: valor definido por el sistema.

chroot string

Chroot hacia este directorio al inicio. Este valor debe ser una ruta absoluta. Si este valor no está definido, chroot no se utiliza.

chdir string

Chdir hacia este directorio al inicio. Este valor debe ser una ruta absoluta. Valor por omisión: directorio actual o / si chroot.

catch_workers_output bool

Redirige stdout y stderr hacia el registro de errores principal. Si no se especifica, stdout y stderr serán redirigidos hacia /dev/null según las especificaciones FastCGI. Valor por omisión: no.

decorate_workers_output bool

Activa la decoración de salida para los trabajadores de salida cuando catch_workers_output está activado. Valor por omisión: yes. Disponible a partir de PHP 7.3.0.

clear_env bool

Limpia el entorno de los agentes FPM. Evita que variables de entorno arbitrarias puedan alcanzar los procesos FPM limpiando el entorno de estos agentes antes de que las variables de entorno especificadas en la configuración del pool sean añadidas.

security.limit_extensions string

Limita las extensiones que el script principal FPM va a ser autorizado a analizar. Esto puede evitar errores de configuración del lado del servidor. Puede limitar FPM a ejecutar solo las extensiones .php para evitar que usuarios maliciosos utilicen otras extensiones para ejecutar código. Valor por omisión: .php .phar

apparmor_hat string

Si AppArmor está activado, permite cambiar un hat (sombrero). Valor por omisión: no definido

access.log string

El fichero de registro de acceso. Valor por omisión: no definido

access.format string

El formato del registro de acceso. Valor por omisión: "%R - %u %t \"%m %r\" %s":

Opciones válidas
Placeholder Descripción
%% El carácter %
%C %CPU utilizado por la petición. Los formatos siguientes son aceptados: %{user}C para la CPU de usuario únicamente, %{system}C para la CPU de sistema únicamente, %{total}C para la CPU de usuario + sistema (por omisión)
%d Tiempo tomado para procesar la petición. Los formatos siguientes son aceptados para la precisión: %{seconds}d (por omisión), %{milliseconds}d, %{microseconds}d
%{name}e Una variable de entorno (idéntica a $_ENV o $_SERVER). Un nombre de variable debe ser especificado entre llaves para indicar el nombre de la variable de entorno. Por ejemplo, información específica del servidor como %{REQUEST_METHOD}e o %{SERVER_PROTOCOL}e, encabezados HTTP como %{HTTP_HOST}e o %{HTTP_USER_AGENT}e fastcgi env
%f Nombre del fichero script
%l Content-Length de la petición (solo para peticiones HTTP POST)
%m Método HTTP de la petición
%M memory
%n Nombre del pool
%{name}o Encabezado de salida. El nombre del encabezado debe ser especificado entre llaves. Por ejemplo: %{Content-Type}o, %{X-Powered-By}o, %{Transfer-Encoding}o
%p PID del hijo que procesó la petición
%P PID del padre del hijo que procesó la petición
%q Cadena de consulta
%Q El carácter '?', o el enlace entre %q y %r, si la cadena de consulta existe
%r URI de la petición sin la cadena de consulta, ver %q y %Q
%R Dirección IP remota
%s Estado (código de respuesta)
%t Hora del servidor a la cual la petición fue recibida. Puede aceptar un formato strftime(3): %d/%b/%Y:%H:%M:%S %z (por omisión). El formato strftime(3) debe ser encapsulado en una etiqueta %{<strftime_format>}t, por ejemplo, para una cadena de tiempo en formato ISO8601, use: %{%Y-%m-%dT%H:%M:%S%z}t
%T Hora a la cual el registro fue escrito (cuando la petición terminó). Puede aceptar un formato strftime(3): %d/%b/%Y:%H:%M:%S %z (por omisión). El formato strftime(3) debe ser encapsulado en una etiqueta %{<strftime_format>}T, por ejemplo, para una cadena de tiempo en formato ISO8601, use: %{%Y-%m-%dT%H:%M:%S%z}T
%u Usuario remoto

Es posible pasar variables de entorno adicionales y actualizar los parámetros de PHP de un pool. Para ello, debe añadir las opciones siguientes al fichero de configuración de la cola de espera.

Ejemplo #1 Pasar variables de entorno y parámetros PHP a un pool

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 32M
Los parámetros PHP pasados con php_value o php_flag sobrescribirán su valor anterior. Tenga en cuenta que definir disable_functions o disable_classes no sobrescribirá los valores previamente definidos en php.ini, sino que añadirá los valores a los antiguos.

Los parámetros definidos con php_admin_value y php_admin_flag no pueden ser sobrecargados vía ini_set().

Los parámetros de PHP pueden ser definidos en el servidor web.

Ejemplo #2 Definir los parámetros PHP en el fichero nginx.conf

set $php_value "pcre.backtrack_limit=424242";
set $php_value "$php_value \n pcre.recursion_limit=99999";
fastcgi_param  PHP_VALUE $php_value;

fastcgi_param  PHP_ADMIN_VALUE "open_basedir=/var/www/htdocs";
Precaución

Debido a que estas configuraciones son pasadas a php-fpm como encabezados fastcgi, php-fpm no debe estar conectado directamente al web y así ser directamente accesible. De lo contrario, cualquiera podrá alterar las opciones de configuración de PHP. Véase también la opción listen.allowed_clients.

Nota: Los pools no son un mecanismo de seguridad, ya que no proporcionan una separación total; por ejemplo, todos los pools utilizarían una sola instancia OPcache.

add a note

User Contributed Notes 9 notes

up
19
ikrabbe
7 years ago
It seems there is no way to get informed about the access log format codes that are used or can be used. All I found is the source code.

It would really help, not to have open questions when deploying php-fpm. I constantly struggle with file paths for example, but that is another topic.

case '%': /* '%' */
case 'C': /* %CPU */
case 'd': /* duration µs */
case 'e': /* fastcgi env */
case 'f': /* script */
case 'l': /* content length */
case 'm': /* method */
case 'M': /* memory */
case 'n': /* pool name */
case 'o': /* header output */
case 'p': /* PID */
case 'P': /* PID */
case 'q': /* query_string */
case 'Q': /* '?' */
case 'r': /* request URI */
case 'R': /* remote IP address */
case 's': /* status */
case 'T':
case 't': /* time */
case 'u': /* remote user */
up
11
rob at librobert dot net
4 years ago
The 'include' directive that is used in php-fpm.conf is not documented here. However, this directive can also be used in the pool configurations. In the included file, the $pool variable is substituted correctly.

This means that, if you have multiple pools with similar configurations, you can create a file 'default-values.inc' like so:

-----
listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = X
pm.min_spare_servers = X
pm.max_spare_servers = X

access.log = /var/log/php-fpm/$pool.access
access.format = "%R %u [%t] \"%m %r\" %s %d %l"
slowlog = /var/log/php-fpm/$pool.slow

php_flag[short_open_tag] = off
-----

And then include that file in each pool configuration like so:

-----
[vhost1.example.com]
user = www-vhost1
group = www-vhost1

listen = 127.0.0.1:9001

include = /usr/local/etc/php-fpm.d/default-values.inc
-----

This makes things a bit more transparent, and it could potentially save some time if you decide to change settings.

Make sure the name of the included file does not end in '.conf', because all files with that extension are loaded from php-fpm.conf.
up
14
gadnet at aqueos dot com
11 years ago
the doc is lacking a lot of things it seems.

The php fpm exemple config file indicate different thing, more option etc... I wonder why the main documentation is less verbose that the configuration file that user can have .. or not have ?
up
9
Frank DENIS
13 years ago
The default value for listen.backlog isn't exactly "unlimited".

It's 128 on some operating systems, and -1 (which doesn't mean "unlimited" as well, but is an alias to a hard limit) on other systems.

Check for a sysctl value like kern.somaxconn (OpenBSD) or net.core.somaxconn (Linux).

Crank it up if you need more PHP workers than the default value. Then adjust listen.backlog in your php-fpm configuration file to the same value.

-Frank.
up
2
antonfedonyuk at gmail dot com
3 years ago
NOTE: "access.format" containing "%o" generate error in PHP 7.4 (don't tested in other versions)
up
5
antonfedonyuk at gmail dot com
3 years ago
; The access log format.
; The following syntax is allowed
; %%: the '%' character
; %C: %CPU used by the request
; it can accept the following format:
; - %{user}C for user CPU only
; - %{system}C for system CPU only
; - %{total}C for user + system CPU (default)
; %d: time taken to serve the request
; it can accept the following format:
; - %{seconds}d (default)
; - %{milliseconds}d
; - %{milli}d
; - %{microseconds}d
; - %{micro}d
; %e: an environment variable (same as $_ENV or $_SERVER)
; it must be associated with embraces to specify the name of the env
; variable. Some examples:
; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e
; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e
; %f: script filename
; %l: content-length of the request (for POST request only)
; %m: request method
; %M: peak of memory allocated by PHP
; it can accept the following format:
; - %{bytes}M (default)
; - %{kilobytes}M
; - %{kilo}M
; - %{megabytes}M
; - %{mega}M
; %n: pool name
; %o: output header
; it must be associated with embraces to specify the name of the header:
; - %{Content-Type}o
; - %{X-Powered-By}o
; - %{Transfert-Encoding}o
; - ....
; %p: PID of the child that serviced the request
; %P: PID of the parent of the child that serviced the request
; %q: the query string
; %Q: the '?' character if query string exists
; %r: the request URI (without the query string, see %q and %Q)
; %R: remote IP address
; %s: status (response code)
; %t: server time the request was received
; it can accept a strftime(3) format:
; %d/%b/%Y:%H:%M:%S %z (default)
; The strftime(3) format must be encapsulated in a %{<strftime_format>}t tag
; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t
; %T: time the log has been written (the request has finished)
; it can accept a strftime(3) format:
; %d/%b/%Y:%H:%M:%S %z (default)
; The strftime(3) format must be encapsulated in a %{<strftime_format>}t tag
; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t
; %u: remote user
;
; Default: "%R - %u %t \"%m %r\" %s"
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{milli}d %{kilo}M %C%%"

https://github.com/php/php-src/blob/master/sapi/fpm/www.conf.in#L257-L318
up
6
frederic at juliana-multimedia dot com
6 years ago
With Apache, mod_proxy_fcgi and php-fpm, if you want to have a generic pool and several vhost with different php configuration, you can use the ProxyFCGISetEnvIf directive and the PHP_ADMIN_VALUE environment variable. It does not work with PHP_ADMIN_FLAG even for boolean directives.

PHP directives must be separated by spaces and a \n.

ProxyFCGISetEnvIf "true" PHP_ADMIN_VALUE "open_basedir=/var/www/toto/:/tmp/ \n session.save_path=/var/www/toto/session \n display_errors=On \n error_reporting=-1"
up
3
jon dot phpnetdonotspam at langevin dot me
2 years ago
PHP-FPM configuration page apparently doesn't see the need to specify what options are available with each version of PHP.

It claims that pm.status_listen is a valid directive, but that directive only exists as of php 8.0.0, which is a bummer for those of us still using PHP 7.4.

Noting this for anyone else fighting with this.
up
2
david dot cancalon at proxeem dot fr
4 years ago
Be very carrefull when using ProxyFCGISetEnvIf within a Apache virtual host configuration using a shared PHP-FPM pool. Values defined like this are shared across all the Apache virtual hosts within a pool worker, may resulting in strange behaviours depending on the requests chronology.

See full explanation here:
https://serverfault.com/questions/817020/stop-reusing-php-value-for-different-sites-with-php-fpm/817905#817905
To Top