Dutch PHP Conference 2025 - Call For Papers

Конфігурування

FPM використовує синтаксис php.ini для свого конфігураційного файла - php-fpm.conf, та пулу файлів конфігурації.

Список глобальних директив php-fpm.conf

pid string

Шлях до PID-файла. Початкове значення: none.

error_log string

Шлях до файла журнала помилок. Початкове значення: #INSTALL_PREFIX#/log/php-fpm.log.

log_level string

Ріень логування помилок. Можливі значення: alert, error, warning, notice, debug. Початкове значення: notice.

emergency_restart_threshold int

Якщо дане число дочірніх процесів завершиться з SIGSEGV чи SIGBUS всередині інтервалу часу, встеновленого через emergency_restart_interval, то FPM буде перезапущено. Значення 0 означає 'відключено'. Початкове значення: 0 (відключено).

emergency_restart_interval mixed

Інтервал часу, який використовує emergency_restart_interval, щоб визначити коли FPM буде м'яко перезапущено. Це може бути корисно, щоб уникнути випадкових пошкоджень прискорювача загальної пам'яті. Доступні Одиниці Виміру: s (секунди), m (хвилини), h (години), або d (дні). Одиниці виміру початково: секунди. Початкове значення: 0 (виключено).

process_control_timeout mixed

Обмеження часу для дочірніх процесів, щоб дочекатись реакції сигнала від майстра. Доступні одиниці виміру: s (секунди), m (хвилини), h (години), або d (дні) Одиниці виміру початково: секунди. Початкове значення: 0.

daemonize boolean

Запускає FPM в фоновому режимі. Встановлене значення 'no' залишє FPM на передньому плані для відлагодження. Початкове значення: yes.

Список директив пулів

З FPM ви можете запустити декілька пулів процесів з різними налаштуваннями. Ці параметри можна передавати в пул.

listen string

Адреса, за якою приймати FastCGI-запити. Дійсний синтаксис такий: 'ip.add.re.ss:port', 'port', '/path/to/unix/socket'. Цей параметр є обов'язковим для кожного пулу.

listen.backlog int

Наприклад, встановіть listen(2) для зворотнього логування. Значення '-1' означає 'без обмежень'. Початкове значення: -1.

listen.allowed_clients string

Список ipv4 адрес FastCGI-клієнтів, які дозволені для підключення. Еквівалент для змінної оточення FCGI_WEB_SERVER_ADDRS в оригінальному PHP FastCGI (5.2.2+). Має сенс лише з прослуховуванням TCP-сокета. Кожна адреса повинна бути розділена через кому. Якщо встановити пусте значення, підключення буде прийматись з будь-якої адреси. Початкове значення: any.

listen.owner string

Виставляє права для unix-сокетів, якщо вони використовуються. В Linux, права на читання/запис потрібно встановлювати для того, щоб дозволити підключення з веб-сервера. В багатьох системах, заснованих на BSD, дозволяються підключення незалежно від прав. Початкове значення: користувач та група мають такі ж права, як і користувач, від чийого імені запущено процес; вистановлено режим 0660.

listen.group string

Дивіться listen.owner.

listen.mode string

Дивіться listen.owner.

user string

Unix-користувач FPM-процесів. Цей параметр є обов'язковим.

group string

Unix-група FPM-процесів. Якщо не встановлено, використовується початкова група.

pm string

Вибір того, як менеджер процесів буде контролювати число дочірніх процесів. Можливі значення: static, ondemand, dynamic. Цей параметр є обов'язковим.

static - фіксоване число дочірніх процесів (pm.max_children).

ondemand - розмноження процесів на вимогу (під час запиту, на відміну від dynamic, при якому pm.start_servers стартує, коли сервсіс запускається).

dynamic - число дочірніх процесів встановлюється динамічно, на основі наступних директив: pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers.

pm.max_children int

Число дочірніх процесів, які будуть створені, коли для параметра pm встановлено значення static, або ж максимальне число дочірніх процесів, що будуть створені, коли для параметра pm встановлено значення dynamic. Цей параметр є обов'язковим.

Цей параметр встановлює обмеження на число одночасних запитів, які будуть обслуговуватись. Еквівалент директиви ApacheMaxClients з mpm_prefork та для змінної оточення PHP_FCGI_CHILDREN в оригінальному PHP FastCGI.

pm.start_servers int

Число дочірніх процесів, створених при запуску. Використовується тільки коли для параметра pm встановлено значення dynamic. Початкове значення: min_spare_servers + (max_spare_servers - min_spare_servers) / 2.

pm.min_spare_servers int

Бажане мінімальне число неактивних процесів сервера. Використовується тільки коли для параметра pm встановлено значення dynamic. В даному випадку також є обов'язковим.

pm.max_spare_servers int

Бажане максимальне число неактивних процесів сервера. Використовується тільки коли для параметра pm встановлено значення dynamic. В даному випадку також є обов'язковим.

