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
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; } }