CentOS/ScientificLinux6でMyNETSを動かす

■CentOS/ScientificLinux6でMyNETSを動かす

ということで、試行錯誤してなんとか動かせたのでメモっておきます。

使ったのはScientificLinux6.7です。
標準ではphp5.3.3、mysql5.1.6ですが、不具合の問題で以下の対応をしました。

・全文検索用にmroongaを使う都合でoracle版mysql5.6導入
・MyNETSで日記投稿時エラーのためphpをius版5.3.29導入

■mroonga&oracle版mysqlインストール

$ yum install -y http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
$vi /etc/yum/yum.repos.d/groonga.repo
以下修正
/centos/$releasever/ → /centos/6/
$ yum install -y http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm
$ yum makecache
$ yum install -y mysql-community-server
$ /sbin/service mysqld start
$ yum install -y mysql-community-mroonga
$ yum install -y groonga-tokenizer-mecab

$mysql -uroot
mysql> show engines;
mroongaを確認

# vi /etc/my.cnf
互換性のため以下を追記
character-set-server = utf8
skip-host-cache
skip-name-resolve
sql_mode=”
old_passwords=0

以下の設定はエラーになるので廃止
default-character-set=
table_cache=
log-slow-querie=
log=

■ius版php導入

# vi /etc/yum.repos.d/ius.repo
以下の内容で作成
[ius]
name=IUS Community Packages for Enterprise Linux 6 – $basearch
baseurl=http://dl.iuscommunity.org/pub/ius/archive/CentOS/6/$basearch
#mirrorlist=http://dmirr.iuscommunity.org/mirrorlist?repo=ius-el6&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/IUS-COMMUNITY-GPG-KEY

# cd /etc/pki/rpm-gpg/
# wget http://dl.iuscommunity.org/pub/ius/IUS-COMMUNITY-GPG-KEY

# yum update
# yum install yum-plugin-replace
# yum replace php –replace-with php53u

# vi /etc/php.ini
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED

■全文検索用データ修正
mysqlのダンプデータを以下のように書き換え

 FULLTEXT KEY `fullindex` (`body`) /*!50100 WITH PARSER `mecab` */
) ENGINE=MyISAM AUTO_INCREMENT=100 DEFAULT CHARSET=utf8;
 ↓
 FULLTEXT INDEX (`body`)
) ENGINE=mroonga AUTO_INCREMENT=100 DEFAULT CHARSET=utf8;

たぶん、これでOK

, , ,
とりあえず付けておく無駄ではなかったなまぁまぁ読めたちょっと役に立ったかなかなり良かったかも (まだ評価されていません)
Loading...

■Scientific Linux 5.6でSNSサーバを構築するメモ
 CentOS5系で運用中のSNSサーバをScientific Linux5系に移行するため、試験環境としてDell D520にインストールを行った時のメモ。ここからはSNS等アプリケーション導入前までの構築メモ。OS自体は前記事を参照。

 D520にScientific Linux 5.6をインストールしたメモ
 http://blog.isnext.net/issy/archives/1281

■高機能メールサーバCommuniGate Proをインストール
 phpアプリで必要なケースが多いのでpostfixを活かしたままCGPを有効にする
・postfix側の設定変更
 # vi /etc/postfix/master.cf
  smtp inet n – n – – smtpd
   ↓
  #smtp inet n – n – – smtpd
 # vi /etc/postfix/main.cf
  mydestination = $myhostname, localhost.$mydomain, localhost
   ↓
  mydestination = localhost
  追記
  relayhost = 自IPアドレス
  myhostname = po.ホストネーム セルフループ回避呪文
・postfixを再起動
 # service postfix restart
・postfixがsmtpをLISTENしてないことを確認
 # lsof -i

・CommuniGate Proの最新版をインストール
 (商用だがCommunityライセンス下で5ユーザまで無料で利用可能)
 # wget http://www.communigate.com/pub/CommuniGatePro/CGatePro-Linux.x86_64.rpm
 # rpm -ivh CGatePro-Linux.x86_64.rpm
 # service CommuniGate start
・CGPの管理画面にアクセスするためにiptableでポート追加
 # vi /etc/sysconfig/iptables
  -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 8010 -j ACCEPT 追記
 # service iptables restart
・ブラウザでhttp://サーバIPアドレス:8010/へアクセスして設定
 postmasterのパスワード設定
 Basic認証が表示されるのでID:postmasterと設定したパスワードでログイン
  japanese japanese(ISO) (+0900)japan/Korea expert で設定

■日本語全文検索対応mysql/Tritonnインストール
・標準導入のMySQLを削除する
 # yum remove mysql
・perl-DBIのインストールを確認(あればOK)
 # rpm -qa | grep -i perl-DBI
