2

私の Web サイトでは、memcached を使用してデータ キャッシュを作成しました。完全に生成された html ページを格納します。次のステップは、nginx によって memcached からこのデータを取得し、Apache プロセスを開始していないユーザーに送り返すことでした。最初に、php バックエンドでキャッシュからデータを取得しようとしましたが、うまくいきました。しかし、nginx でこれを作成しようとすると、データがほとんど破損していません。みたいなここに画像の説明を入力

この問題について助けを求めています。

ps ここで nginx config の一部が役立つ場合

location / {
    #add_header    Content-Type  "text/html";
    set $cachable 1;

    if ($request_method = POST){
        set $cachable 0;
        break;
    }
    if ($http_cookie ~ "beauty_logged") {
        set $cachable 0;
        break;
    }

    if ($cachable = 1) {
        set             $memcached_key   'nginx_$host$uri';
        memcached_pass  127.0.0.1:11211;
    }

    default_type    text/html;
    error_page      404 502 504 405 = @php;
    #proxy_pass http://front_cluster;
}

location @php {
    proxy_pass http://front_cluster;
}
4

6 に答える 6

5

Nginx は Memcached に格納されたコンテンツを処理せず、取得してそのままブラウザに返します。

本当の原因は、アプリケーションが使用する Memcached クライアント ライブラリです。ほとんどのライブラリは大きな値を圧縮するため (通常、値のサイズがしきい値を超えた場合)、圧縮しないように設定するか、 gunzip モジュールを有効にして設定する必要がありますmemcached_gzip_flag(Nginx "unstable" 1.3.6 で初めて登場) 。

于 2012-07-16T12:23:21.847 に答える
1

そのため、問題は Memcached CompressTreshold にありました。データが 20,000 シンボルを超えると、memcached は圧縮をオンにします (conresion = false の場合でも)。

于 2012-07-17T09:39:21.597 に答える
1

あなたが投稿した応答は、gzip されたもののようです。私の最初の推測では、に格納されているApache応答を返していますが、ポップしてから返されると、ヘッダーが省略されるため、ブラウザーは間違った応答を受け取ります。で gzip 圧縮を無効にすることで、これが当てはまるかどうかを簡単にテストできます。transfer-encoding=gzipmemcachednginxmemcachedtransfer-encodingApache

この場合、transfer-encodingヘッダーを保持するための解決策を探す必要があります... gzip されていないコンテンツと gzip されたコンテンツに対して異なるルールを定義し、後者の場合は常にヘッダーを返すようにします。しかし、これを見てください: http://wiki.nginx.org/HttpSRCacheModule。などのケースに対応しているようです。

于 2012-07-16T12:00:56.703 に答える
0

問題は特定のmemcachedの動作にありました。データ圧縮をオフにしても、データが20kシンボルの制限を超えた場合はmemcachedがオフにします。治療法は-(私の場合)バックエンドをキャッシュすることでsmthのようになります$this->_memcache->setCompressThreshold(20000, 1);

psバックエンドの親クラスとしてZend_Cache_Backend_Memcachedを使用しています。したがって、上記の文字列は次の場所にある必要があります__contstruct()

于 2012-08-01T14:43:48.190 に答える