Apache 2.4 хиты rlimit_nproc: скрытые процессы?
Мое веб-приложение позволяет пользователям выполнять произвольный код в песочнице. Для предотвращения разветвления приложение вызывает setrlimit и ограничения RLIMIT_NPROC
до 50 перед выполнением кода пользователя. Это прекрасно работало в Ubuntu 12.04 до Ubuntu 13.04. Однако после обновления до Ubuntu 13.10 (который поставляется с Apache 2.4 и Linux 3.11) мы достигли предела 50 www-data
процессы, даже когда Apache2 простаивает!
Проблема легче всего воспроизводится при запуске bash
как пользователь www-data
с ulimit
, Сначала переключитесь на пользователя www-data
и начать bash
:
jeroen@Ubuntu:/$ sudo su www-data
$ bash
www-data@Ubuntu:/$
Сейчас постепенно опускаюсь RLIMIT_NPROC
пока мы не столкнемся с проблемами:
#RLIMIT_NPROC=100: works fine
www-data@Ubuntu:/$ ulimit -u 100
www-data@Ubuntu:/$ ls
bin dev initrd.img lib64 mnt root srv usr vmlinuz.old
boot etc initrd.img.old lost+found opt run sys var
cdrom home lib media proc sbin tmp vmlinuz
#RLIMIT_NPROC=50: limit reached
www-data@Ubuntu:/$ ulimit -u 50
www-data@Ubuntu:/$ ls
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: Resource temporarily unavailable
Следовательно после установки RLIMIT_NPROC
до 50, процесс больше не может быть разветвленным. Это означает, что в качестве пользователя уже запущено 50 или более процессов. www-data
, Тем не менее, это не так, сервер просто пустой Apache 2.4. В соответствии с ps
, в настоящее время только 2 прокса принадлежат www-data
:
jeroen@Ubuntu:~$ ps aux | grep www-data
www-data 11473 0.0 0.5 631296 46164 ? Sl 14:28 0:01 /usr/sbin/apache2 -k start
www-data 11474 0.0 0.5 565656 45632 ? Sl 14:28 0:01 /usr/sbin/apache2 -k start
jeroen 12136 0.0 0.0 13644 956 pts/4 S+ 14:51 0:00 grep --color=auto www-data
Так почему же www-data
бьет RLIMIT_NPROC
лимит 50 в Apache 2.4, даже в режиме ожидания?
1 ответ
Нашел проблему благодаря предложению @sarnold. Моя заявка зависит от mpm_prefork
и вплоть до Ubuntu 13.04 этот модуль был автоматически включен, когда apache2-mpm-prefork
пакет установлен. Я предположил, что это все еще так, но оказалось, что он работает mpm_event
,
Похоже, что в Apache 2.4 упаковка MPM изменилась и mpm_prefork
необходимо включить вручную после установки:
sudo a2dismod mpm_event
sudo a2enmod mpm_prefork
sudo service apache2 restart
Теперь проблемы, похоже, исчезли.