ubuntu で nginx から memcache を利用する
- memcached, python-memcache のインストールと起動
sudo apt-get install memcached python-memcache sudo /etc/init.d/memcached start
初期設定だと 11211 番ポートで起動しています。変えたい場合は /etc/memcached.conf で。
- memcached とお話してみる (telnet 編)
まずは telnet 経由でお話してみる。プロトコルについては official wiki を見ればいいと思います。
telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'.
'foo' という key で フラグ 0、無期限 (0)、 3 byte のデータ 'bar' を格納
set foo 0 0 3 bar STORED
'foo' という key の value を取得する
get foo VALUE foo 0 3
memcached の情報を見てみる
stats items STAT items:1:number 4 STAT items:1:age 56560
- memcached とお話してみる (python-memcache 編)
上記の一連の流れを python-memcache でやってみる。
>>> import memcache >>> cache = memcache.Client(['127.0.0.1:11211']) >>> dir(cache) >>> cache.flush_all() # いったんクリアしといた >>> cache.set('foo', 'bar') True >>> cache.get('foo') 'bar' >>>
- nginx に memcached を設定する
nginx は、まず memcache 内を url を key とした value を探しに行く。ない場合にのみ、アプリケーションサーバに問い合わせる。なので、アプリケーション側では、url を key にしたコンテンツを value として set する必要がある。その辺はまた後日。
まずは、nginx の conf から。前提条件として、nginx はロードバランサーとして利用することにします。今回はテストのために、 django の開発用サーバを 自マシーン内に 2 インスタンス起動ししました。# LBする apps サーバ郡だよ upstream apps { server 127.0.0.1:8081; # python test1/manage.py runserver 0.0.0.0:8081 server 127.0.0.1:8082; # python test2/manage.py runserver 0.0.0.0:8082 } server { listen 80; server_name localhost; # 静的コンテンツは nginx が返すよ location /media { root /var/www/nginx-default; access_log off; expires 30d; } # http://127.0.0.1/* の処理 location / { # POST リクエストだったら memcached 見ないで、そのまんま LB しちゃうよ if ($request_method = POST) { proxy_pass http://apps; break; } # POST 以外だったら (GET リクエストだったら) memcached に uri を key にコンテンツを探しに行くよ set $memcached_key "$uri"; memcached_pass 127.0.0.1:11211; default_type "text/html; charset=utf-8"; # memcached になかったら (memcached が 404 だったら /_apps を経由して LB しちゃうよ # error_page で LB してるってのがおもしろいな error_page 404 502 = /_apps$uri; } location /_apps { proxy_pass http://apps; # http://127.0.0.1/_apps へのアクセスはロードバランスする } error_page 500 502 503 504 /50x.html; location = /50x.html { root /var/www/nginx-default; } access_log /var/log/nginx/localhost.access.log; }
sudo /etc/init.d/nginx restart
この状態で http://127.0.0.1/ を参照すると、 test1, test2 が交互に切り替わるページが表示される。
- nginx から memcached が呼ばれるかテスト
この状態だと、url を key にした value がないので、ただの LB です。テスト的に、memcached になんか入れて 表示してみる。
>>> import memcache >>> cache = memcache.Client(['127.0.0.1:11211']) >>> cache.flush_all() >>> cache.set('/foo', 'bar') True >>>
'/foo' という key で 'bar' を追加してみた。これで http://127.0.0.1/foo にアクセスすると "bar" と表示されますよ。nginx lb いいですよ!
すばらしい!助かりました。ありがとうございます
返信削除お役に立ててよかったです><
返信削除