・最新のtritonnパッケージ群をダウンロード
 # wget http://iij.dl.sourceforge.jp/tritonn/44614/MySQL-client-5.0.87-tritonn.1.0.12a.x86_64.rpm
 # wget http://iij.dl.sourceforge.jp/tritonn/44614/MySQL-devel-5.0.87-tritonn.1.0.12a.x86_64.rpm
 # wget http://iij.dl.sourceforge.jp/tritonn/44614/MySQL-server-5.0.87-tritonn.1.0.12a.x86_64.rpm
 # wget http://iij.dl.sourceforge.jp/tritonn/44614/MySQL-shared-5.0.87-tritonn.1.0.12a.x86_64.rpm
 # wget http://iij.dl.sourceforge.jp/tritonn/44614/mecab-0.98-tritonn.1.0.12a.x86_64.rpm
 # wget http://iij.dl.sourceforge.jp/tritonn/44614/mecab-ipadic-2.7.0.20070801-tritonn.1.0.12a.x86_64.rpm
 # wget http://iij.dl.sourceforge.jp/tritonn/44614/senna-1.1.4-tritonn.1.0.12a.x86_64.rpm
・以下の順番でインストール
 # rpm -ivh mecab-0.98-tritonn.1.0.12a.x86_64.rpm
 # rpm -ivh mecab-ipadic-2.7.0.20070801-tritonn.1.0.12a.x86_64.rpm
 # rpm -ivh senna-1.1.4-tritonn.1.0.12a.x86_64.rpm
 # rpm -ivh MySQL-shared-5.0.87-tritonn.1.0.12a.x86_64.rpm
 # rpm -ivh MySQL-client-5.0.87-tritonn.1.0.12a.x86_64.rpm
 # rpm -ivh MySQL-server-5.0.87-tritonn.1.0.12a.x86_64.rpm
 # rpm -ivh MySQL-devel-5.0.87-tritonn.1.0.12a.x86_64.rpm
・MySQLのパスワード設定を行う
 # /usr/bin/mysqladmin -u root password ‘rootpassword’
・ログインして動作確認
 # mysql -u root -p
・設定ファイルを適当に選んで配置する
 # cp /usr/share/mysql/my-large.cnf /etc/my.cnf
・utf8で使いたい場合には以下の行を各項目で追記
 # vi /etc/my.cnf
  [mysqld]
  default-character-set = utf8
  [mysqldump]
  default-character-set = utf8
  [mysql]
  default-character-set = utf8
・設定を反映させる(mysqldでないことに注意)
 # service mysql restart
・設定変更を確認
 # mysql -u root -p
  mysql> status
  …
  Server characterset: utf8
  Db characterset: utf8
  Client characterset: utf8
  Conn. characterset: utf8
  …

■MyNETS(SNSサーバアプリ)の導入準備をする
・MyNETSに必要なコンポーネントをインストール
 # yum install php-mcrypt php-mbstring php-gd php-mysql php-xmlrpc php-xml php-eaccelerator ImageMagick
・ImageMagickの強制アップデートをする
 SL5.6のImageMagickにもCentOSと同じ問題があるので最新版で入替えする
 # wget http://www.imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-6.7.1-3.x86_64.rpm
 # rpm -Uvh –force ImageMagick-6.7.1-3.x86_64.rpm

■監視系に必要なアプリを導入する
・sysstatをインストール
 # yum install sysstat
・lm_sensorsをインストール
 # yum install lm_sensors
 # sensors-detect で設定
 # sensors で動作確認
・muninをインストール
 # yum install munin munin-node
 # munin-node-configure で設定確認
・apacheの監視を有効にする
 # vi /etc/httpd/conf/httpd.conf
  #ExtendedStatus On
   ↓
  ExtendedStatus On

  #<Location /server-status>
  # SetHandler server-status
  # Order deny,allow
  # Deny from all
  # Allow from .example.com
  #</Location>
   ↓
  <Location /server-status>
   SetHandler server-status
   Order deny,allow
   Deny from all
   Allow from 127.0.0.1
  </Location>
・muninを再設定する
 # munin-node-configure -suggest で設定可能な内容を確認
 # munin-node-configure -shell | sh で設定
 # munin-node-configure 設定を確認
 # service munin-node start 監視を開始

※MySQLに関するmunin監視設定は以下を参照

 muninで複数mysqldを監視する設定メモ
 http://blog.isnext.net/issy/archives/957

■SNSアプリケーションの導入
 以下のURLの「8)SNSサーバとしての設定」を参照

 カスタム版MyNETSとCentOS5で1万人規模のSNSを構築する
 http://blog.isnext.net/issy/archives/384

, , , , , ,
とりあえず付けておく無駄ではなかったなまぁまぁ読めたちょっと役に立ったかなかなり良かったかも (まだ評価されていません)
Loading...

■CentOS5.6 ImageMagickアップデートのメモ
 以前の記事で、ある特定のgifアニメファイルでCentOS標準インストールのImageMagickが暴走する件に対してImageMagickのHPから最新版をインストールして対処する方法を書いていたが、今回CentOS5.5から5.6にアップデートする際にここでハマったのでメモを残しておく。おそらく今後の更新でも同様の対処が必要。

 通常通りの yum upgrade ではImageMagickのバージョンが合わずエラーになり更新が停止するため、実際に行った対応は以下。

