我的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-data
和ulimit
作爲用戶運行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,即使處於空閒狀態?
您使用哪個MPM for Apache? – sarnold
我正在使用mpm-prefork – Jeroen
等等......也許我不是。看起來好像在Apache2中,MPM已經成爲需要啓用的模塊。 – Jeroen