カテゴリー : apache
数カ月前からウェブサーバのトラフィックの上がりが、ノコギリ状に増えている問題があった。 状況としては NFSのreadが定期的に頻発している。 NFSのwriteも中長期で見ると右肩上がり 短期で見ると特徴的なノコギリ波形を示す 1時間に3~4回ペースで定期的に急激なNFS read/writeが生じている。 NFSの微々たるreadだし、放っておいてもサービスにはまったく問題ないんだけど、グラフが汚れて見辛いので原因追求。 長中期で見るとreadの回数は調子こいて右肩上がりのまま留まることを知らないので、このままエスカレートしていくのを放っておくわけにもいかない。 犯人の追跡開始。 ・apacheのログ解析では不明だった ・mod_securityでPOSTを取ったが問題は見当たらなかった そのため ・tcpdump port nfs -nxXs 6000 | grep read -C 20 ・sar -n NFS 1 0 を同時に記録して解析を進めていくことにした。 ・sarで30秒間ほど急激なreadが定期的に発生していることを確認。 ・一時的にreadが急激に上がった時間をメモしておく 10時36分31秒 10時51分39秒 11時05分58秒 11時21分14秒 11時36分03秒 次に、上記時刻のtcpdumpのhexdumpをみてみる。 すると11時21分17秒に一意のデータである特定キーワード(メールアドレス)が確認できたので、これを鍵にすることにした。 ・ファイルサーバーからこのメールアドレスを全ファイル検索 grep -r 'drfadsee3@yahoo.com' ./ その結果 バイナリー・ファイル./ユーザA/blog/db/comment.email.idxは一致しました バイナリー・ファイル./ユーザA/blog/db/comment.dbは一致しました とユーザAのウェブスペースにこのメールアドレスを含むファイルがあることが判明。 ユーザAのアクセスログからPOSTしている時間だけ抜き取ってみた。 するとメモした時間とアクセスログのPOSTの時間が一致した。 ・apacheのログ grep ユーザA apache_log | grep blog | grep POST 09:18:13 :31367: [gw4.winserversecure.com] 85.17.145.7 ユーザーA POST /blog/mt-tb.cgi/145 HTTP/1.0 500 - 09:20:20 :31153: [93.174.93.58] 93.174.93.58 ユーザーA POST /blog/mt-comments.cgi HTTP/1.1 500 - 09:35:41 :9147: [93.174.93.58] 93.174.93.58 ユーザーA POST /blog/mt-comments.cgi HTTP/1.1 500 - 09:50:56 :21595: [93.174.93.58] - [ 続きを読む ]
バーチャルホストが多くなってくると、同じ設定を繰り返すことが無駄に思えて自動化・構造化したくなってくるのが人の情というもの。 バーチャルホストを動的に割り当てる方法には、mod_rewrite で強制的に割り当てる方法と、mod_vhost_alias を使う方法があるけれども、返す環境変数がそれぞれ異なってしまう問題がある。 http://sub.example.com を /home/exmaple.com/plublic_html/sub/ に割り当てる際のバーチャルホスト設定として、下記の3種の方法を試し、その際に返すDOCUMENT_ROOTを取得してみた。 (1) VirtualHost <VirtualHost *> DocumentRoot /home/example.com/public_html/sub/ ServerName sub.exmaple.com </VirtualHost> 結果 /home/example.com/public_html/sub/ (2) mod_rewrite <VirtualHost *> DocumentRoot /home/example.com/public_html/ ServerName example.com ServerAlias *.example.com RewriteEngine On RewriteCond %{HTTP_HOST} ^[^.]+\.example\.com$ RewriteRule (.*) %{HTTP_HOST}$1 [C] RewriteRule ^([^.]+)\.example\.com(.*) /home/example\.com/public_html/$1/$2 [L] </VirtualHost> 結果 /home/example.com/public_html/ (3) mod_vhost_alias UseCanonicalName Off VirtualDocumentRoot /home/%2+/public_html/%1 結果 /home 以上のように、(2)または(3)の設定で、DOCUMENT_ROOTを、(1)の状態で扱うことはできない。 この不具合によって、環境変数を参照するCGIやモジュールに正常な動作は期待できない。 mod_vhost_alias のこの不具合はbugzillaで報告されているが、解消される様子はない。 https://issues.apache.org/bugzilla/show_bug.cgi?id=26052 具体的には下記のように環境変数が異なる。 ■vhost <VirtualHost *> DocumentRoot /var/www/html/exmaple.com/public_html/ ServerName exmaple.com </VirtualHost> DOCUMENT_ROOT="/var/www/html/exmaple.com/public_html/sub/" GATEWAY_INTERFACE="CGI/1.1" HTTP_ACCEPT="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" HTTP_ACCEPT_CHARSET="Shift_JIS,utf-8;q=0.7,*;q=0.7" HTTP_ACCEPT_ENCODING="gzip,deflate" HTTP_ACCEPT_LANGUAGE="ja,en-us;q=0.7,en;q=0.3" HTTP_CONNECTION="keep-alive" HTTP_HOST="sub.exmaple.com" HTTP_KEEP_ALIVE="300" HTTP_REFERER="http://sub.exmaple.com/" HTTP_USER_AGENT="Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)" PATH="/bin" QUERY_STRING="" REMOTE_ADDR="192.168.10.2" REMOTE_PORT="65356" REQUEST_METHOD="GET" REQUEST_URI="/printenv.cgi" SCRIPT_FILENAME="/var/www/html/exmaple.com/public_html/sub/printenv.cgi" SCRIPT_NAME="/printenv.cgi" SERVER_ADDR="192.168.0.2" SERVER_ADMIN="admin@exmaple.com" SERVER_NAME="sub.exmaple.com" SERVER_PORT="80" SERVER_PROTOCOL="HTTP/1.1" SERVER_SIGNATURE="" SERVER_SOFTWARE="Apache/2.2.14 (Unix)" ■rewrite <VirtualHost - [ 続きを読む ]