# yum remove ImageMagick
# yum upgrade

upgrade完了後に以前ダウンロード済みのImageMagickを再適用
# rpm -ivh ImageMagick-6.6.3-5.x86_64.rpm

 CentOS5.6では強制適用のためのforceオプションは不要ですんなりとインストールできた。convertテストでも特定のgifアニメファイルは正しくエラーになり、MyNETSからも適切にリサイズ等の動作が行え、問題なく利用することができた。

, ,
とりあえず付けておく無駄ではなかったなまぁまぁ読めたちょっと役に立ったかなかなり良かったかも (まだ評価されていません)
Loading...

カスタム版MyNETSとCentOS5で1万人規模のSNSを構築する

■カスタム版MyNETSとCentOS5で1万人規模のSNSを構築する
 友人と運営しているSNSのカスタマイズが一段落したので、ご協力いただいた方々やMyNETSの開発元Usagi Projectの方々に了解をいただき、カスタム版をパッケージにまとめてダウンロードできるようにさせていただいた。近いうちにMyNETSの公式HPからもダウンロードリンクが貼られることになっているが、これまでの集大成でもあるので、こちらでも紹介しておこうと思う。

 MyNETSにゃっぽんカスタム版ダウンロード
 http://v-nyappon.net/download/

 こちらのblogでは内容に沿って、20100921版のINSTALLドキュメントの内容を掲載する(最新の状況は上記URLを参照のこと)。CentOS5.5 x86_64版のインストールとチューニング、CommuniGate ProやTritonnを始めとした関係アプリのインストールと設定、MyNETSの配置と設定など、かなりの長文になっているので、続きはご興味のある方だけどうぞ。

※INSTALL.txtにミスがあったため、0919版は削除して0921版にリンク修正しました。

※このカスタム版を作成するのに当り、本当にたくさんの方々から改修コードとアイデアをご提供いただいたことに深く感謝しています。謝辞はREADMEに、本家との違いはCHANGELOGに入れさせていただいています。ダウンロードの際はぜひご覧いただければと思います。

続きを読む

, , , , ,
とりあえず付けておく無駄ではなかったなまぁまぁ読めたちょっと役に立ったかなかなり良かったかも (まだ評価されていません)
Loading...

■CentOSのImageMagickのバグ対応x86_64版
 手元のサーバを初めてx86_64版でインストールした結果、ImageMagickでまたハマったのでメモしておく。とりあえず解決はできたようなので、たぶん他でも大丈夫かと…(自信なし)
 ちなみに以前記事で書いた内容は全く役に立たなくなっていた。今回CentOS5と書いている部分では、特に注意書きがない限りx84_64版なので注意。

 CentOS5.6でのアップデート対応記事はこちら
 http://blog.isnext.net/issy/archives/1022

1)ImageMagickのバージョン確認
[code]# rpm -q ImageMagick[/code]

通常CentOS5でyumからImageMagickをインストールした場合、ImageMagick-6.2.8.0-4がi386版とx86_64版で2つインストールされているはずである。ここでは2つ入っていることが確認できればそれでいい。入っていない状態なら以下のコマンドでインストールしておく。
[code]# yum install ImageMagick[/code]

2)ImageMagickのHPからCentOS用rpm(x86_64)をダウンロードしてアップデートする
[code]# ~/download
# wget http://www.imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-6.6.3-5.x86_64.rpm
# rpm -Uvh –force ImageMagick-6.6.3-5.x86_64.rpm[/code]

ついにCentOS5用のrpmが用意されたようで、これをダウンロードして強制的にアップデートをかける。(作業中にはダウンロードできたのだが、今確認したら404エラーになってるので更新されるのかもしれない)これで、問題が解決してしまうようだ。i386版と競合するファイルがあるのだが、man関係のファイルなので強制的にアップデートしてもたぶん問題はないと思われる。

障害の発生するgifでも正しくエラーになり、MyNETSでもリサイズが正しく動作しているので、i386版とx86_64版のバージョン違いが微妙に気になるが、スルーしておくことにする…。
実際作業して見て実感するが、CentOSのx86_64版はいろんな意味で微妙…。

ImageMagickのHPにはi386版も最新のCentOS用rpmがあるのでインストールしたくなるのだが、なぜかi386版のみ前の記事と同じライブラリが不足するため、いろいろインストールしないといけない状況に陥る。しかしx86_64版のCentOSではi386版の必要ライブラリがうまく導入できず(スキル不足のため)最終的にインストールできなかった。(前回記事の手法ではx86_64版が導入されるのみ。i386版のlibファイルを持ってきて配置してみたが認識されず…)

ちなみにyumでImageMagickをインストールしないで、直接ImageMagickのHPからファイルを持ってきてrpmでインストールすることもできるが、その場合、MyNETSで画像のリサイズができないという問題が発生した。障害の発生するgif自体はconvertでエラーになるので、適切に動いているようではあるが、お使いの環境によっては正しく動作しない場合があるので注意。

