SOARISTO工房 Logo
Computer Archive
2011/07/30

 blogを「Movable Type 5」(以下、MT5)に変更しましたが、ここのところ、やたらとスパムコメントが付くようになりました。
(記事の更新情報をpingするにも、一長一短があります)

 MT5にもスパムフィルタがあり、コメントの内容を監査して、ある一定以上のスコアとなると、自動的に隔離されるようになっています。

 とはいえ、コメントをいったん受け付けてからスパム判定するようになっていることと、スパム判定した後も、そのIPアドレスからのコメントを拒否する訳ではないので、公開されないコメントが、裏でどんどん増えていくことになります。

spam01.jpg

 勝手にサーバのリソースを使われるのは、気持ちの良いものではないので、MT5と連携した形で、スパムフィルタを作ってみました。

 上記は、スパムと判定されたIPアドレスの一覧です。

 ホスト名からすると、大部分が中国のプロバイダからのものとなっています。また、DNS解決できないIPアドレスも、逆アクセスしてみると、中国の監督官庁のサイトであったりします。
(当局も、よもや不正アクセスの踏み台にされているとは、まったく気付いていないことでしょう)

 スパムフィルタの仕組みは簡単で、MT5がスパムと判定したIPアドレスを、SQLサーバから聞き出して、Webサーバの「.htaccess」ファイルに、「deny from (IPアドレス)」として追加するだけです。

 あわせて、確認用(というか、全世界に曝すため)に、スパムテーブルファイルを更新します。その内容を表示したものが、上記となります。

 この操作を、1日に1回、自動的に実行します。

 いったんスパムテーブルファイルに登録されたIPアドレスは、Apacheレベルで門前払いとなるため、以降、二度とアクセスすることができなくなります。

 これで、サーバのリソースを勝手に使われることもなくなりました。めでたし、めでたし。
(いっそのこと、中国からのアクセスは、すべて拒否ってやろうかとも思ったのですが、いまのところ思い留まっています)

 これまで「アクセスログ分析」のページはCGIで作っていましたが、これを機に、PHPに書き改めてみました。

 以下、スパムフィルタのソース(一部)です。

 はじめに、スパムテーブルファイル(spamtable.dat)を読み出し、配列($SpamTable)に格納します。

 つぎに、SQLサーバから、スパム判定されているコメントについて、IPアドレスと登録日時を、日付順に読み出します。
(MT5では、スパム判定されたものは、“comment_junk_status”が-1となっています)

 つづいて、この情報を、配列の内容と比較し、登録されていない場合には、配列の最後に追加します。

 最後に、スパムテーブルファイルを追記モードでオープンし、新たに登録された情報のみ、書き出します。
(念のため、バックアップファイルを作成するとともに、追記(書き込み)であることから、排他処理をしています)

 ということで、スパムフィルタができました。

 その効果ですが、スパムコメントの登録数が大きく低下し、サーバの負荷状態も改善したようです。

 スパムコメントは、踏み台とされるIPアドレスがつぎつぎに増えているため、完全に抑え込むことはできませんが、システムが日々自動的に追加していってくれるので、管理的には楽になりました。

2011/07/24

 ということで、チップセットのSATAインターフェースでは、パフォーマンスが思うように上がらないことから、専用のRAIDボードを購入することにしました。

rr2720sgl01.jpg

 HighPoint社の「RocketRAID 2720SGL」(購入価格:121.77ドル=約9,800円)です。

 秋葉原では、1万円台後半で売られてます。

rr2720sgl02.jpg

 同時に購入した「INT-MS-1M4S」(購入価格:15.59ドル=約1,250円)です。Mini-SASコネクタを、4つのSATAコネクタに変換するためのケーブルです。

rr2720sgl03.jpg

 ヒートシンクに覆われていて見えませんが、RAIDコントロール用のチップは、Marvell社の「88SE9485」を使っているようです。

#「Maximus IV Extreme」も、RAIDコントロール用にMarvell社のチップ(88SE9182)を積んでいますね。

 Mini-SASコネクタが2つあるのが見えると思いますが、このカード1枚で、最大8台までのSATAドライブをコントロールすることができます。

rr2720sgl04.jpg

 インタフェースは「PCI Express 2.0 x8」ですが、「Maximus IV Extreme」では、「PCIe 2.0 x16スロット」に挿入して使っています。

 さて、さっそくパフォーマンスチェックです。

hgst-hd02.jpg

 前回の、チップセットのSATAインターフェースでRAID5を組んだ場合です。

 シーケンシャルリードでは、HD単体の3倍のパフォーマンスを示していますが、逆にシーケンシャルライトでは、8分の1にまで低下してしまいました。

rr2720sgl05.jpg

 「RocketRAID 2720SGL」の場合です。

 シーケンシャルリード/ライトとも、HD単体の2.7倍となっています。チップセットRAIDに比べると、リードでは若干低く(477.3MB/s→438.5MB/s)なっていますが、ライトでは、著しい改善(20.82MB/s→430.5MB/s)を示しています。

 ということで、シーケンシャルでは、リード/ライトとも、理論値である約3倍(4台構成の場合)を達成しました。

 これで、「Ultimate Tera Storage Machine」として、地デジをごりごりキャプチャーすることができるようになりました。

2011/07/06

 SSDに続いて、HDです。

deskstar01.jpg

 3TB版が出て、安くなったところで買いだめしてあった2TB版のHD(HGST 0S03191)ですが、4台繋いでRAID5を組んみることにします。

hgst-hd01.jpg

 まずはじめに、単体での場合です。

 シーケンシャルリード/ライトとも、160MB/s程度となっています。

