Linux Apache2.4点击rlimit_nproc:隐藏进程?

Linux Apache2.4点击rlimit_nproc:隐藏进程?,linux,apache,ubuntu,apache2,setrlimit,Linux,Apache,Ubuntu,Apache2,Setrlimit,我的webapp允许用户在沙箱中执行一些任意代码。为了防止分叉炸弹,应用程序在执行用户代码之前调用并将RLIMIT_NPROC限制为50。这在Ubuntu12.04到Ubuntu13.04都非常有效。然而,在升级到Ubuntu 13.10(与Apache 2.4和Linux 3.11一起提供)之后,我们达到了50个www-data进程的极限,即使Apache2处于空闲状态 使用ulimit以用户www-data的身份运行bash最容易重现该问题。首先切换到用户www-data并启动bash: j

我的webapp允许用户在沙箱中执行一些任意代码。为了防止分叉炸弹,应用程序在执行用户代码之前调用并将
RLIMIT_NPROC
限制为50。这在Ubuntu12.04到Ubuntu13.04都非常有效。然而,在升级到Ubuntu 13.10(与Apache 2.4和Linux 3.11一起提供)之后,我们达到了50个
www-data
进程的极限,即使Apache2处于空闲状态

使用
ulimit
以用户
www-data
的身份运行
bash
最容易重现该问题。首先切换到用户
www-data
并启动
bash

jeroen@Ubuntu:/$ sudo su www-data
$ bash
www-data@Ubuntu:/$
现在逐渐降低RLIMIT\U 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\u NPROC
设置为50后,该进程将不再分叉。这意味着已经有50个或更多进程作为用户
www-data
运行。然而,情况似乎并非如此,服务器只是一个空的空闲Apache2.4。根据
ps
,目前只有
www-data
拥有2个程序:

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

那么为什么在Apache2.4中,
www-data
甚至在空闲时也达到了
RLIMIT\u NPROC
50的限制呢

多亏了@sarnold的建议,才发现了问题。我的应用程序依赖于
mpm\u prefork
,直到Ubuntu 13.04,当安装
apache2 mpm prefork
软件包时,此模块自动启用。我假设情况仍然如此,但结果表明它正在运行
mpm\u事件

似乎在Apache 2.4中,MPM的打包已经更改,
MPM\u prefork
需要在安装后手动启用:

sudo a2dismod mpm_event
sudo a2enmod mpm_prefork
sudo service apache2 restart

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

多亏了@sarnold的建议,才发现了问题。我的应用程序依赖于
mpm\u prefork
,直到Ubuntu 13.04,当安装
apache2 mpm prefork
软件包时,此模块自动启用。我假设情况仍然如此,但结果表明它正在运行
mpm\u事件

似乎在Apache 2.4中,MPM的打包已经更改,
MPM\u prefork
需要在安装后手动启用:

sudo a2dismod mpm_event
sudo a2enmod mpm_prefork
sudo service apache2 restart

现在问题似乎消失了。

您在Apache上使用哪种MPM?我正在使用MPM preforkWait。。。也许我没有。看起来好像在Apache2中,MPM已经成为需要启用的模块。您在Apache中使用哪个MPM?我在使用MPM preforkWait。。。也许我没有。似乎在Apache2中,MPM已经成为需要启用的模块。