nginx php admin value

Nginx php admin value

FPM использует синтаксис php.ini для своего файла конфигурации php-fpm.conf и файлов конфигурации пулов.

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

Путь к PID-файлу. По умолчанию: none.

Уровень журналирования ошибок. Возможные значения: alert, error, warning, notice, debug. По умолчанию: notice.

Ограничить журналирование для журналируемых линиях, что позволяет записывать сообщения длиной более 1024 символов без упаковки (wrapping). Значение по умолчанию: 1024. Доступно с PHP 7.3.0.

Экспериментальное журналирование без дополнительной буферизации. Значение по умолчанию: yes. Доступно с PHP 7.3.0.

Используется для указания, какой тип программ будет логировать сообщения. По умолчанию: daemon.

Предшествует любому сообщению. Если у вас запущено несколько экземпляры FPM, вы можете изменить значение по умолчанию на то, которое вам необходимо. По умолчанию: php-fpm.

При данном числе рабочих процессов, завершённых с SIGSEGV или SIGBUS за промежуток времени, установленный emergency_restart_interval FPM будет перезагружен. Значение 0 означает ‘Off’ (отключено). По умолчанию: 0 (Off).

Время, в течение которого дочерние процессы ждут ответа на сигналы мастер-процессу. Доступные единицы измерения: s(секунды), m(минуты), h(часы) или d(дни). Единица измерения по умолчанию: секунды. Значение по умолчанию: 0.

Максимальное количество процессов, которое может породить FPM. Это сделано для того, чтобы контролировать глобальное количество процессов, когда используется большой пул динамического PM. Используйте с осторожностью. По умолчанию: 0.

Запустить FPM в фоновом режиме. Установите значение ‘no’, чтобы запустить FPM в диспетчере для отладки. По умолчанию: yes.

Устанавливает rlimit открытых файловых дескрипторов для мастер-процесса. По умолчанию: Устанавливает rlimit для открытого дескриптора файла мастер-процесса(?).

Устанавливает rlimit максимального размера ядра для мастер-процесса. По умолчанию 0.

Указывает, какой событийный механизм будет использован FPM. Возможны такие варианты: select, pool, epoll, kqueue (*BSD), port (Solaris). По умолчанию: не установлено (автоопределение).

Если FPM собран с интеграцией с systemd, указывает интервал, в секундах, между оповещениями systemd о своём состоянии. Для отключения задайте 0. По умолчанию: 10.

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

С помощью FPM вы можете запускать несколько пулов процессов с различными настройками. Эти параметры могут быть переданы пулу.

Адрес, который будет принимать FastCGI-запросы. Синтаксис: ‘ip.add.re.ss:port’, ‘port’, ‘/path/to/unix/socket’. Эта опция обязательна для каждого пула.

Список IPv4-адресов FastCGI-клиентов, которые имеют право подключения. Эквивалент переменной окружения среды FCGI_WEB_SERVER_ADDRS в оригинальном PHP FastCGI (5.2.2+). Имеет смысл только с TCP-сокетом. Каждый адрес должен быть отделен запятой. Если оставить значение пустым, то соединения будут приниматься с любого IP. По умолчанию: any. Можно использовать IPv6.

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

Если поддерживается список управления доступом (ACL) POSIX, вы можете настроить его с помощью этой опции. Если задано, то listen.owner и listen.group будут проигнорированы. Значение задаётся списком имён, разделённых запятой.

Unix-пользователь FPM-процессов. Этот параметр является обязательным.

Unix-группа FPM-процессов. Если не установлен, группа по умолчанию равняется имени пользователя.

Этот параметр устанавливает ограничение на число одновременных запросов, которые будут обслуживаться. Эквивалент директивы ApacheMaxClients с mpm_prefork и переменной окружения среды PHP_FCGI_CHILDREN в в оригинальном PHP FastCGI.

Ссылка, по которой можно посмотреть страницу состояния FPM. Если значение не установлено, то страница статуса отображаться не будет. Значение по умолчанию: none.

Ссылка на ping-страницу мониторинга FPM. Если значение не установлено, ping-страница отображаться не будет. Может быть использовано для тестирования извне, чтобы убедиться, что FPM жив и отвечает. Обратите внимание, что значение должно начинаться с косой черты (/).

Эта директива может быть использована на настройки ответа на ping-запрос. Ответ формируется как text/plain со кодом ответа 200. Значение по умолчанию: pong.