, , ,
とりあえず付けておく無駄ではなかったなまぁまぁ読めたちょっと役に立ったかなかなり良かったかも (まだ評価されていません)
Loading...

CentOSのImageMagickのバグ対応【4/11追記アリ】

CentOS5上で運用しているMyNETSのサイトで今年に入ってからしばしば高負荷が発生してアクセス障害になっていたので、友人らと原因を調査。不幸中の幸いというか高負荷発生時に友人がOSにログインしていたため原因が判明。結果、あるパターンの壊れたアニメGIFのファイルがアップロードされた際にImageMagickが変換しようとして高負荷状態を発生させていた。該当ファイルを抽出し、他のCentOS5のマシンで手動でconvertして再現確認。WindowsやMacOSX,Ubuntuでは該当ファイルはconvertでエラー表示で正しく処理中断になるため、CentOS用パッケージの問題と推測。

 既にこちらの内容は役に立ちません
 最新のx86_64版の話題はこちらを参照してください
http://blog.isnext.net/issy/archives/362

■ImageMagickのアップデート
CentOSはextraとepelがリポジトリ追加されているが、ImageMagickは
[code]# rpm -q ImageMagick
ImageMagick-6.2.8.0-4.el5_1.1[/code]

と、最新の6.6.0-10には遠く及ばない。

しかたがないので、最新版のtarballを落としてきてインストールしてみた。

[code]# cd ~/download
# wget http://downloads.sourceforge.net/project/imagemagick/ImageMagick/00-6.6.0/ImageMagick-6.6.0-10.tar.gz?use_mirror=jaist
# cd ImageMagick-6.6.0-10
# ./configure
# make
# make install[/code]

