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_cache
apenas para garantir a segurança, porque algumas diretivas não são herdadas no location
. Além disso, está x-cache: MISS
na 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.