pcre.recursion_limit в Битрикс на CentOS 7
В CentOS 7+ и RH 7+ сервисы (в их числе и нужный нам httpd) теперь запускаются не скриптами старта, а именно как сервисы. Поэтому традиционная проблема Битрикс со значением pcre.recursion_limit требует теперь немного другого подхода.
Если для pcre.recursion_limit выставлено неверное значение, то PHP будет падать и тянуть за собой httpd. Собственно подробное описание ошибки из модуля “Проверка системы” Битрикс:
Параметр pcre.recursion_limit по умолчанию имеет значение 100000. Если он превышает системный размер стека (обычно 8 Мб), то PHP падает с ошибкой Segmentation fault при выполнении сложных регулярных выражений.
Решение проблемы в CentOS/RedHat 6
На всякий, приведу решение для старых версий. В 6-ке надо было в скрипт запуска httpd
/etc/rc.d/init.d/httpd
в функцию
start()
надо было дописать строку
ulimit -s unlimited
. Например так:
1 2 3 4 5 6 7 8 9 | start(){ echo-n$"Starting $prog: " ulimit-sunlimited LANG=$HTTPD_LANGdaemon--pidfile=${pidfile}$httpd$OPTIONS RETVAL=$? echo [$RETVAL=0]&&touch${lockfile} return$RETVAL } |
Решение для CentOS/Redhat 7+
Создаем папку откуда будут считываться дополнительные конфигурационные файлы для сервиса httpd:
1 | # mkdir /etc/systemd/system/httpd.service.d |
Внутри создаем файл, например
lstack.conf
и в него пишем:
1 2 | [Service] LimitSTACK=infinity |
Перегружаем демона и сервис:
1 2 | # systemctl daemon-reload # systemctl restart httpd |
Существенное замечание
Снять ограничение на лимит стека, это рекомендация Битрикс. Скажем прямо не самая удачная, т.к. вы можете решив одну проблему заполучить проблему с постоянной нехваткой ОЗУ. И apache будет падать уже по этой причине. Поэтому лучше подобрать верхнее граничное решение, которое будет устраивать Битрикс. Вычислить его достаточно просто:
Обычно кеш равен 8 Мбайт, убедимся:
1 2 | # ulimit -s 8192 |
Соответственно, нам нужно немного больше, пусть это будет 9 Мбайт.
1024*1024*9 = 9 437 184 байт
пишем в наш файл:
1 2 | [Service] LimitSTACK=9437184 |
Проверяем в “Проверке системы” – должно все быть в порядке. Обычно, я пишу 10 000 000, для простоты запоминания числа.
08:00
Вот только значение не infinity, а по старинке unlimited в моем случае сработало.
Вообще там должно быть в байтах.
13:44
Читайте внимательно документацию: Use the string infinity to configure no limit on a specific resource.
unlimited для systemd не работает/не применяется.