1

問題は、nginx が memcached に存在する memcached キーをフェッチしないことです。これは、リンクを要求するたびに発生します。

memcached ログ:

memcached へのキー "site-/links" を含む Nginx リクエストが失敗しました: (ただし、me​​mcached のキー データ)

<31 new auto-negotiating client connection
31: Client using the ascii protocol
<31 get site-/links                  ### NO DATA SEND! but it in cache
>31 END
<31 connection closed.

キー「site-/links」を含むDjangoリクエストはデータを正常に取得します

<31 get :1:mkey
>31 sending key :1:mkeys 0 4
mval

(dp1
.

>31 END
<31 get :1:site-/links
>31 sending key :1:site-/links         ###data send!
>31 END
<31 set :1:site-/links 0 300 5518
>31 STORED
<31 set :1:mkey 0 300 4
>31 STORED
<31 connection closed.

memcached の私の nginx cfg:

location / {
default_type  "text/html; charset=utf-8";
set $memcached_key site-$uri;
    memcached_pass 127.0.0.1:11211;
    error_page     404 502 = @django;

}

location @django {
    include uwsgi_params;
    uwsgi_pass unix:///var/tmp/site.sock;
}

ジャンゴミドルウェア:

class NginxMemCacheMiddleWare(object):
    def process_response(self, request, response):
        cacheIt = True
        theUrl = request.get_full_path()

        # if it's a GET then store it in the cache:
        if request.method != 'GET':
            cacheIt = False

        # loop on our CACHE_INGORE_REGEXPS and ignore
        # certain urls.
        for exp in settings.CACHE_IGNORE_REGEXPS:
            if re.match(exp,theUrl):
                cacheIt = False

        if cacheIt:
            key = '%s-%s' % (settings.CACHE_KEY_PREFIX,theUrl)
            #key = theUrl
            print "CACHE!"
            print key

            print "MKEY:",cache.get("mkey")
            print cache.get(key)
            cache.set(key,response.content)
            cache.set("mkey","mval")

        return response

では、なぜnginxはmemcachedで常にdjango uwsgiに行くキーでデータをフェッチできないのでしょうか?

4

2 に答える 2

0

私は同じセットアップを使用していますが、これは問題です。

Django のキャッシュは世代キャッシュを使用し、キー ジェネレーターにプレフィックスを配置します。

あなたがしなければならないことは、 <-- 内部 memcached バインディングsetからあなたを確実にすることです。django.core.cache.cache._cache

from django.core.cache import cache

cache._cache.set(...)

を使用するローカル環境でこれを機能させるために、自分自身を返すプロパティでDummyCacheサブクラス化しました。DummyCache_cache

PS: ばかげたパフォーマンスに備えてください。現在、送信トラフィックの上限が 100 メガビットに制限されています。

于 2012-11-05T20:12:59.123 に答える
0

memcached ログから、nginx は次のことを行っています。

get site-/links

あなたのジャンゴがやっている間:

get :1:site-/links

注: これらは同じキーではありません:1:。前にある django です! (これ:1:はおそらく、一種の名前空間として django によって自動的に追加されます)

locationつまり、次のブロックに一致するように ningx 構成を変更します。

location / {
  default_type  "text/html; charset=utf-8";
  set $memcached_key :1:site-$uri;
  memcached_pass 127.0.0.1:11211;
  error_page     404 502 = @django;
}
于 2012-11-05T20:00:08.957 に答える