hgst-hd02.jpg

 つづいて、マザーボードの3Gb/sのポートに4台繋いで、RAID5を組んだ場合です。

 シーケンシャルリードでは、3倍のパフォーマンスを示していますが、逆にシーケンシャルライトでは、8分の1と、大きくパフォーマンスが低下しています。

 やはり、チップセットのSATAインターフェースで、CPUがしこしこパリティーを計算していたのでは、パフォーマンスが上がらないようです。
(自明といえば自明ですが)

 CPUの負荷率はチェックしていませんが、ディスクアクセス時には、相応のパフォーマンスを食ってしまうはずです。また、地デジをキャプチャしながら書き込むには、少しパフォーマンスが足りないように思われます。

 う~む、悩ましい。

2011/07/02

 最近の流れに乗って、

corsair-ssd01.jpg

 SSD(Solid-State-Drive)を買ってみました。

 メインメモリと同じCorsairの、「CSSD-P3128GB2-BRKT」(購入価格:22,470円×2台)です。

 今回は、128MBのモデルを2台買い、RAID0を組んでみることにします。

corsair-ssd02.jpg

 SATA3.0(6Gb/s)のインターフェースを持ち、読み込み最大410MB/s、書き込み最大210MB/sのパフォーマンスを持つと謳われています。

 中身は、部品の配置からすると、PLEXTORのSSDのようです。
(パッケージの写真とは、本体色がぜんぜん違いますし)

corsair-ssd03.jpg

 3.5インチベイは、SSD×2台、HD×4台で、フル実装状態です。

 さっそく、CrystalDiskMarkでパフォーマンスチェックです。

corsair-ssd04.jpg

 まずはじめに、SSD単体での場合です。

 謳い文句どおり、読み込み400MB/sオーバー、書き込み200MB/sオーバーを達成しています。

corsair-ssd05.jpg

 つづいて、マザーボードの6Gb/sのポートに2台繋いで、RAID0を組んだ場合です。

 シーケンシャルリード/ライトで、SSD単体の時と比べて、約2倍のパフォーマンスを実現しています。

 このRAID0を組んだSSDに、Windows7 Ultimate(32bit版)をインストールして、起動時間を比較してみました。

 HDの場合には、起動まで44秒掛かっていましたが、SSD(RAID0)の場合には、34秒となりました。

2011/04/24

 工房では、開設当初から、アクセスログの解析機能を独自に作り込み、運用してきました。収集している情報の一部は、こちらで公開しています。

 その中で、「キーワード解析」というものがあります。これは、訪問者が、Googleをはじめとする各種検索エンジンにて、どのようなキーワードを使って検索し、工房に辿り着いたかを示すものです。

 苦労して作り込んだ割には、これまで放ったらかしにしていましたが、はたと、
   「これは、もしかして非常に貴重な情報なのでは?」
と思い付き、SEO対策として活用することにしました。

 蓄積したキーワード情報の生データです。(都合上、上位100位までを表示)

 これらは、各種検索エンジンからのリファラーから抽出したものです。
(若干、文字化けしたものが含まれていますが)

 よく見ると、検索エンジンで検索されたキーワード情報は、単体(1ワード)の場合もありますが、複数のキーワードから成っているものも、多くあります。

 ここで、例えばつぎのようなキーワード情報があったとした場合、

 "HID 取り付け" 500hit
 "HID バラスト" 300hit
 "バラスト 改造" 200hit
 "バラスト ハイワッテージ" 100hit

 キーワード単体での累積カウント数は、

 "HID" 800hit
 "バラスト" 600hit
 "取り付け" 500hit
 "改造" 200hit
 "ハイワッテージ" 100hit

となり、リファラーからのキーワード情報の順位とは、必ずしも一致しないということになります。
(当たり前ですが)

 よって、キーワード情報(以下、複数のキーワードを含むことから、「クエリ」と呼ぶことにします)に含まれるキーワード単体に注目し、その累積カウント数を調べることにより、高ヒット率のキーワードを抽出することができます。
(簡単にいうと、クエリを単体のキーワードに分割して、キーワード毎にカウントするということです)

#ついでに、半角やら全角やらがゴチャ混ぜになっているので、この際、キレイに整形します。

 PHPスクリプトは、とても簡単です。(keyword.php)

 まず、クエリを収めたデータファイル(keyword.dat)を読み出し、クエリとクエリのカウント数を、配列($LineArray)に格納します。

 つぎに、クエリをキーワードに分割する前処理として、「全角英数字を半角に」「全角スペースを半角に」「半角カナを全角に」「アルファベットの小文字を大文字に」変換します。

 つづいて、半角スペースを区切りとして、クエリをキーワードに分割し、連想配列($KeywordArray)に格納していきます。
(新しいキーワードが出てきた場合には、新たに連想配列を作成し、カウント数をセットします。過去に現れたキーワードであった場合には、カウント数を加算します)

 最後に、連想配列を、累積カウント数でソートしてから、上位100位までを表示し、終了します。

#日本語処理(マルチバイト文字列の処理)に、ちょっとしたコツが必要となりますが、こちらを参考に。

 実行結果です。

 当初、約2.7万個のクエリがありましたが、最終的に、約5.5万個ものキーワードに分解、整理されました。

 冒頭のキーワード情報の生データとは、順位が異なっていることにお気付きいただけるかと思います。

 
 で、これを何に使うかだって?

 それは、ヒ・ミ・ツ、ということで。

#クルマ関係のサイトとしては、非常に貴重な情報かと。