
私は CentOS (主に 6.4) 上で prefork と mod_perl を備えた apache 2.2.25 を実行しています。最近、あるインスタンスが特におかしくなり、子の子の子をフォークしました。
<snip>
\_ /usr/sbin/httpd
| \_ /usr/sbin/httpd
| | \_ /usr/sbin/httpd
| | \_ /usr/sbin/httpd
| | \_ /usr/sbin/httpd
| | | \_ /usr/sbin/httpd
| | | \_ /usr/sbin/httpd
| | | | \_ /usr/sbin/httpd
| | | \_ /usr/sbin/httpd
| | \_ /usr/sbin/httpd
| \_ /usr/sbin/httpd
| \_ /usr/sbin/httpd
| | \_ /usr/sbin/httpd
| | | \_ /usr/sbin/httpd
| | | | \_ /usr/sbin/httpd
| | | \_ /usr/sbin/httpd
| | \_ /usr/sbin/httpd
| \_ /usr/sbin/httpd
\_ /usr/sbin/httpd
| \_ /usr/sbin/httpd
\_ /usr/sbin/httpd
\_ /usr/sbin/httpd
</snip>
同時に、ボックスのメモリが不足しました (ディープ フォークとメモリ不足のどちらが先に発生したのかはわかりません)。
Apache がこのようなことを行うのは見たことがなく、原因はまだ特定できていません。私が調査している 2 つの可能性は、mod_perl のメモリ リーク (または、mod_perl が原因で存続するコード) と、限定的なフォーク ボム (任意の子をフォークできないが、追加の Apache の子をフォークできる) を許可するセキュリティ エクスプロイトです。
Apache がこのようにフォークする原因はよく分かりません (編集当初、私は graceful がどのように機能するかについて誤った考えを述べましたが、ここでの私の考えは、循環参照型のメモリ リーク (直接的または間接的にボックス上の使用可能なメモリをすべて使用することによって) が何らかの mod_perl の混乱を引き起こし、その結果、メインの親ではなく子から追加のワーカー子がフォークしたということです。これには特に理由はなく、単に 2 つの問題 (ディープ フォークとメモリ使用量) を調和させようとしているだけです。
あるいは、追跡する必要があるセキュリティ上の脆弱性があるかもしれません。
これまでに Apache のこの種の動作を見たことがある人や、解決策を知っている人はいますか?
答え1
これは mod_perl でコードをフォークしたものであり (これはすでに悪い考えです)、子をクリーンアップしないことでさらに悪化していることがわかりました。mod_perl では、フォークするとコードをフォークするのではなく、Apache をフォークします。そのため、その子は他のフォークされた Apache の子と同様にコンテンツを提供し続けますが、カウントには含まれず、インスタンスが多すぎる場合でも削除されることはありません。