httpdのMemory Cacheを使う

USBメモリはHDDに比べ、速度が遅く、読み書き回数が寿命に影響を与えるデバイスです。
そこで2GBも入っている物理メモリが遊んでいる事だし、Apache  HTTP サーバ(httpd)の2.2から使用可能になったMemory cacheを有効にしてみました。
ちなみに元々のhttpdは、インストール直後のFedoraにyum install httpdで入れたままのものです。

現状をCheck&Try

まずはデフォルトのサーバを調べます。

# ps aux | grep httpd /* 今動いているサーバを確認 */
 nobody    1996  0.1  1.8 259540 35092 ?        S    12:33   0:39 /usr/sbin/httpd
# /usr/sbin/bin/httpd -v
 Server version: Apache/2.2.14 (Unix)
# /usr/sbin/httpd -M | grep cache /* 現在有効になっているキャッシュモジュールを調べる */
cache_module (static)
disk_cache_module (static)
Syntax OK

調べてみるとCacheモジュールとDiskキャッシュは有効になっているけれど、Memory Cacheは入ってない状態。後からモジュールを追加できる動的共有オブジェクト (DSO) で有効にできないかとmod_mem_cache.soを探したけど見つからず。
公式(Download – The Apache HTTP Server Project)からダウンロードしたhttpd-2.2.15.tar.gzには入っていたけれど、コピーしてただ読み込ませてもエラーが出て使えません。うーん、入った状態のものを1からビルドしないとダメと結論。

諦めてmake初挑戦

にわかなので初めてmakeとかしました。gccすら入ってなかったし。最新のhttpdは前述の公式からtmpに落としておきます。

# yum check-update
# yum update
# yum install gcc
# cd tmp
# tar xvzf httpd-2.2.xx.tar.gz
# cd httpd-2.2.15

configureのパラメータですが、Apache 2.2でWebサイトをパフォーマンスアップ!(2/3) - @ITを参考にさせてもらっています

# ./configure --prefix=/usr/sbin --enable-cache --enable-disk-cache --enable-mem-cache
# make

ちなみに–prefix=でインストール予定のパスを指定するらしい。
緊張しながら待つと無事に終わったらしい。一応ログを追っかけてErrorが無いか確認。問題なさそうなのでインストールします。

# /etc/init.d/httpd stop /* 今のサーバを停止 */
# make install

非力なATOM330ですが、処理自体は10分前後という所。無事に終わってやったぜ\(^o^)/と思ったらhttpd開始できず/(^o^)\ナンテコッタイ

# cd /etc/inietc/init.d/httpd start
httpd を起動中: /bin/bash: /usr/sbin/httpd: No such file or directory
[失敗]

いろいろ調べた結果、httpdの場所が変わってしまったのと、それによりぷつぷつリンクが切れてしまったのが原因らしい。

# find / -name httpd
/usr/sbin/bin/httpd /* ナゼかsbinの下のbinディレクトリに入ってしまった */
# find / -name httpd.conf
/usr/sbin/conf/httpd.conf /* httpd.confはこれを参照している模様 */
# rm /usr/sbin/conf/httpd.conf
# ln -s /etc/httpd/conf/httpd.conf /usr/sbin/conf/httpd.conf /* 元々のhttpd.confを見に行く様にする */

2010/06/05 追記
httpdのスタートアップスクリプトである/etc/init.d/httpdもパスの修正が必要
修正前:httpd=${HTTPD-/usr/sbin/httpd}
修正後:httpd=${HTTPD-/usr/sbin/bin/httpd}
これで/etc/init.d/httpdでstart|stop|restartできます。

気を取り直してまた起動をかけてみる

# /etc/init.d/httpd start
httpd を起動中: httpd: Syntax error on line 148 of /usr/sbin/conf/httpd.conf: module auth_basic_module is built-in and can't be loaded
[失敗]

また失敗。調べてみるとこのメッセージは、「LoadModuleで組み込もうとしているDSOが、すでに有効になっている場合に出る」という事らしい。今httpd本体に組み込まれているモジュールを

/usr/sbin/bin/httpd -l

