結論から言うと、Segmentation fault(11)は治らなかった。

とにかく、どうにもcore吐いてくれない事には始まらない。
という訳で、ググる。

カーネルの設定を変えてやればいいらしい。

sysctl kern.coredump
kern.coredump: 1

sysctl kern.sugid_coredump
kern.sugid_coredump: 0
sysctl kern.sugid_coredump=1
kern.sugid_coredump: 0 -> 1

sysctl kern.corefile=/var/tmp/%N.%U.core
kern.corefile: %N.core -> /var/tmp/%N.%U.core

Apache は wwwにユーザー変えてるので、kern.sugid_coredump を 1に変えてあげないといけないと言うことらしい。
core吐く場所は、 CoreDumpDirectory ディレクティブで設定できる。

で、吐きました

適当にぐぐってgdbで眺めてみると、
2chのどっかのスレのURLとsed_response_filter の文字が。
どうみても、mod_sedな関数名と、どう見ても、臨時用2ch串のアクセスっぽいURL。

試しに、そのスレのhtmlをローカルに落とし、そのhtmlに臨時用2ch串と同じ
mod_sed のディレクティブを書いてアクセスしてやる。
結果、再現率100%で落ちる事を確認。
吐かせたcoreも同じ箇所で落ちてることを示している。

つまり、ある特定のスレにアクセスすると、必ず反応がなくなる。

そういや、mod_sedはExperimental(実験的)モジュールの扱いだったなぁ……
と、今さらながらに思い出す。

けれど、mod_sedみたいな面倒くさいモジュールのソースを追う気は無い。
正確には、眺めてみたけどこれは手に負えそうにない。

なんとかならんもんかと、2.4の新機能を眺めて、あれこれググる。
どうも、mod_proxy_htmlにリンクを書き換えてくれる機能があるらしいのだけれど、
リンク以外にJavaScript追加してる所も有るので、こっちは使えない。
mod_ext_filterに戻るのはなんだか負けた気がする。
いや、別に勝負ではないんだけれど。

で、mod_sed つながりで、mod_substitute なんてのがあることを知り、
試してみると、これがいい感じに動いてくれる。
mod_substituteのステータスはExperimental(実験的)では無いので、落ちることもなかろう。

という訳で、こんなディレクティブを書いた。

AddOutputFilterByType Substitute text/html
Substitute “s|([0-9a-zA-Z]*).2ch.net|proxy2ch.konata.net/2ch/$1|i”

これで、また様子をみることにする。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です