Установить флаг процесса dumpable (PR_SET_DUMPABLE prctl), даже если the пользователь процесса или группа отличается от пользователя мастер-процесса. Это позволяет создавать дамп ядра процесса и выполнить ptrace процесса для пользователя пула. Значение по умолчанию: no. Доступно с PHP 7.0.29, 7.1.17 и 7.2.5.

Задаёт префикс для вычисления пути

Таймаут для обслуживания одного запроса, после чего рабочий процесс будет завершён. Этот вариант следует использовать, когда опция ‘max_execution_time’ в php.ini не останавливает выполнение скрипта по каким-то причинам. Значение ‘0’ означает ‘выключено’. Доступные единицы измерения: s(econds), m(inutes), h(ours) или d(ays). Значение по умолчанию: 0.

Таймаут для обслуживания одного запроса, после чего PHP backtrace будет сохранён в файл ‘slowlog’. Значение ‘0’ означает ‘выключено’. Доступные единицы измерения: s(econds), m(inutes), h(ours) или d(ays). Значение по умолчанию: 0.

Устанавливает лимит дескрипторов открытых файлов rlimit для дочерних процессов в этом пуле. Значение по умолчанию: определяется значением системы.

Устанавливает максимальное количество используемых ядер rlimit для дочерних процессов в этом пуле. Возможные значения: ‘unlimited’ или целое число большее или равное 0. Значение по умолчанию: определяется значением системы.

Директория chroot окружения при старте. Это значение должно быть определено как абсолютный путь. Если значение не установлено, chroot не используется.

Chdir изменяет текущую директорию при старте. Это значение должно быть определено как абсолютный путь. Значение по умолчанию: текущая директория или / при использовании chroot.

Перенаправление STDOUT и STDERR рабочего процесса в главный лог ошибок. Если не установлен, STDOUT и STDERR будут перенаправлены в /dev/null в соответствии со спецификацией FastCGI. Значение по умолчанию: no.

Включите оформление выхода (output decoration) для вывода worker-процесса когда опция catch_workers_output включена. Значение по умолчанию: yes. Доступно с PHP 7.3.0.

Очищает окружение в worker-процессах FPM. Предотвращает попадание произвольных переменных окружения в worker-процессы FPM, очищая окружение у worker-процессах до того, как переменные окружения, указанные в этой конфигурации пула будут добавлены. По умолчанию: Yes.

Лог-файл доступа. Значение по умолчанию: не установлено

Можно передать дополнительные переменные окружения и обновить настройки PHP для определённого пула. Для этого вам необходимо добавить следующие параметры в файл настройки пула.

Пример #1 Передача переменных окружения и настроек PHP пулу

Начиная с версии 5.3.3 настройки PHP можно устанавливать через веб-сервер.

Пример #2 Установка настроек PHP в nginx.conf

Так как эти настройки передаются в php-fpm как FastCGI-заголовки, php-fpm не должен быть привязан к общедоступному адресу из мира. В противном случае любой сможет изменить настройки PHP. Смотрите также listen.allowed_clients.

User Contributed Notes 12 notes

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 */

the doc is lacking a lot of things it seems.

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»

The default value for listen.backlog isn’t exactly «unlimited».

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.

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.

Correction for my previous note.

I wrote «The ‘index’ directive that is used in php-fpm.conf».

But obviously I meant «The ‘include’ directive».

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

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

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

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

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

Источник

PHP-FPM. НАСТРОЙКА И ТЮНИНГ

php-fpm – PHP FastCGI менеджер процессов. Используется в связке с nginx + php. По моему мнению лучшая связка для веб-сайтов.

Разобраться в параметрах конфигурации, и решить проблему, которая возникла на продакшен сервере с чрезмерным потреблением оперативной памяти. Произошло это потому, что php-fpm породил множество дочерних процессов, которые с радостью съели память, и, в один прекрасный момент, когда еще запустился парсер, OOM-killer положил мою машину. Причем ночью. На 6 часов. Почему она именно зашатдаунилась, а не ребутнулась – это другой вопрос, но неприятный впечатлений была масса.

Конфигурация и термины

/etc/php-fpm.conf – глобальная конфигурация

