X

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. Например так:

start() {
echo -n $"Starting $prog: "
ulimit -s unlimited
LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch ${lockfile}
return $RETVAL
}

Решение для CentOS/Redhat 7+

Создаем папку откуда будут считываться дополнительные конфигурационные файлы для сервиса httpd:

# mkdir /etc/systemd/system/httpd.service.d

Внутри создаем файл, например lstack.conf и в него пишем:

[Service]
LimitSTACK=infinity

Перегружаем демона и сервис:

# systemctl daemon-reload
# systemctl restart httpd

Существенное замечание

Снять ограничение на лимит стека, это рекомендация Битрикс. Скажем прямо не самая удачная, т.к. вы можете решив одну проблему заполучить проблему с постоянной нехваткой ОЗУ. И apache будет падать уже по этой причине. Поэтому лучше подобрать верхнее граничное решение, которое будет устраивать Битрикс. Вычислить его достаточно просто:

Обычно кеш равен 8 Мбайт, убедимся:

# ulimit -s
8192

Соответственно, нам нужно немного больше, пусть это будет 9 Мбайт.

1024*1024*9 = 9 437 184 байт

пишем в наш файл:

[Service]
LimitSTACK=9437184

Проверяем в “Проверке системы” – должно все быть в порядке. Обычно, я пишу 10 000 000, для простоты запоминания числа.

hc:

View Comments (2)

  • Вот только значение не infinity, а по старинке unlimited в моем случае сработало.
    Вообще там должно быть в байтах.

  • Читайте внимательно документацию: Use the string infinity to configure no limit on a specific resource.
    unlimited для systemd не работает/не применяется.