で調べ、httpd.confにてかぶっているLoadModuleを片っ端からコメントアウトしていきます。そしてもう一度httpd start.ちゃんとOKになったヽ( ゚∀゚)/ 正常に動いた後は、httpd.confにMemory cacheの設定を追加してリスタートしてあります。

<IfModule mod_cache.c>
	CacheIgnoreNoLastMod On

	<IfModule mod_mem_cache.c>
	CacheEnable mem /
	MCacheSize 512000
	MCacheMaxObjectCount 9000
	MCacheMinObjectSize 1
	MCacheMaxObjectSize 1024000
	MCacheMaxStreamingBuffer 128000
	CacheIgnoreCacheControl On
	CacheStorePrivate On
	</IfModule>
</IfModule>

MySQLのDBが壊れてた

あとは徒労日記が表示できれば完了。のハズだったんですが、「データベースに接続できません」という予想外のエラーを言われて凹む_| ̄|● その後の調査の過程で、DBをバックアップしようとしたところ、エラーが出て取れない事に気がつく。

# mysqldump -u root -p —all-databases > dump.sql
Enter  password:
mysqldump: Got error: 145: Table ‘./wp/wp_options’ is  marked as crashed  and should be repaired when using LOCK TABLES

修正を試みたところ、無事に直った。

# mysql -u root -p
mysql> use wp;
mysql> check table wp_options;
+———————-+———-+—————+—————————————————————————————+
|  Table         | Op    | Msg_type |  Msg_text                                                 |
+———————-+———-+—————+—————————————————————————————+
|  wp.wp_options | check | warning  | Table is marked as  crashed                               |
| wp.wp_options | check |  warning  | 2 clients are using or haven’t closed the table properly |
|  wp.wp_options | check | error    | Record at pos: 486376 is not  remove-marked               |
| wp.wp_options | check | error    |  record delete-link-chain corrupted                       |
|  wp.wp_options | check | error    |  Corrupt                                                  |
+———————-+———-+—————+—————————————————————————————+
5  rows in set (0.02 sec)

mysql> check table wp_options  extended;
+———————-+———-+—————+—————————————————————————————+
|  Table         | Op    | Msg_type |  Msg_text                                                 |
+———————-+———-+—————+—————————————————————————————+
|  wp.wp_options | check | warning  | Table is marked as  crashed                               |
| wp.wp_options | check |  warning  | 2 clients are using or haven’t closed the table properly |
|  wp.wp_options | check | error    | Record at pos: 486376 is not  remove-marked               |
| wp.wp_options | check | error    |  record delete-link-chain corrupted                       |
|  wp.wp_options | check | error    |  Corrupt                                                  |
+———————-+———-+—————+—————————————————————————————+
5  rows in set (0.00 sec)

mysql> repair table wp_options;
+———————-+————+—————+———————————————————————————+
|  Table         | Op     | Msg_type |  Msg_text                                             |
+———————-+————+—————+———————————————————————————+
|  wp.wp_options | repair | info     | Wrong bytesec: 129-159-228 at  486376; Skipped        |
| wp.wp_options | repair | info     | Wrong  bytesec: 129-159-228 at 486376; Skipped        |
| wp.wp_options |  repair | info     | Found block with too small length at 170576; Skipped  |
| wp.wp_options | repair | info     | Found block that points  outside data file at 173996  |
| wp.wp_options | repair | info     |  Found block that points outside data file at 174096  |
|  wp.wp_options | repair | info     | Found block that points outside data  file at 174452  |
| wp.wp_options | repair | info     | Found block  that points outside data file at 176244  |
| wp.wp_options | repair |  warning  | Number of rows changed from 258 to 251               |
|  wp.wp_options | repair | status   |  OK                                                   |
+———————-+————+—————+———————————————————————————+
9  rows in set (0.03 sec)

mysql> check table wp_options  extended;
+———————-+———-+—————+—————+
| Table         | Op    |  Msg_type | Msg_text |
+———————-+———-+—————+—————+
| wp.wp_options |  check | status   | OK       |
+———————-+———-+—————+—————+
1 row  in set (0.00 sec)

mysql> quit

この後は問題無くBlogが表示された。

何かのタイミングでデータベース(wp)が壊れていた事が原因みたい。これで少し快適&延命になるかな。

コメントを残す