いろいろ警告は表示されるものの一応インストールできた。…が
[code]# convert broken.gif hoge.gif[/code]
とすると変わらず高負荷発生。
おそらく警告が出ていた中に対策に必要なものがあるということだろう。
(4/11追記:コンパイルして導入するとデフォルトでは/usr/local/bin/convertにインストールされるため、CentOSのデフォルト/usr/bin/convertと異なり、そもそもここでの動作確認は適切な状況ではなかった

しかたないので、Fedora用に用意されているrpmファイルをダウンロードしてインストールする。

[code]# cd ~/download
# wget http://www.imagemagick.org/download/linux/fedora/i386/ImageMagick-6.6.0-10.i386.rpm

# rpm -Uvh ImageMagick-6.6.0-10.i386.rpm
エラー: 依存性の欠如:
libHalf.so.4 は ImageMagick-6.6.0-10.i386 に必要とされています
libIex.so.4 は ImageMagick-6.6.0-10.i386 に必要とされています
libIlmImf.so.4 は ImageMagick-6.6.0-10.i386 に必要とされています
libImath.so.4 は ImageMagick-6.6.0-10.i386 に必要とされています
libcdt.so.4 は ImageMagick-6.6.0-10.i386 に必要とされています
libdjvulibre.so.21 は ImageMagick-6.6.0-10.i386 に必要とされています
libfftw3.so.3 は ImageMagick-6.6.0-10.i386 に必要とされています
libgraph.so.4 は ImageMagick-6.6.0-10.i386 に必要とされています
libgvc.so.5 は ImageMagick-6.6.0-10.i386 に必要とされています
libltdl.so.3 は ImageMagick-6.6.0-10.i386 に必要とされています[/code]

ということで不足しているパッケージの追加をすべく
http://rpm.pbone.net/

で必要なライブラリを含むパッケージの在りかを探す。
必要なのは
OpenEXR
fftw3
Graphviz
djvulibre

epelでなんとかなるものはそこからinstall
[code]# yum install openexr fftw3[/code]

graphvizは最新版が必要なので、本家のCentOS用リポジトリを追加。
[code]# wget http://www.graphviz.org/graphviz-rhel.repo
# mv graphviz-rhel.repo /etc/yum.repos.d/
# yum install graphviz[/code]

djvulibreはdagリポジトリにあるのでそこから追加。[code]
# vi /etc/yum.repos.d/dag.repo
[dag]
name=Dag RPM Repository for CentOS5
baseurl=http://ftp.riken.jp/Linux/dag/redhat/el5/en/$basearch/dag/
enabled=0
gpgcheck=1

# rpm –import http://ftp.riken.jp/Linux/dag/RPM-GPG-KEY.dag.txt
# yum –enablerepo=dag install djvulibre[/code]

これで再度(追記を確認してください。これやっちゃいけません)
[code]# rpm -Uvh ImageMagick-6.6.0-10.i386.rpm[/code]

今度は無事に導入。
[code]# convert broken.gif hoge.gif
convert: negative or zero image size `broken.gif’ @ error/gif.c/ReadGIFImage/1237.
convert: missing an image filename `hoge.gif’ @ error/convert.c/ConvertImageCommand/2941.[/code]

正しくエラーになったので、これでOK。
これCentOSへのDoSになるんで報告すべきか悩み中。

…と思ったら、MyNETSで動作させてみたところ、GIF以外がリサイズできなくなってることが判明。
正しく動作していないのは、Fedora用を使ったからなのか、バージョンアップでコマンド変更があったのか。
追跡調査中。

— 4/11追記 —
調査の結果、Uvhでインストールしてはいけないことを確認。
そりゃそうか。別OS用だしね。

入れ替え時にやること。
既存のImageMagickをアンインストール
[code]# yum remove ImageMagick[/code]

アンインストールの確認
[code]# rpm -q ImageMagick
パッケージ ImageMagick はインストールされていません。[/code]

一応他に入っていないか、残存libがないか確認
[code]# updatedb
# localte convert
# locate libMagick[/code]

CentOSではconvertsは/usr/bin/convertになるので
コンパイルインストール等を行って他にあったら残存lib含めて消しておく
[code]# rm -f /usr/local/bin/convert
# rm -f /usr/local/lib/libMagick*[/code]

Fedora用最新版を新規インストール
[code]# rpm -ivh ImageMagick-6.6.0-10.i386.rpm[/code]

念のため再起動
[code]# reboot[/code]

これで正しくMyNETSで動作することを確認しました。
CentOSでアニメGIF投稿を受け付けるWebアプリで画像変換にImageMadickを利用している場合には、最新版へのアップデートをオススメします。

, ,
とりあえず付けておく無駄ではなかったなまぁまぁ読めたちょっと役に立ったかなかなり良かったかも (まだ評価されていません)
Loading...

CommuniGate Proから外部プログラムへメールを渡す

CommuniGate Proから稼動OS上の任意の外部プログラムにメールをパスするための設定
以下はphpを使ったSNSプログラムMyNETSにメールを処理させる設定

SNS管理者アドレスを admin@example.com としてpostmasterで受信し
メール日記投稿などを 任意の投稿コード@example.com で受信するものとする
MyNETSは /var/www/Usagi のパスに設置されたものとする

PIPEモジュールにphpのパスを設定
 設定→メール→PIPE で phpのあるパスを記述
 CentOSの場合/usr/bin/php なので

 /usr/bin と記述

メールのハンドルのためルータに設定を追加
 設定→ルータに 以下を追記(フルバウンス)

 [code] = postmaster
 <*@example.com> = “php /var/www/Usagi/bin/mail.php”@pipe[/code]

これでadmin以外のexample.comへのメールはCommuniGate Proで受信された後MyNETSで処理される。
この場合バウンスメール含めて全部MyNETSに渡るので注意。

ちゃんと書くなら
[code] = “php /var/www/Usagi/bin/mail.php”@pipe[/code]
とか、MyNETSで指定されている必要なアカウントを並べていく

,
とりあえず付けておく無駄ではなかったなまぁまぁ読めたちょっと役に立ったかなかなり良かったかも (まだ評価されていません)
Loading...

MyNETSソーシャルマップ検索の高速化(Tritonn対応)

2009年9月にUsagi-projectに寄稿したもの。

現状のMyNETSでデータ量が増えて出てくるボトルネックとして、以前日記検索がlikeで行われている状況を改善するためTritonnを使った高速化を紹介しました。

これでしばらく高負荷が発生するのを防げていたのですが、次のボトルネックが発生してきました。それが個人TOPページのサムネ下「ソーシャルマップ」のページの表示です。

このページを開くと全日記本文+コメント及び全トピックコメントからGoogleMap用のcmdをlike検索するため、大きな負荷が発生することになりました。

そこでここもTritonnで対策したので、対応方法を紹介しておきます。

ーーー
■データベースにindex追加

[code]
ALTER TABLE c_diary_comment ADD FULLTEXT fullindex USING SENNA,NGRAM,NORMALIZE (body);
ALTER TABLE c_commu_topic_comment ADD FULLTEXT fullindex USING SENNA,NGRAM,NORMALIZE (body);
[/code]

■webapp/lib/db/read/gmaps.phpを修正

[code]
function p_h_gmaps_list_all_search_c_diary4c_diary($keyword, $page_size, $page)
{

//and検索を実装
//subject,body を検索
if ($keyword) {
//全角空白を半角に統一
$keyword = str_replace(‘ ’, ‘ ‘, $keyword);

$keyword_list = explode(‘ ‘, $keyword);
foreach ($keyword_list as $word) {
$word = check_search_word($word);
$where_d .= ‘ AND (‘. MYNETS_PREFIX_NAME .’c_diary.subject LIKE “%’.$word.’%” OR ‘. MYNETS_PREFIX_NAME .’c_diary.body LIKE “%’.$word.’%”)’;
$where_dc .= ‘ AND (‘. MYNETS_PREFIX_NAME .’c_diary.subject LIKE “%’.$word.’%” OR ‘. MYNETS_PREFIX_NAME .’c_diary_comment.body LIKE “%’.$word.’%”)’;
}
}
[/code]

の部分を以下に修正(MYNETS_PREFIX_NAMEは無しで仮定)

[code]
function p_h_gmaps_list_all_search_c_diary4c_diary($keyword, $page_size, $page)
{

//and検索を実装
//subject,body を検索
if ($keyword) {
//全角空白を半角に統一
$keyword = str_replace(‘ ’, ‘ ‘, $keyword);
//SQL Injection対策
$keyword = str_replace(‘\\’, ”, $keyword);
$keyword = str_replace(‘”‘, ”, $keyword);
$keyword = str_replace(‘;’, ”, $keyword);
$keyword = str_replace(‘)’, ”, $keyword);

$keyword_list = explode(‘ ‘, $keyword);
foreach ($keyword_list as $word) {
$word = check_search_word($word);
$where_d .= ‘ AND MATCH (c_diary.subject, c_diary.body) AGAINST (“‘ .$keyword. ‘” IN BOOLEAN MODE)’;
$where_dc .= ‘ AND (MATCH (c_diary.subject, c_diary.body) AGAINST (“‘ .$keyword. ‘” IN BOOLEAN MODE) OR MATCH (c_diary_comment.body) AGAINST (“‘ .$keyword. ‘” IN BOOLEAN MODE))’;
}
}
[/code]

以下の検索コードをそれぞれ置換する。全部で17カ所。
(MYNETS_PREFIX_NAMEは無しで仮定)

日記本文検索部分
[code]
” WHERE ” . MYNETS_PREFIX_NAME . “c_diary.body like ‘%%'” .
[/code]
 ↓
[code]
” WHERE match(c_diary.subject, c_diary.body) against (\”%'” .
[/code]
 ↓
[code]
” WHERE match(c_diary_comment.body) against (\”%'” .
[/code]
 ↓
[code]
” WHERE match(c_commu_topic_comment.body) against (\”

, ,
とりあえず付けておく無駄ではなかったなまぁまぁ読めたちょっと役に立ったかなかなり良かったかも (まだ評価されていません)
Loading...

MyNETSの日記検索高速化(Tritonn導入)

2009年6月にUsagi-Projectに寄稿したもの。

日記データが膨大になってきて日記検索のI/Oがサーバ全体の足を引っ張るようになってきたので、検索の高速化をしてみました。
方法はmysqlを日本語全文検索対応のTritonnプロジェクト版に変更し、それに合わせて検索部分を修正します。

手元の日記データ37万件400Mくらいのc_diaryテーブルをPentiumM1.6GHzのマシンで検索したところ(検索クエリは後述)検索速度が15倍以上になりました。

 LIKE検索 平均5.3秒
 Tritonn検索 平均0.3秒

以下手順。

1)Tritonnインストール(CentOS5サーバの場合

まずは既存のDBを念のためバックアップ
[code]# mysqldump -u root -p mynets_db > dump.sql[/code]

mysqlを置き換えるためmysqlのインストールを確認
[code]# rpm -qa | grep -i mysql
mysql-5.0.45-7.el5[/code]

mysqlをremove
通常dovecotで利用されているので、dovecotを停止してから作業
[code]# service dovecot stop
# yum remove mysql[/code]

perl-DBIのインストールを確認
[code]# rpm -qa | grep -i perl-DBI
perl-DBI-1.52-1.fc6[/code]

最新のtritonn-1.0.12-mysql-5.0.67パッケージ群をダウンロード
[code]# mkdir download
# cd download/
# wget http://iij.dl.sourceforge.jp/tritonn/36448/MySQL-client-5.0.67-tritonn.1.0.12.i386.rpm
# wget http://iij.dl.sourceforge.jp/tritonn/36448/MySQL-devel-5.0.67-tritonn.1.0.12.i386.rpm
# wget http://iij.dl.sourceforge.jp/tritonn/36448/MySQL-server-5.0.67-tritonn.1.0.12.i386.rpm
# wget http://iij.dl.sourceforge.jp/tritonn/36448/MySQL-shared-5.0.67-tritonn.1.0.12.i386.rpm
# wget http://iij.dl.sourceforge.jp/tritonn/36448/mecab-0.97-tritonn.1.0.12.i386.rpm
# wget http://iij.dl.sourceforge.jp/tritonn/36448/mecab-ipadic-2.7.0.20070801-tritonn.1.0.12.i386.rpm
# wget http://iij.dl.sourceforge.jp/tritonn/36448/senna-1.1.4-tritonn.1.0.12.i386.rpm[/code]

以下の順番でインストール
[code]# rpm -ivh mecab-0.97-tritonn.1.0.12.i386.rpm
# rpm -ivh mecab-ipadic-2.7.0.20070801-tritonn.1.0.12.i386.rpm
# rpm -ivh senna-1.1.4-tritonn.1.0.12.i386.rpm
# rpm -ivh MySQL-shared-5.0.67-tritonn.1.0.12.i386.rpm
# rpm -ivh MySQL-client-5.0.67-tritonn.1.0.12.i386.rpm
# rpm -ivh MySQL-server-5.0.67-tritonn.1.0.12.i386.rpm
# rpm -ivh MySQL-devel-5.0.67-tritonn.1.0.12.i386.rpm[/code]

MySQLはインストール後すぐに起動するのでrootのパスを設定
[code]# /usr/bin/mysqladmin -u root password ‘rootpassword'[/code]

MySQLへのログイン確認
[code]# mysql -u root -p
Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.0.67-modified MySQL Community Server (GPL) (portions (c) Tritonn Project)

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.

mysql>[/code]

これでTritonnのインストール完了

入れ替え前のDBもたぶん大丈夫なはずだが、もし使えない時には新規にDB作成して、バックアップデータをリストアする
[code]# mysql -u root -p
mysql> CREATE DATABASE mynets_db DEFAULT CHARACTER SET utf8;
mysql> quit
# mysql -u root -p mynets_db < dump.sql[/code] 2)Tritonn用のindex作成
[code]# mysql -u root -p
mysql> use mynets_db;
mysql> ALTER TABLE c_diary ADD FULLTEXT fullindex USING NGRAM,SECTIONALIZE (subject, body);[/code]

件数が多いと相当時間がかかるのでじっと待つ
完了したらテスト検索してみる(testで検索)
[code]mysql> SELECT * FROM c_diary WHERE (public_flag = ‘public’ or public_flag = ‘open’) AND MATCH (subject, body) AGAINST (“test”) ORDER BY r_datetime DESC;[/code]

LIKE検索と時間を比較してみる
[code]mysql> SELECT * FROM c_diary WHERE (public_flag = ‘public’ or public_flag = ‘open’) AND (subject LIKE ‘%test%’ or body LIKE ‘%test%’) ORDER BY r_datetime DESC;[/code]

3)MyNETSの検索部分の修正

webapp/lib/db/read/diary.phpの新規日記検索の項目を以下のように修正

$s[code]elect = ‘SELECT *’;
$from = ‘ FROM ‘ . MYNETS_PREFIX_NAME . ‘c_diary’;
$where = ” WHERE (public_flag = ‘public’ or public_flag = ‘open’)”;

if ($keyword) {
//全角空白を半角に統一
$keyword = str_replace(‘ ’, ‘ ‘, $keyword);
//SQL Injection対策
$keyword = str_replace(‘\\’, ”, $keyword);
$keyword = str_replace(‘”‘, ”, $keyword);
$keyword = str_replace(‘;’, ”, $keyword);
$keyword = str_replace(‘)’, ”, $keyword);
$keyword = check_search_word($keyword);

$where .= ‘ AND MATCH (subject, body) AGAINST (“‘ .$keyword. ‘” IN BOOLEAN MODE)’;

}
$order = ” ORDER BY r_datetime DESC”;[/code]

, , , ,
とりあえず付けておく無駄ではなかったなまぁまぁ読めたちょっと役に立ったかなかなり良かったかも (まだ評価されていません)
Loading...

CentOS5サーバ設定のインストール手順

試験環境用のインストール手順

1)CentOS5のインストール

CentOS5.2install CDで起動

サーバ設定でインストール
webサーバとmailサーバのみ選択
php関連を選択
sendmailの代わりにpostfix選択

2)起動後、不要なサービスを停止

ipv6関連不要
selinuxはdisable
http/https/smtpのみFWオープン

起動サービスは以下に設定
 cpuspeed
 crond
 httpd
 iptables
 irqbalance
 network
 sendmail(最初はpostfixリストされない)
 readahead_early
 sshd
 syslog

3)起動後メンテナンス経路設定
rootでlogin
sshd設定変更

