memcached+nginxでキャッシュサーバー作成

運用中のサービス(apache+cakephp)にキャッシュサーバーを導入したいなぁと思い調査。
memcached+cakephpなど組み合わせ技については
http://c-brains.jp/blog/wsg/10/06/09-101531.php
などで試されているが、cakephpのデフォルトの設定を使用すると
キャッシュをリセットした際にセッションも削除されてしまう。。
http://c-brains.jp/blog/wsg/11/04/21-140105.php

また運用中のcore.phpの設定変更はできればやりたくないので、
別サーバーで
nginxをwebサーバーにして、memcachedでキャッシュできるような
構成を色々なサイトを参考にして作ってみることに。
nginx等の設定ははじめてだったので、全部最初から以下メモ。

【構成】
     cacheサーバー ① アプリケーションサーバ
client--->nginx(memcached)---->apache(cakephp)
<--
   ②
①キャッシュがない場合はアプリケーションサーバーに流す
②キャッシュがある場合はnginxで返す。

【やったこと一覧】
【1】memcachedをインストール+起動
【2】phpからテスト書き込み
【3】memcachedに保管されたキャッシュを確認する(memcache-tools)
【4】nginxのインストール+サーバー起動設定
【5】nginxの設定ファイルにキャッシュのあるなしによる振り分けを条件追加

【1】memcachedをインストール+起動

# rpm -q libevent
libevent-1.1a-3.2.1
rpm -qa | grep centos-release

[libeventのインストール]

http://www.monkey.org/~provos/libevent/
# cd /usr/local/src
# wget http://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz
# tar xvfz libevent-1.4.13-stable.tar.gz
# cd libevent-1.4.13-stable
# ./configure --prefix=/usr/local/libevent
# make
# make install

[memcachedのインストール]

http://code.google.com/p/memcached/downloads/list
# cd /usr/local/src
# wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz
# tar xvfz memcached-1.4.5.tar.gz
# cd memcached-1.4.5
# ./configure --with-libevent=/usr/local/libevent/
# make
# make install

[起動]

# /usr/local/bin/memcached -p 11211 -m 1024m -d -u nobody
  • p デフォルトは11211
  • m キャッシュメモリ容量デフォルトは64MB 1024で1G
  • u デーモンの起動ユーザー rootでは不可
  • d デーモンモード

[終了]

# sudo killall memcached 

【2】phpからテスト書き込み
[phpとの接続用]

pecl install memcache

>Build process completed successfully
>You should add "extension=memcache.so" to php.ini

[設定ファイル]
/etc/sysconfig/memcached

[php->書き込み]

<?php
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$memcache_obj = memcache_connect("localhost",11211);
$memcache_obj->add('hoge','fuga',false,0);
$memcache_obj->set('var_key', 'some really big variable', MEMCACHE_COMPRESSED, 50);
?>

【3】memcachedに保管されたキャッシュを確認する(memcache-tools)
[確認 memcache-tool]

    • memcached-toolを作業環境配下にコピーしておく
cp -p /usr/local/src/memcached-1.4.5/scripts/memcached-tool /usr/local/bin/.
--help
/usr/local/bin/memcached-tool
--オプション色々
/usr/local/bin/memcached-tool localhost display
/usr/local/bin/memcached-tool localhost stats  
/usr/local/bin/memcached-tool localhost dump  >>キャッシュの中身を見れる

【4】nginxのインストール+サーバー起動設定
リバースプロキシにnginx(port:80)を使用。
バックエンドにapache+mod_phpを使用。

(1)nginxのyumパッケージをfedoraのサイトから取得
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
rpm -ivh epel-release-5-4.noarch.rpm

(2)インストール

yum install nginx

(3)起動

/etc/rc.d/init.d/nginx start
/etc/rc.d/init.d/nginx stop

(4)設定ファイルの場所を確認

#nginx -V
> --conf-path=/etc/nginx/nginx.conf
> --error-log-path=/var/log/nginx/error.log
> --http-log-path=/var/log/nginx/access.log......

※すでにapache等が80番ポートで使われている場合は
vi /etc/nginx/nginx.conf
で記述されているserverのlistenを80->8080へ変更します。
server {
listen 8080;
}


【5】nginxの設定ファイルにキャッシュのあるなしによる振り分けを条件追加
(参考)http://labs.unoh.net/2009/08/tips_for_nginx.html

vi /etc/nginx/nginx.conf

/etc/nginx/nginx.conf

#backend
upstream backends {
    server 127.0.0.1:8080;
}

http {
    #(snip)

    server {
        #(snip)

        location / {
            #post->backend
            if ($request_method = POST) {
                proxy_pass http://backend;
                break;
            }

            #cache seigyo
            set $memcached_key $uri;
            memcached_pass     127.0.0.1:11211;
            default_type       text/html;
            error_page         404 502 = @fallback;
        }

        location @fallback {
            proxy_pass         http://backend;
        }
    }
}

★ページの登録

<?php
$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211);
$memcache_obj->set('http:domain.com/cake/user/12345/', '<html>aaaaaaaaaa</html>', MEMCACHE_COMPRESSED, 50);
?>

その他
[※nginxの基本的な使い方]
★プロキシにアクセスしてきたクライアントのIPをwebサーバーへ引き継ぐ
※主に携帯サービスなどで、アクセス元のIPを認識する必要があるとき
proxy_set_header Host $host;
proxi_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

ディレクトリ構成
/conf/ 設定ファイルを格納
/html/ webサーバーを起動したときのルートディレクト
/logs/ ログファイル
/sbin/ nginxの実行バイナリ

★起動オプション

  • p prefix :nginxの実行時に処理の基準となるディレクトリを絶対パスで記述.デフォルトはインストールディレクト
  • c filename :設定ファイルのありかを示す。デフォルトはconf/nginx.conf

rei)nginx -p /home/hsbt/dotfile -c conf/nginx.conf

★設定ファイル
・http
・server
・location

[nginxの設定例]※今回の設定とは無関係
rei1 リバースプロキシとして使用

http{
	upstream $name{
		server 192.168.0.1:80 weight=3;
		server 192.168.0.2:80 weight=3;
	}
	server {
		listen 80;
		server_name $domain_name;
		localtion/ {
			proxy_pass http:$name;
		}
	}
}

rei2 サーバーの設定

server {
listen 80;
server_name hoge.com;

location / {
root /home/hoge.com/web;
index index.php index.pl index.cgi index.html index.htm;
}
}

rei3 静的ファイル以外はapacheへ流す

server {
    listen       80;
    server_name  www.example.com;
 
    location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
        root    /www/example1;
        index   index.html;
        ssi     on;
        break;
    }
 
    location / {
        proxy_pass  http://127.0.0.1:1111;
        break;
    }
}
 
server {
    listen       80;
    server_name  www.example.org;
 
    location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
        root    /www/example2;
        index   index.html;
        ssi     on;
        break;
    }
 
    location / {
        proxy_pass  http://127.0.0.1:2222;
        break;
    }
}