/etc/php-fpm.d/* – конфигурация пулов

Pool – это группа процессов, выделенная для обработки запросов, поступающих на определённый порт или Unix-сокет. В PHP-FPM возможно использовать отдельные пулы для каждого сайта и точно распределять ресурсы, а также использовать разных пользователей и разные группы для каждого пула.

Если пулы работают от имени одного и того же пользователя, разделение приложений по пулам позволяет предотвратить ситуацию, когда высоконагруженное приложение постоянно держит занятыми процессы-обработчики, не давая таким образом нормально работать лёгким интерактивным приложениям.

Для каждого из пулов можно задавать разные настройки PHP. Причем эти настройки будут иметь приоритет выше, чем те, что в php.ini либо те, которые могут задаваться напрямую из php-скриптов.

Конфигурация и параметры

Итак, начнем с глобального конфига:

Теперь можно рассмотреть конфигурацию пула (для примера /etc/pfp-fpm.d/blog.conf):

Также, отредактируем php.ini файл, указав:

О подсчетах параметров:

Остается закономерный вопрос: а как же выбрать комфортные параметры для сайта? С дефолтным конфигом сделаем следующее:
1. Предположим, что у нас есть VDS с 512 Mb оперативной памяти, из которой 200 Mb мы можем выделить под PHP-FPM.
2. Возьмем “тяжелые” страницы сайта и откроем их (желательно почти параллельно) в том колличестве, сколько потенциально их может быть открыто параллельно в пиковые нагрузки (при этом количество страниц возьмем с небольшой дельтой в большую сторону)
3. Смотрим через htop количество памяти, которое забрали под себя процессы php-fpm. Добустим это 20 Mb на каждый. Тогда добавив дельту в 10%, будем считать что это 22 Mb.
4. Считаем значение для параметра pm.max_children:
200 / 22 = 9.09

Приемлемым значением pm.max_children будет 9. Это значение основано на среднем значении и возможно далее его необходимо будет изменить, когда вы заметите длительное время использования памяти процессом. После быстрого тестирования несложно выбрать значения pm.start_servers, pm.min_spare_servers и pm.max_spare_servers. Максимальное количество запросов на процесс по умолчанию не ограничено, но хорошо бы установить какое-нибудь небольшое значение, например 200, и избежать проблем с памятью. Такого вида настройка может обрабатывать большое количество запросов, даже если значение параметра невелико.

В итоге, получаем примерно такой блок конфигурации:

Читайте также

Попробуем определить каким образом можно повысить производительность сервера приложений на базе php-fpm, а также сформировать чек-лист для проверки конфигурации fpm…

Стандартные библиотеки PHP умеют генерировать только целые случайные числа. Однако, возникают задачи где нужно не целое рандомное число с максимально…

Казалось бы http_build_query — простая функция, однако, имеет некоторые особенности. Нельзя однозначно сказать что это баг, скорее просто недокументированная фича,…

Источник

Размещение нескольких сайтов на Nginx и Php-fpm в Ubuntu 14.04

Стек LEMP (Linux, nginx, MySQL, PHP) обеспечивает высокую скорость и надежность при запуске сайтов PHP. Однако такие его качества, как безопасность и изоляция, менее популярны среди пользователей.

В этом мануале вы узнаете больше о безопасности и изоляции при запуске сайтов на LEMP через разных пользователей. Это делается путем создания пулов php-fpm для каждого блока server nginx (виртуального хоста).

Требования

Дополнительная безопасность стека LEMP

В общей настройке LEMP существует только один пул php-fpm, который запускает все скрипты PHP для всех сайтов под одним и тем же пользователем. Это создает две основные проблемы:

php-fpm решает эти проблемы с помощью индивидуальных пулов для каждого сайта.

1: Настройка php-fpm

Если вы выполнили все предварительные требования, на вашем сервере уже есть рабочий веб-сайт. Если у вас нет FQDN, вы можете получить доступ к нему по FQDN localhost локально или по IP-адресу сервера удаленно.

Теперь создайте второй сайт (site1.example.org) со своим собственным пулом php-fpm и пользователем Linux.

Для начала нужно создать пользователя. Для лучшей изоляции новый пользователь должен иметь свою собственную группу. Поэтому сначала создайте группу site1:

sudo groupadd site1

Затем создайте пользователя site1, который будет входить в эту группу.

На данный момент пользователь site1 не имеет пароля и не может входить на сервер. Если вам нужно предоставить кому-то доступ к сайту через этого пользователя, создайте для него пароль с помощью команды:

Теперь пользователь может удаленно войти в систему через ssh или sftp.

Затем создайте новый пул php-fpm для site1. Пул php-fpm – это по сути обычный Linux-процесс, который работает под определенным пользователем/группой и прослушивает сокет Linux. Он также может прослушивать комбинацию IP:порт, но для этого потребуется больше ресурсов сервера, и это не самый предпочтительный метод.

Итак, для нового сайта нужно создать файл /etc/php5/fpm/pool.d/site1.conf. Вы можете сделать это с помощью редактора:

sudo vim /etc/php5/fpm/pool.d/site1.conf

В файле должны быть такие параметры:

[site1] user = site1

group = site1

listen = /var/run/php5-fpm-site1.sock

listen.owner = www-data

listen.group = www-data

php_admin_value[disable_functions] = exec,passthru,shell_exec,system

php_admin_flag[allow_url_fopen] = off
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /

В приведенной выше конфигурации обратите внимание на следующие параметры:

Примечание: Вышеупомянутые значения php_admin_value и php_admin_flag также могут применяться глобально. Однако сайту они могут не понадобиться, поэтому по умолчанию они не настроены. преимущество пулов php-fpm заключается в том, что они позволяют точно настраивать индивидуальные параметры безопасности для каждого сайта. Кроме того, эти параметры могут использоваться с другими параметрами php для дальнейшей настройки среды сайта.

Параметры pm подробно рассматриваться здесь не будут, но вы должны знать, что они позволяют настраивать производительность пула.

Параметр chdir должен иметь значение /, что определяет корень файловой системы. Это значение не нужно изменять, если вы не используете другой важный параметр chroot.

Параметр chroot не включен в указанную выше конфигурацию. Это позволит вам запускать пул в закрытой среде, то есть заблокировать его внутри одного каталога. Это отлично подходит для настройки безопасности, поскольку вы можете заблокировать пул внутри корневого каталога веб-сайта. Однако такая настройка вызовет серьезные проблемы для любого PHP-приложения, которое использует системные бинарные файлы и приложения – они не будут доступны.

Перезапустите php-fpm, чтобы обновить параметры:

sudo service php5-fpm restart

Убедитесь, что новый пул запущен правильно, запросив его процессы:

Если вы точно следовали инструкциям, вы должны увидеть такой результат:

Красным выделен пользователь, через которого запущен процесс или пул php-fpm.

Кроме того, нужно отключить кэширование php по умолчанию, предоставляемое opcache. Это расширение кэширования может улучшить производительность, но не безопасность, как вы убедитесь позже. Чтобы отключить его, отредактируйте файл /etc/php5/fpm/conf.d/05-opcache.ini с привилегиями суперпользователя и добавьте строку:

После этого перезапустите php-fpm.

sudo service php5-fpm restart

2: Настройка nginx

Настроив пул php-fpm для второго сайта, вы можете приступать к настройке виртуального хоста nginx (для этого используются блоки server). Откройте файл/etc/nginx/sites-available/site1 в текстовом редакторе:

sudo vim /etc/nginx/sites-available/site1

В файл нужно вставить:

Вышеприведенный код – это общая конфигурация блока server в nginx. Обратите внимание на выделенные красным части:

Создайте корневой каталог:

sudo mkdir /usr/share/nginx/sites
sudo mkdir /usr/share/nginx/sites/site1

Чтобы включить этот сайт, нужно создать симлинк на него в каталоге /etc/nginx/sites-enabled/. Это можно сделать с помощью команды:

Затем перезапустите nginx, чтобы изменения вступили в силу:

sudo service nginx restart

3: Тестирование

sudo vim /usr/share/nginx/html/info.php

Затем скопируйте файл в корневой каталог другого сайта (site1.example.org):

sudo cp /usr/share/nginx/html/info.php /usr/share/nginx/sites/site1/

Теперь вы можете выполнить базовый тест, чтобы проверить работу сервера. Тест можно выполнить с помощью браузера, терминала или lynx, браузера командной строки. Если у вас еще нет lynx на вашем сервере, установите его с помощью команды:

sudo apt-get install lynx

Сначала проверьте файл info.php своего сайта по умолчанию. Он должен быть доступен по localhost:

В приведенной выше команде grep фильтрует вывод, отображая только переменную SERVER [“USER”], которая обозначает пользователя сервера. Для сайта по умолчанию в выводе должен отображаться пользователь www-data:

Аналогично выполняется тест второго сайта:

Если вы добавили какие-либо пользовательские настройки php для каждого пула php-fpm, вы также можете проверить их значения указанным выше способом, фильтруя интересующий вас результат.

Итак, вы знаете, что два сайта работают под разными пользователями. Теперь нужно защитить соединение. Чтобы продемонстрировать проблему безопасности, которую устраняет этот мануал, создайте файл с конфиденциальной информацией. Обычно такой файл содержит данные для подключения к БД. Если кто-либо узнает эту информацию, он сможет навредить сайту.

Создайте файл /usr/share/nginx/html/config.php. Добавьте в него строку:

В вышеприведенном файле определяется переменная pass, которая хранит значение secret. Естественно, необходимо ограничить доступ к этому файлу, поэтому нужно установить права 400, которые дают право на чтение только владельцу файла.

Чтобы изменить права доступа, выполните команду:

sudo chmod 400 /usr/share/nginx/html/config.php

Главный сайт работает через пользователя www-data, которому нужно право на чтение этого файла. Измените права собственности на файл:

sudo chown www-data:www-data /usr/share/nginx/html/config.php

Теперь используйте файл /usr/share/nginx/html/readfile.php, чтобы прочитать секретную информацию и распечатать ее. Этот файл должен содержать следующий код:

Измените права на файл:

sudo chown www-data:www-data /usr/share/nginx/html/readfile.php

Чтобы убедиться, что права собственности и доступа установлены правильно, запустите команду:

-r——— 1 www-data www-data 27 Jun 19 05:35 config.php
-rw-r—r— 1 www-data www-data 68 Jun 21 16:31 readfile.php

Теперь перейдите к последнему файлу на сайте по умолчанию с помощью команды:

Вы должны увидеть secret в выводе; это значит, что файл с конфиденциальной информацией доступен на одном сайте, это ожидаемое и правильное поведение.

Теперь скопируйте файл /usr/share/nginx/html/readfile.php на второй сайт site1.example.org:

sudo cp /usr/share/nginx/html/readfile.php /usr/share/nginx/sites/site1/

Чтобы сохранить отношения сайт/пользователь, убедитесь, что на каждом сайте файлы принадлежат соответствующему пользователю. Для этого измените права собственности на недавно скопированный файл с помощью команды:

sudo chown site1:site1 /usr/share/nginx/sites/site1/readfile.php

Чтобы убедиться, что права на файл установлены правильно, просмотрите содержимое корневого каталога site1 с помощью команды:

-rw-r—r— 1 site1 site1 80 Jun 21 16:44 readfile.php

Теперь попробуйте получить доступ к файлу site1.example.com с помощью команды:

Команда вернет пустой вывод. Кроме того, если вы будете искать ошибки в логах nginx с помощью команды:

sudo grep error /var/log/nginx/error.log

2015/06/30 15:15:13 [error] 894#0: *242 FastCGI sent in stderr: «PHP message: PHP Warning: include(/usr/share/nginx/html/config.php): failed to open stream: Permission denied in /usr/share/nginx/sites/site1/readfile.php on line 2

Примечание: Подобную ошибку вы увидите также в выводе lynx, если параметр display_errors имеет значение On в конфигурационном файле php-fpm, /etc/php5/fpm/php.ini.

Предупреждение показывает, что скрипт с сайта site1.example.org не может прочитать конфиденциальный файл config.phpfrom основного сайта. Таким образом, сайты, которые работают под разными пользователями, не могут поставить под угрозу безопасность друг друга.

Ранее вы отключили кэширование по умолчанию, предоставляемое opcache. Если вам интересно, попробуйте снова включить opcache с привилегиями суперпользователя в файле /etc/php5/fpm/conf.d/05-opcache.ini (строка opcache.enable=) и перезапустите php5-fpm с помощью команды:

sudo service php5-fpm restart

Если вы повторите тестирование с самого начала, вы сможете прочитать конфиденциальный файл независимо от прав доступа к нему.

Заключение

Для обеспечения безопасности ваших сайтов необходимо использовать индивидуальные пулы php-fpm для каждого сайта на веб-сервере Nginx. Такая изоляция может немного снизить производительность, но это позволяет предотвратить серьезные атаки и устранить уязвимости.

Подобным образом можно использовать и другие технологии изоляции PHP, например, SuPHP. Однако производительность всех других средств намного хуже, чем у php-fpm.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *