2013-10-17 53 views
1

我的webapp允許用戶在沙盒中執行一些任意代碼。爲了防止發生forkbombs,應用程序在執行用戶代碼之前調用setrlimit並將RLIMIT_NPROC限制爲50。這在Ubuntu 12.04中運行良好,直到Ubuntu 13.04。但是,升級到Ubuntu 13.10(隨Apache 2.4和Linux 3.11提供)之後,即使Apache2處於空閒狀態,我們仍然達到了50 www-data進程的限制!Apache 2.4命中rlimit_nproc:隱藏進程?

通過以www-dataulimit作爲用戶運行bash,可以很容易地重現問題。首先切換到用戶www-data並開始bash

[email protected]:/$ sudo su www-data 
$ bash 
[email protected]:/$ 

現在逐漸走低RLIMIT_NPROC,直到我們遇到的問題:

#RLIMIT_NPROC=100: works fine 
[email protected]:/$ ulimit -u 100 
[email protected]:/$ 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 
[email protected]:/$ ulimit -u 50 
[email protected]:/$ 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擁有:

[email protected]:~$ 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被擊中的Apache 2.4 RLIMIT_NPROC極限的50,即使處於空閒狀態?

+0

您使用哪個MPM for Apache? – sarnold

+0

我正在使用mpm-prefork – Jeroen

+0

等等......也許我不是。看起來好像在Apache2中,MPM已經成爲需要啓用的模塊。 – Jeroen

回答

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 

現在的問題似乎已經消失了。