2017-02-15 9 views
2

私はAPI用にDjango REST Frameworkを、リバースプロキシとしてはnginxを使用し、いくつかの静的APIデータをキャッシュするにはredisを使用します。
私はCache-Control: max-ageLast-Modifyヘッダーでキャッシングを実装しようとしていました。nginxにキャッシュフォルダのレスポンスを保存させるにはどうすればよいですか?

class SomeViewSet(viewsets.ModelViewSet): 
    .... 
    def list(self, request, *args, **kwargs): 
     queryset = self.get_queryset() 
     cache_key = self._get_cache_key() # get a key for reddis 
     response = self._get_data_from_cache(cache_key) # get a data from reddis 
     if response: 
      # If data in redis return Response with a same Last-Modify 
      # and 'Cache-Control': 'max-age=120' 
      return response 

     # Setting up new value for this viewset in a reddis 
     serializer = self.get_serializer(queryset, many=True) 
     now = datetime.datetime.now() 
     cache.set(cache_key, [now, serializer.data]) 
     return Response(serializer.data, headers={'Last-Modified': now, 'Cache-Control': 'max-age=120'}) 

私は120秒間、ブラウザのキャッシュデータを期待するようにそれが動作し、それがIf-Modified-Sinceヘッダーとクライアントのチェック内容を期限切れにする場合:それはこのようになります一言で言えば

しかし、私はヘッダーを設定すると、nginxはキャッシュフォルダにそれを保存し、サーバーにヒットせずにすべてのクライアントにサービスを提供します。ここ
は、ローカルマシンからの私のテストnginxの設定ファイルである:

upstream django { 
    server 127.0.0.1:8002; 
} 

proxy_cache_path /home/ivan/projects/kors/test_prod/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; 

server { 
    listen  8000; 
    server_name 127.0.0.1; # 
    charset  utf-8; 
    client_max_body_size 75M; 

location /media { 
    alias /path/to/media; 
    expires 1y; 
    log_not_found off; 
    access_log off; 
} 
location /static { 
    alias /path/to/static; 
    expires 1y; 
    log_not_found off; 
    access_log off; 
} 

location/{ 
    uwsgi_pass django; 
    include  /path/to/uwsgi_params; 
    uwsgi_param Host $host; 
    uwsgi_param X-Real-IP $remote_addr; 
    uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for; 
    uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto; 

    proxy_cache my_cache; 
    } 
} 

この記事nginx-caching-guideを考えてみましょう。

NGINXはどうやってキャッシュするかどうかを決定しますか?
デフォルトでは、NGINXはオリジンサーバからのCache-Controlヘッダを尊重します。 Cache-Controlをプライベート、No-Cache、No-Storeに設定したレスポンスや、レスポンスヘッダーにSet-Cookieを設定したレスポンスをキャッシュしません。 NGINXは、GETおよびHEADクライアント要求のみをキャッシュします。以下の回答に記載されているように、これらのデフォルトを上書きすることができます。

Cache-Contol: max-ageヘッダーは、nginxがjsonをキャッシュフォルダに保存すると考えました。
フォルダが作成されましたが、ここにデータはなく、別のブラウザからの私の要求はすべてサーバーに当たっています。
私は何を逃したのですか?または、おそらく私は完全にnginxでキャッシュの概念を誤解されていた?

答えて

1

コールの最初に、ヘッダにCache-Control: max-ageを追加することはそれで何かをするnginxの教えてくれありません。クライアントはヘッダーの処理方法と後続の要求の処理方法を管理します。

あなたはおそらく、URLのためのnginxレスポンスキャッシングです。あなたのnginxの設定で問題が発生しないようにしてください。

uwsgi_cache_path /home/ivan/projects/kors/test_prod/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; 

location/{ 

    include  /path/to/uwsgi_params; 
    uwsgi_param Host $host; 
    uwsgi_param X-Real-IP $remote_addr; 
    uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for; 
    uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto; 

    uwsgi_cache my_cache; 
    uwsgi_pass django; 
} 

ここでは、uwsgiキャッシュモジュールを使用する必要があります。

ここをクリックhttp://nginx.org/en/docs/http/ngx_http_uwsgi_module.html

+0

ありがとうございます!キャッシュは今保存されますが、新しいクライアントがすべて上流サーバーにヒットした場合、そのキャッシュのポイントは何ですか?申し訳ありませんが、私は概念を完全に誤解しています。私が思ったのは '新しいクライアント来る - >サーバーにヒットする - > nginxは120秒間のキャッシュを保存する - >クライアントは'応答を取得する 'と考えられ、120秒後にそのリソースを呼び出す新しいクライアントはすべてnginxキャッシュから取得する。私は 'リバースプロキシ 'とは私が上で説明したものを正確に意味すると考えました –

+0

これは予想される動作です。あなたは同じことを見ていませんか? –

+0

いいえ、私はサーバーがぶつかっていることを確かめるために私のビューにコードを印刷しました。 Chromeで最初のリクエストを処理すると、サーバーがヒットし、次にChromeの次のリクエストがサーバーにヒットしません。しかし、 'max-age'が期限切れではない間にFirefoxからリクエストを送信すると、サーバーは再びヒットします。 –

関連する問題