[code]# vi /etc/ssh/sshd_config[/code]

#PermitRootLogin yes を PermitRootLogin yes に変更(ローカル鯖)
#Port 22 を Port 10022 に変更

iptablesの修正

[code]# vi /etc/sysconfig/iptables[/code]

-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 10022 -j ACCEPT 行追加

サービスを再起動
[code]# service sshd restart
# service iptables restart[/code]

以下のコマンドでメンテマシンからアクセス
ssh -p 10022 root@サーバアドレス

4)サーバ設定を行う

sendmailをremove
[code]# yum remove sendmail[/code]

postfixを起動サービスで追加
[code]#ntsysv[/code]

必要ならproxy設定を追加
[code]# vi /etc/profile.d/proxy.csh

setenv http_proxy http://プロキシURL:ポート/
setenv HTTP_PROXY http://プロキシURL:ポート/

# vi /etc/profile.d/proxy.sh

export http_proxy=http://プロキシURL:ポート/
export HTTP_PROXY=http://プロキシURL:ポート/[/code]

yumによるアップデートの準備

EPELリポジトリ追加
[code]# wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
# rpm -ihv epel-release-5-3.noarch.rpm

# yum update[/code]

リストされたものをインストールし、念のため再起動

5)高機能メールサーバCommunigateProをインストール

