Apache 2.4命中rlimit_nproc:隐藏进程?

时间:2013-10-17 19:03:24

标签: linux apache ubuntu apache2 setrlimit

我的webapp允许用户在沙箱中执行一些任意代码。为了防止forkbombs,应用程序在执行用户代码之前调用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。根据{{​​1}},目前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 在Apache 2.4中达到www-data限制为50,即使在空闲时也是如此?

1 个答案:

答案 0 :(得分: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

现在问题似乎已经消失了。