MySQL5.0.67+senna全文検索+PHP5.2.4をEC2に導入

MySQL5.0.67+senna全文検索+PHP5.2.4をEC2に導入

インスタンス

amzn-ami-minimal-pv-2013.09.0.x86_64-ebs (ami-0b61fe0a)
サイズは10Gで作成

必要モジュールの導入

MySQLたち
Mysql-devel http://downloads.mysql.com/archives/get/file/MySQL-devel-5.0.67-0.glibc23.x86_64.rpm
Mysql-shared http://downloads.mysql.com/archives/get/file/MySQL-shared-5.0.67-0.glibc23.x86_64.rpm
Mysql-server http://downloads.mysql.com/archives/get/file/MySQL-server-5.0.67-0.glibc23.x86_64.rpm
Mysql-client http://downloads.mysql.com/archives/get/file/MySQL-client-5.0.67-0.glibc23.x86_64.rpm

sudo yum install wget perl perl-DBI gcc gcc-c++ ncurses-devel
$ sudo wget http://downloads.mysql.com/archives/get/file/MySQL-devel-5.0.67-0.glibc23.x86_64.rpm
$ sudo wget http://downloads.mysql.com/archives/get/file/MySQL-shared-5.0.67-0.glibc23.x86_64.rpm
$ sudo wget http://downloads.mysql.com/archives/get/file/MySQL-server-5.0.67-0.glibc23.x86_64.rpm
$ sudo wget http://downloads.mysql.com/archives/get/file/MySQL-client-5.0.67-0.glibc23.x86_64.rpm
$ sudo rpm -i MySQL-devel-5.0.67-0.glibc23.x86_64.rpm
$ sudo rpm -i MySQL-shared-5.0.67-0.glibc23.x86_64.rpm 
$ sudo rpm -i MySQL-client-5.0.67-0.glibc23.x86_64.rpm
$ sudo rpm -i MySQL-server-5.0.67-0.glibc23.x86_64.rpm  

めかぶを入れる

本体

mecab http://mecab.googlecode.com/files/mecab-0.991.tar.gz

$ sudo wget http://mecab.googlecode.com/files/mecab-0.991.tar.gz
$ tar xvzf mecab-0.991.tar.gz
$ cd mecab-0.991
$ sudo ./configure --prefix=/usr/local/mecab --with-charset=utf8 | sudo tee configure.log.2014-06-19
$ sudo make 2>&1 | sudo tee make.log.2014-06-19
$ sudo make install 2>&1 | sudo tee make-install.log.2014-06-19
$ /usr/local/mecab/bin/mecab -v
mecab of 0.991

辞書

mecab-ipadic http://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz

$ sudo wget http://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
$ sudo tar xvf mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ sudo ./configure --prefix=/usr/local/mecab/ipadic --with-mecab-config=/usr/local/mecab/bin/mecab-config --with-charset=utf8 | sudo tee configure.log.2014-06-19
$ sudo make 2>&1 | sudo tee make.log.2014-06-19
$ sudo make install 2>&1 | sudo tee make-install.log.2014-06-19

sennaを入れる

senna http://globalbase.dl.sourceforge.jp/senna/46945/senna-1.1.5.tar.gz

$ sudo wget http://globalbase.dl.sourceforge.jp/senna/46945/senna-1.1.5.tar.gz
$ sudo tar xvf senna-1.1.5.tar.gz
$ cd senna-1.1.5
$ sudo ./configure --prefix=/usr/local/mysql_senna --with-mecab --with-mecab-config=/usr/local/mecab/bin/mecab-config --with-charset=utf8 | sudo tee configure.log.2014-06-19

makeをするとnkfc.cで止まるので、先にnkfc.cのコンパイルを行う

$ cd lib; sudo ../libtool --tag=CC --mode=compile \
gcc -I. -I.. -Wall -O0 -fno-strict-aliasing -g -MT nfkc.lo \
-MD -MP -MF .deps/nfkc.Plo -c -o nfkc.lo nfkc.c
$ cd ../

make

$ sudo make 2>&1 | sudo tee make.log.2014-06-19
$ sudo make install 2>&1 | sudo tee make-install.log.2014-06-19
#ownerをmysqlにしておく
$ sudo chown -R mysql:mysql /usr/local/mysql_senna/

tritonnを入れる

tritonn http://globalbase.dl.sourceforge.jp/tritonn/36449/tritonn-1.0.12-mysql-5.0.67.tar.gz”

$ sudo wget http://globalbase.dl.sourceforge.jp/tritonn/36449/tritonn-1.0.12-mysql-5.0.67.tar.gz
$ sudo tar xvf tritonn-1.0.12-mysql-5.0.67.tar.gz
$ cd tritonn-1.0.12-mysql-5.0.67
$ sudo ./configure --prefix=/usr/local/mysql_senna --enable-thread-safe-client --with-charset=utf8 --with-extra-charsets=all --with-readline --with-mecab=/usr/local/mecab --with-senna=/usr/local/senna | sudo tee configure.log.2014-06-19
$ sudo make 2>&1 | sudo tee make.log.2014-06-19
$ sudo make install 2>&1 | sudo tee make-install.log.2014-06-19

tritonn内のmy.cnfをコピーしてmysql.sockの場所を変更

$ sudo cp support-files/my-medium.cnf /etc/my.cnf
/etc/my.cnf
[client]
#password       = your_password
port            = 3306
socket          = /var/lib/mysql/mysql.sock

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port            = 3306
socket          = /var/lib/mysql/mysql.sock

mysql_install_db実行

$ sudo /usr/local/mysql_senna/bin/mysql_install_db --user=mysql --skip-name-resolve
$ sudo /usr/local/mysql_senna/share/mysql/mysql.server start

