В 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, для простоты запоминания числа.
View Comments (2)
Вот только значение не infinity, а по старинке unlimited в моем случае сработало.
Вообще там должно быть в байтах.
Читайте внимательно документацию: Use the string infinity to configure no limit on a specific resource.
unlimited для systemd не работает/не применяется.