pm.max_requests int

Число запитів кожного дочірнього процеса, які повинні виконуватись перед перезапуском. Це може бути корисним для запобігання витоку пам'яті при використанні сторонніх бібліотек. Щоб не обмежувати число запитів встановіть значення для цього параметра в '0'. Еквівалент для PHP_FCGI_MAX_REQUESTS. Початкове значення: 0.

pm.status_path string

URI для перекляду сторінки FPM-статуса. Якщо значення для цього параметра не встановлено, то не буде URI, де очікується сторінка статуса. Початкове значення: none.

ping.path string

URI для пінга, щоб викликати сторінку моніторинга FPM. Якщо значення не встановлено, не буде URI, де очікується пінг-сторінка. Це можна використовувати для перевірки із зовні, що FPM працює та відповідає. Зауважте, що значення повинно починатись зі слеша (/).

ping.response string

Цю дериктиву можна використовувати для компонування відповіді під час пінг-запиту. Відповідь формується як text/plain з кодом відповіді 200. Початкове значення: pong.

request_terminate_timeout mixed

Таймаут для обслуговування одиночних запитів, після якого робочий процес (worker) буде вбито. Цей параметр потрібно використовувати, коли ini-опція 'max_execution_time' по якійсь причині не зупиняє виконання. Значення '0' означає 'виключено'. Доступні одиниці виміру: s (секунди, початково), m (хвилини), h (години), або d (дні). Початкове значення: 0.

request_slowlog_timeout mixed

Таймаут для обслуговування одиночних запитів, після якого PHP-бектрейс буде поміщено в файл 'slowlog'. Значення '0' означає 'виключено'. Доступні одиниці виміру: s (секунди, початково), m (хвилини), h (години), або d (дні). Початкове значення: 0.

slowlog string

Файл логів для повільних запитів. Початкове значення: #INSTALL_PREFIX#/log/php-fpm.log.slow.

rlimit_files int

Встановлює відкритий файловий дескриптор rlimit. Початкове значення: визначається налаштуванням системи.

rlimit_core int

Встановлює максимальний rlimit-розмір ядра. Можливі значення: 'unlimited' або ціле число, що більше чи рівне 0. Початкове значення: визначається налаштуванням системи.

chroot string

Зміна кореневого каталогу при старті. Цей параметр повинен мати значення з абсолютним шляхом. Коли його не визначено, chroot не використовується.

chdir string

Зміна поточного каталогу при старті. Цей параметр повинен мати значення з абсолютним шляхом. Початкове значення: поточна директорія чи / при зміні кореневого каталогу.

catch_workers_output boolean

Перенаправлення stdout та stderr робочого процеса в головний журнал помилок. Якщо не встановлено, stdout та stderr будуть перенаправлятись до /dev/null відповідно до специфікації FastCGI. Початкове значення: no.

Можна передавати додаткові змінні оточення, та оновлювати налаштування PHP конкретного пулу. Для цього вам потрібно додати наступні параметри до конфігураційного файла пулу (php-fpm.conf).

Приклад #1 Передача змінних оточення та налаштувань для пула

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
Налаштування PHP, що передаються через php_value або через php_flag будуть перезаписувати їхні попередні значення. Майте на увазі, що визначення disable_functions чи disable_classes не будуть перезаписувати їхні попередньо встановлені значення в php.ini, а додадуть нові значення.

Значення, що визначені через php_admin_value та php_admin_flag не будуть перезаписуватись значеннями з ini_set().

Починаючи з 5.3.3, PHP-налаштування також можна встановлювати через веб-сервер.

Приклад #2 встановлення налаштувань PHP в файлі 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";
Застереження

Оскільки ці налаштування передаються до php-fpm як fastcgi-заголовки, php-fpm не повинні бути прив'язаними до загально-доступної адреси. В противному разі, будь-хто може змінювати параметри конфігурації PHP. Прогляньте також listen.allowed_clients.

add a note

User Contributed Notes 11 notes

up
19
ikrabbe
6 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
12
rob at librobert dot net
3 years ago
The 'index' 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
10 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
4
jon dot phpnetdonotspam at langevin dot me
1 year 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
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
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
6
frederic at juliana-multimedia dot com
5 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
2
david dot cancalon at proxeem dot fr
3 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
up
2
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
2
rob at librobert dot net
3 years ago
Correction for my previous note...

I wrote "The 'index' directive that is used in php-fpm.conf".

But obviously I meant "The 'include' directive"...
up
-3
Yousef Ismaeil Cliprz
10 years ago
Check if fastCGI enabled

<?php
// You can use isset or is_null for $_SERVER['FCGI_SERVER_VERSION']
function isFastCGI () {
return !
is_null($_SERVER['FCGI_SERVER_VERSION']);
}

?>
To Top