ubuntu で nginx から memcache を利用する

  1. memcached, python-memcache のインストールと起動
    sudo apt-get install memcached python-memcache
    sudo /etc/init.d/memcached start
    

    初期設定だと 11211 番ポートで起動しています。変えたい場合は /etc/memcached.conf で。

  2. 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
    
  3. 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'
    >>>
    
  4. 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 が交互に切り替わるページが表示される。

  5. 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 いいですよ!

コメント

  1. すばらしい!助かりました。ありがとうございます

    返信削除
  2. お役に立ててよかったです><

    返信削除

コメントを投稿

このブログの人気の投稿

Python から Win32 API 経由で印刷する

Disqus のスケール - Django 編

Django と Python 3 - #python_adv