phpアプリで必要なケースが多いのでpostfixを活かしたままCGPを有効にする
postfix側の設定変更
[code]# vi /etc/postfix/master.cf[/code]

smtp inet n – n – – smtpd

#smtp inet n – n – – smtpd

[code]# vi /etc/postfix/main.cf[/code]

mydestination = $myhostname, localhost.$mydomain, localhost

mydestination = localhost

追記
relayhost = 自IPアドレス

[code]# service postfix start[/code]

postfixがsmtpをLISTENしてないことを確認
[code]# lsof -i[/code]

最新版のCGPをダウンロードしてインストール
[code]# wget http://www.communigate.com/pub/CommuniGatePro/CGatePro-Li…
# rpm -ivh CGatePro-Linux.i386.rpm
# service CommuniGate start[/code]

CGPの管理画面にアクセスするためにiptableでポート追加
[code]# vi /etc/sysconfig/iptables[/code]

-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 8010 -j ACCEPT 行追加

[code]# service iptables restart[/code]

ブラウザでhttp://サーバIPアドレス:8010/へアクセスして設定
Coomunityライセンス下で5ユーザまで無料で利用できる

6)日本語全文検索対応mysql/Tritonnインストール

mysqlを置き換えるためmysqlがインストールされているか確認

[code]# rpm -qa | grep -i mysql
mysql-5.0.45-7.el5[/code]

