私はAPI用にDjango REST Frameworkを、リバースプロキシとしてはnginxを使用し、いくつかの静的APIデータをキャッシュするにはredisを使用します。
私はCache-Control: max-age
とLast-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でキャッシュの概念を誤解されていた?
ありがとうございます!キャッシュは今保存されますが、新しいクライアントがすべて上流サーバーにヒットした場合、そのキャッシュのポイントは何ですか?申し訳ありませんが、私は概念を完全に誤解しています。私が思ったのは '新しいクライアント来る - >サーバーにヒットする - > nginxは120秒間のキャッシュを保存する - >クライアントは'応答を取得する 'と考えられ、120秒後にそのリソースを呼び出す新しいクライアントはすべてnginxキャッシュから取得する。私は 'リバースプロキシ 'とは私が上で説明したものを正確に意味すると考えました –
これは予想される動作です。あなたは同じことを見ていませんか? –
いいえ、私はサーバーがぶつかっていることを確かめるために私のビューにコードを印刷しました。 Chromeで最初のリクエストを処理すると、サーバーがヒットし、次にChromeの次のリクエストがサーバーにヒットしません。しかし、 'max-age'が期限切れではない間にFirefoxからリクエストを送信すると、サーバーは再びヒットします。 –