1

私の Web アプリケーションでは、ユーザーがサンドボックスで任意のコードを実行できます。forkbomb を防ぐために、アプリケーションはsetrlimitRLIMIT_NPROCを呼び出し、ユーザー コードを実行する前に 50 に制限します。これは、Ubuntu 12.04 から Ubuntu 13.04 までうまく機能しました。しかし、Ubuntu 13.10 (Apache 2.4 および Linux 3.11 に同梱) にアップグレードした後、www-dataApache2 がアイドル状態の場合でも、50 プロセスの制限に達しました!

この問題は、 を使用しbashてユーザーとして実行することにより、最も簡単に再現できます。最初にユーザーに切り替えて開始します:www-dataulimitwww-databash

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_NPROC50 に設定すると、プロセスはフォークできなくなります。これは、すでに 50 以上のプロセスが user として実行されていることを意味しますwww-data。ただし、これは当てはまらないようです。サーバーは空のアイドル状態の Apache 2.4 です。によるとps、現在 が所有する proc は 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 で 50www-dataの制限に達するのはなぜですか?RLIMIT_NPROC

4

1 に答える 1

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

現在、問題は解消されているようです。

于 2013-10-18T17:31:06.527 に答える