PHP-FPM имеет конфигурацию по умолчанию, которая использует больше памяти, чем это необходимо. Она имеет запасные PHP-FPM процессы, готовые запускаться, занимая память в случае, если есть PHP код в обработки. Хотя это и не проблема, если у вас есть тонны оперативной памяти, это может быть проблемой для низкой VPS RAM и если вы используете агрессивное кэширование страниц, то это память используется без необходимости, которая может быть использована для MariaDB (MySQL) или для других важных процессов. Это руководство объясняет, как настроить конфигурацию Nginx с PHP-FPM работающем на PHP 7.0, чтобы использовать как можно меньше оперативной памяти, как это возможно.
Настройка PHP-FPM для повышения производительности + Low Memory
Откройте файл конфигурации PHP-FPM для PHP 7.0.
sudo nano /etc/php/7.0/fpm/pool.d/www.conf
Настройте следующие значения, как показано ниже, обратите внимание на ;
перед pm.start_servers
, pm.min_spare_servers
и pm.max_spare_servers
.
pm = ondemand
означает, что дочерние процессы в PHP-FPM будут порождаться только при необходимости
pm.max_children
это максимальное количество дочерних процессов, которые будут разрешены, 50 является достаточно либеральным, но если вы видите в своем архиве журналов что количество дочерних процессов превысило максимальное значение, то необходимо увеличить это значение
pm.process_idle_timeout
убивает дочерние процессы после того, как они бездействовали в течение 10 секунд
pm.max_requests
устанавливает максимальное количество запросов PHP для каждого дочернего процесса
pm = ondemand ; Число дочерних процессов, которые будет создано, когда pm установлен в 'static' и ; Максимальное число дочерних процессов, когда pm установлен в 'dynamic' и 'ondemand'. ; Это значение устанавливает ограничение на количество одновременных запросов, которые будут ; запускаться. Эквивалент директивы ApacheMaxClients в mpm_prefork. ; Эквивалентная переменная среды PHP_FCGI_CHILDREN в оригинальном PHP ; CGI. Ниже, по умолчанию основаны на сервере без использования значительных ресурсов. Не ; забудьте настройки часов.* чтобы соответствовать вашим потребностям. ; Примечание: используется, когда pm установлен в 'static', 'dynamic' или 'ondemand' ; Примечание: это значение является обязательным. pm.max_children = 50 ; Число дочерних процессов, созданных при запуске. ; Примечание: используется только тогда, когда pm установлен в "dynamic" ; Значение по умолчанию: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 ;pm.start_servers = 2 ; Требуемое минимальное число неактивных процессов сервера. ; Примечание: используется только тогда, когда pm установлен в "dynamic" ; Примечание: обязательное, когда pm установлен в "dynamic" ;pm.min_spare_servers = 1 ; Требуемое максимальное число неактивных процессов сервера. ; Примечание: используется только тогда, когда pm установлен в "dynamic" ; Примечание: обязательное, когда pm установлен в "dynamic" ;pm.max_spare_servers = 3 ; Число секунд, по истечении которых бездействующий процесс будет убит. ; Примечание: используется только тогда, когда pm установлен в 'ondemand' ; Значение по умолчанию: 10s pm.process_idle_timeout = 10s; ; Число запросов после которых дочерний процесс будет перезапущен. ; Это может быть полезно во избежания утечек памяти в 3-й партии библиотек. Для ; бесконечной обработки запроса укажите '0'. Эквивалент PHP_FCGI_MAX_REQUESTS. ; Значение по Умолчанию: 0 pm.max_requests = 500
Проверьте правильность вашего синтаксиса конфигурации PHP-FPM
php-fpm7.0 -t
Вы должны увидеть, что конфигурация действует
[01-Jun-2017 15:51:34] NOTICE: configuration file /etc/php/7.0/fpm/php-fpm.conf test is successful
Теперь вы можете перезапустить php7.0-FPM
sudo service php7.0-fpm restart
Вы можете увидеть, что объем оперативной памяти используется значительно меньше.