自動起動設定

$ cd /tmp/tritonn-1.0.12-mysql-5.0.67/support-files/
$ sudo cp -p mysql.server mysql
$ sudo chmod +x mysql
$ sudo mv mysql /etc/init.d/
$ cd /etc/rc2.d/
$ sudo ln -s ../init.d/mysql S90mysql

Apache設定

必要なものをインストールしていく

$ sudo yum install httpd httpd-devel libxml2 libxml2-devel
PHP

PHP 5.2.4 http://museum.php.net/php5/php-5.2.4.tar.gz

$ sudo wget http://museum.php.net/php5/php-5.2.4.tar.gz
$ ./configure --with-apxs2=/usr/sbin/apxs --with-iconv --enable-mbstring --with-mysqli=/usr/local/mysql_senna/bin/mysql_config --with-mysql=/usr/local/mysql_senna/bin/mysql_config --with-libxml-dir=/usr/include/libxml2 | sudo tee configure.log.2014-06-20

このままconfigureが通ってもmakeでエラーが出る(make: *** [ext/dom/node.lo] エラー 1)のでlibxml2にパッチをあてる
パッチがうまくあたらなかったら該当箇所を自力で変更する。一応書き換え前のファイルもcpしておく。

--- ext/dom/node.c  2012-08-06 17:49:48.826716692 +0800
+++ ext/dom/node.c  2012-08-06 17:52:47.633484660 +0800
@@ -1895,9 +1895,17 @@ static void dom_canonicalization(INTERNA
         RETVAL_FALSE;
     } else {
        if (mode == 0) {
+#ifdef LIBXML2_NEW_BUFFER
+            ret = xmlOutputBufferGetSize(buf);
+#else
            ret = buf->buffer->use;
+#endif
            if (ret > 0) {
+#ifdef LIBXML2_NEW_BUFFER
+                RETVAL_STRINGL((char *) xmlOutputBufferGetContent(buf), ret, 1);
+#else
                RETVAL_STRINGL((char *) buf->buffer->content, ret, 1);
+#endif
            } else {
                RETVAL_EMPTY_STRING();
            }
--- ext/dom/documenttype.c  2012-08-06 18:02:16.019640870 +0800
+++ ext/dom/documenttype.c  2012-08-06 18:06:16.612228905 +0800
@@ -205,7 +205,13 @@ int dom_documenttype_internal_subset_rea
        if (buff != NULL) {
            xmlNodeDumpOutput (buff, NULL, (xmlNodePtr) intsubset, 0, 0, NULL);
            xmlOutputBufferFlush(buff);
+
+#ifdef LIBXML2_NEW_BUFFER
+           ZVAL_STRINGL(*retval, xmlOutputBufferGetContent(buff),
+                        xmlOutputBufferGetSize(buff), 1);
+#else
            ZVAL_STRINGL(*retval, buff->buffer->content, buff->buffer->use, 1);
+#endif
            (void)xmlOutputBufferClose(buff);
            return SUCCESS;
        }
--- ext/simplexml/simplexml.c   2012-08-06 18:10:44.621017026 +0800
+++ ext/simplexml/simplexml.c   2012-08-06 18:12:48.016270419 +0800
@@ -1417,7 +1417,12 @@ SXE_METHOD(asXML)

            xmlNodeDumpOutput(outbuf, (xmlDocPtr) sxe->document->ptr, node, 0, 0, ((xmlDocPtr) sxe->document->ptr)->encoding);
            xmlOutputBufferFlush(outbuf);
+#ifdef LIBXML2_NEW_BUFFER
+           RETVAL_STRINGL((char *)xmlOutputBufferGetContent(outbuf),
+                          xmlOutputBufferGetSize(outbuf), 1);
+#else
            RETVAL_STRINGL((char *)outbuf->buffer->content, outbuf->buffer->use, 1);
+#endif
            xmlOutputBufferClose(outbuf);
        }
    } else {
$ sudo yum install patch
$ cd /tmp/php-5.2.4/
$ patch -p0 < /tmp/php-5.2_libxml2.patch

node.cのエラーは出なくなったけど、documenttype.cでエラーが出るので(make: *** [ext/dom/documenttype.lo] エラー 1)直接書き換え

error
/tmp/php-5.2.4/ext/dom/documenttype.c:219:42: error: dereferencing pointer to incomplete type
    strintsubset = xmlStrndup(buff->buffer->content, buff->buffer->use);

こういうエラーなので、以下の通り修正

#この行を
strintsubset = xmlStrndup(buff->buffer->content, buff->buffer->use);
#こう
strintsubset = xmlStrndup(xmlOutputBufferGetContent(buff), xmlOutputBufferGetSize(buff));

sudo make clean後に再度configureしてmake

$ ./configure --with-apxs2=/usr/sbin/apxs --with-iconv --enable-mbstring --with-mysqli=/usr/local/mysql_senna/bin/mysql_config --without-mysql --with-libxml-dir=/usr/include/libxml2 | sudo tee configure.log.2014-06-20
$ sudo make 2>&1 | tee make.log.2014-06-20
$ sudo make install 2>&1 | sudo tee make-install.log.2014-06-20

php.iniをコピーしてくる

$ sudo cp /tmp/php-5.2.4/php.ini-recommended /usr/local/lib/php.ini

timezoneなど基本的な部分を変更する。
DBが稼働しているかテスト(mysql -u rootでログイン。テストなのでひとまずPW設定なし。良い子は真似しちゃだめだぞ)

create table table01 (id int unsigned auto_increment not null, primary key(id), title varchar(255), body text, fulltext(body)) type=MyISAM;

insert into table01 values(null,"テストです","オレンジはorange、リンゴはappleです");