Como dizer ao nginx para honrar o cache do back-end? uWSGI

Como dizer ao nginx para honrar o cache do back-end? uWSGI

Há umpergunta semelhantemas a solução não funciona para mim.

Temos back-end de anúncios nginx e uWSGI. Precisamos do nginx para armazenar em cache a resposta do back-end de acordo com o que está no cabeçalho da resposta.

Por exemplo, eu corro curl -I https://example.com/api/project_data/. Usando tcpdump, vejo que o back-end responde:

HTTP/1.1 200 OK
Content-Type: application/json
Vary: Accept, Accept-Language, Origin
Allow: GET, HEAD, OPTIONS
Cache-Control: public, max-age=3600
X-Request-ID: 6aa...0d99
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Set-Cookie:  longterm_session=45c6...67; Domain=example.com;

No entanto, a resposta não é armazenada em cache e o nginx chega ao back-end sempre que a solicitação é recebida.

A configuração do nginx:

http {
        uwsgi_cache_path /var/local/nginx_cache levels=2:2 use_temp_path=off inactive=1h keys_zone=mycache:20m ;
....

  server {
    ....
    uwsgi_cache mycache;
    uwsgi_cache_key "$request_method$request_uri";

    location /api/project_data/ {
      add_header X-Cache $upstream_cache_status;
      add_header Pragma "public";
      uwsgi_pass 127.0.0.1:49002;
      include uwsgi_params;

      uwsgi_cache mycache;
      uwsgi_cache_key "$request_method$request_uri";

    }

Eu dupliquei uwsgi_cacheapenas para garantir a segurança, porque algumas diretivas não são herdadas no location. Além disso, está x-cache: MISSna resposta que o nginx envia ao cliente.

O que estou fazendo de errado?

Responder1

Documentos Nginxdeclarar explicitamenteque

Se o cabeçalho incluir o campo “Set-Cookie”, tal resposta não será armazenada em cache.

Você teria que fazer com que seu aplicativo não enviasse cookies para que a resposta correspondente fosse armazenada em cache, por razões óbvias - cookies são dados extras para cliente e servidor, iguais, por exemplo, ao corpo da resposta.

informação relacionada