mysqlをremove
[code]# yum remove mysql[/code]

perl-DBIのインストールを確認

[code]# rpm -qa | grep -i perl-DBI
perl-DBI-1.52-1.fc6[/code]

最新のtritonn-1.0.12-mysql-5.0.67パッケージ群をダウンロード

[code]# mkdir download
# cd download/
# wget http://iij.dl.sourceforge.jp/tritonn/36448/MySQL-client-5.0.67-tritonn.1.0.12.i386.rpm
# wget http://iij.dl.sourceforge.jp/tritonn/36448/MySQL-devel-5.0.67-tritonn.1.0.12.i386.rpm
# wget http://iij.dl.sourceforge.jp/tritonn/36448/MySQL-server-5.0.67-tritonn.1.0.12.i386.rpm
# wget http://iij.dl.sourceforge.jp/tritonn/36448/MySQL-shared-5.0.67-tritonn.1.0.12.i386.rpm
# wget http://iij.dl.sourceforge.jp/tritonn/36448/mecab-0.97-tritonn.1.0.12.i386.rpm
# wget http://iij.dl.sourceforge.jp/tritonn/36448/mecab-ipadic-2.7.0.20070801-tritonn.1.0.12.i386.rpm
# wget http://iij.dl.sourceforge.jp/tritonn/36448/senna-1.1.4-tritonn.1.0.12.i386.rpm [/code]

以下の順番でインストール

[code]# rpm -ivh mecab-0.97-tritonn.1.0.12.i386.rpm
# rpm -ivh mecab-ipadic-2.7.0.20070801-tritonn.1.0.12.i386.rpm
# rpm -ivh senna-1.1.4-tritonn.1.0.12.i386.rpm
# rpm -ivh MySQL-shared-5.0.67-tritonn.1.0.12.i386.rpm
# rpm -ivh MySQL-client-5.0.67-tritonn.1.0.12.i386.rpm
# rpm -ivh MySQL-server-5.0.67-tritonn.1.0.12.i386.rpm
# rpm -ivh MySQL-devel-5.0.67-tritonn.1.0.12.i386.rpm[/code]

MySQLはインストール後すぐに起動するのでrootのパスを設定

[code]# /usr/bin/mysqladmin -u root password ‘rootpassword'[/code]

MySQLへのログイン確認

[code]# mysql -u root -p
Enter password:

Welcome to the MySQL monitor. Commands end with ; or ¥g.
Your MySQL connection id is 7
Server version: 5.0.67-modified MySQL Community Server (GPL) (portions (c) Tritonn Project)

Type ‘help;’ or ‘¥h’ for help. Type ‘¥c’ to clear the buffer.

mysql>[/code]

これでTritonnのインストール完了

mysqlのサーバ設定をする 環境に合わせてcnfを選択
[code]# cp /usr/share/mysql/my-large.cnf /etc/my.cnf[/code]

utf8で使いたい場合には以下の行を各項目で追記
[mysqld]
default-character-set = utf8
[mysqldump]
default-character-set = utf8
[mysql]
default-character-set = utf8

サービス再起動で設定反映(mysqldでないことに注意)
[code]# service mysql restart[/code]

設定変更を確認
[code]# mysql -u root -p
mysql> status

Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
…[/code]
となっていればOK

7)SNSサーバ(MyNETS)としての設定

MyNETSに必要なコンポーネントをインストール

[code]# yum install php-mcrypt php-mbstring php-gd php-mysql php-xmlrpc php-xml php-eaccelerator ImageMagick[/code]

httpd.conf編集

[code]# vi /etc/httpd/conf/httpd.conf[/code]

不要モジュールの無効化
munin用にステータス取得
他適宜必要に応じて。

試験サーバ用設定ファイル作成

[code]# vi /etc/httpd/conf.d/virtual.conf[/code]

, , , ,
とりあえず付けておく無駄ではなかったなまぁまぁ読めたちょっと役に立ったかなかなり良かったかも (まだ評価されていません)
Loading...