AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 901125
Accepted
Lucio Crusca
Lucio Crusca
Asked: 2018-03-12 13:24:57 +0800 CST2018-03-12 13:24:57 +0800 CST 2018-03-12 13:24:57 +0800 CST

Nginx como proxy reverso não está em cache

  • 772

Estou tentando configurar o Nginx como um proxy reverso de cache. O servidor de origem é o Apache e hospeda uma instância do WordPress, se isso for importante.

A funcionalidade de proxy reverso está funcionando conforme o esperado, mas o cache parece não funcionar. Se eu recebo o mesmo recurso estático duas vezes seguidas, recebo x-proxy-cache: MISSduas vezes.

assodigitale.it é o domínio, 138.201.87.123 o endereço IP do servidor de origem e 138.201.87.124 o endereço IP do proxy Nginx.

O servidor de origem parece responder permitindo que o proxy armazene em cache o recurso:

$ curl --connect-to ::138.201.87.123:443 --http2 -I https://assodigitale.it/wp-content/uploads/2018/03/aereo.jpg
HTTP/2 200 
date: Sun, 11 Mar 2018 20:59:39 GMT
server: Apache/2.4.25 (Debian)
content-length: 32989
strict-transport-security: max-age=31536000; includeSubdomains; preload
last-modified: Wed, 07 Mar 2018 09:34:41 GMT
etag: "80dd-566cf44ca2952"
accept-ranges: bytes
vary: Accept-Encoding
cache-control: max-age=1209600, public
x-content-type-options: nosniff
content-type: image/jpeg

A primeira solicitação ao servidor proxy resulta em um MISS, conforme esperado:

$ curl --connect-to ::138.201.87.124:443 --http2 -I https://assodigitale.it/wp-content/uploads/2018/03/aereo.jpg
HTTP/2 200 
server: nginx/1.13.9
date: Sun, 11 Mar 2018 21:04:00 GMT
content-type: image/jpeg
content-length: 32989
strict-transport-security: max-age=31536000; includeSubdomains; preload
last-modified: Wed, 07 Mar 2018 09:34:41 GMT
etag: "80dd-566cf44ca2952"
vary: Accept-Encoding
cache-control: max-age=1209600, public
x-content-type-options: nosniff
x-proxy-cache: MISS
strict-transport-security: max-age=4838400; includeSubDomains; preload
accept-ranges: bytes

A segunda solicitação ao proxy Nginx deve resultar em um HIT, mas resulta em outro MISS:

$ curl --connect-to ::138.201.87.124:443 --http2 -I https://assodigitale.it/wp-content/uploads/2018/03/aereo.jpg
HTTP/2 200 
server: nginx/1.13.9
date: Sun, 11 Mar 2018 21:05:52 GMT
content-type: image/jpeg
content-length: 32989
strict-transport-security: max-age=31536000; includeSubdomains; preload
last-modified: Wed, 07 Mar 2018 09:34:41 GMT
etag: "80dd-566cf44ca2952"
vary: Accept-Encoding
cache-control: max-age=1209600, public
x-content-type-options: nosniff
x-proxy-cache: MISS
strict-transport-security: max-age=4838400; includeSubDomains; preload
accept-ranges: bytes

Aqui está a parte relevante da minha configuração do nginx:

proxy_cache_path /srv/cache/nginx levels=1:2 keys_zone=revproxy:2000m inactive=2880m use_temp_path=off;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_methods GET HEAD;
proxy_cache_valid any 1m;
proxy_cache_valid 200 1440m;

server {
    listen 443 ssl http2;
    ssl on;
    server_name assodigitale.it;

    ssl_certificate /etc/letsencrypt/live/assodigitale.it/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/assodigitale.it/privkey.pem;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

    ssl_protocols TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
    ssl_prefer_server_ciphers on;

    location / {
        proxy_cache revproxy;
        add_header X-Proxy-Cache $upstream_cache_status;
        add_header Strict-Transport-Security "max-age=4838400; includeSubDomains; preload";

        proxy_pass  https://138.201.87.123;
        proxy_cache_use_stale updating error timeout http_500 http_502 http_503 http_504;
        proxy_cache_bypass $http_x_forceflushcacheurl;
        proxy_cache_lock on;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_hide_header Upgrade;
        proxy_buffering off;
        proxy_connect_timeout       600;
        proxy_send_timeout          600;
        proxy_read_timeout          600;
        send_timeout                600;
        proxy_ignore_headers Set-Cookie;

        http2_push_preload on;
        client_max_body_size 64M;
    }
}

O /srv/cache/nginxdiretório tem 755 permissões e www-dataproprietário, e o Nginx é executado como www-data. Na verdade, o Nginx escreve suas pastas lá, a saber 0 1 2 3 4 5 6 7 8 9 a b c d e f, , mas o espaço total ocupado agora é de 344Kb, para um site bastante grande e que tem muito mais do que tráfego casual.

Tentar os mesmos curlcomandos acima, mas com páginas em vez de imagens, produz exatamente o mesmo resultado, é sempre uma FALTA.

Por que o Nginx está se recusando a armazenar recursos em cache?

nginx
  • 3 3 respostas
  • 4475 Views

3 respostas

  • Voted
  1. Best Answer
    zzhRex
    2018-06-06T00:24:20+08:002018-06-06T00:24:20+08:00

    você deve definir proxy_buffering on, caso contrário, o nginx não armazenará em cache a resposta!

    o documento oficial dizia:

    Quando o buffer está desabilitado, a resposta é passada para um cliente de forma síncrona, imediatamente após o recebimento. nginx will not try to read the whole response from the proxied server.O tamanho máximo dos dados que o nginx pode receber do servidor por vez é definido pela diretiva proxy_buffer_size.

    • 5
  2. Lucio Crusca
    2018-03-21T03:03:12+08:002018-03-21T03:03:12+08:00

    Copiei a configuração de outro proxy Nginx semelhante que executo, adaptei para o site e agora funciona.

    Esta é a configuração que estou usando atualmente:

    proxy_cache_path /srv/cache/nginx levels=1:2 keys_zone=revproxy:2000m inactive=2880m use_temp_path=off;
    proxy_cache_key "$scheme$request_method$host$request_uri";
    proxy_cache_methods GET HEAD;
    proxy_cache_valid any 1m;
    proxy_cache_valid 200 1440m;    
    server {
        listen 443 ssl http2;
        ssl on;
        server_name assodigitale.it;
    
        ssl_certificate /etc/letsencrypt/live/assodigitale.it/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/assodigitale.it/privkey.pem;
    
            ssl_protocols        SSLv3 TLSv1 TLSv1.1 TLSv1.2;    
            ssl_ciphers RC4:HIGH:!aNULL:!MD5;
            ssl_prefer_server_ciphers on;
            keepalive_timeout    60;
            ssl_session_timeout  10m;
    
        location / {
                proxy_cache revproxy;
                add_header X-Proxy-Cache $upstream_cache_status;
    
                proxy_pass  https://138.201.87.123;
                proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
                proxy_cache_use_stale updating error timeout http_500 http_502 http_503 http_504;
                proxy_cache_lock on;
                proxy_set_header        Host            $host;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_hide_header      Upgrade;
                proxy_buffering on;
                proxy_connect_timeout       600;
                proxy_send_timeout          600;
                proxy_read_timeout          600;
                send_timeout                600;
                client_max_body_size 64M;
        }
    }
    

    Embora isso possa ser uma resposta porque resolve o problema, não entendo por que funciona (ou, mais precisamente, por que a configuração anterior não funcionou), então não vou aceitar minha própria resposta.

    Talvez alguém possa identificar a diferença específica nas duas configurações que fazem o cache funcionar: essa seria uma resposta aceitável.

    • 1
  3. Mario Olivio Flores
    2018-12-07T05:56:11+08:002018-12-07T05:56:11+08:00

    Tivemos um problema semelhante. Estávamos usando o nginx como um cache de proxy para um bucket s3 (para que pudéssemos oferecer suporte à lista de permissões de IP). Percebemos que não estávamos fornecendo um endpoint https, embora nosso proxy estivesse servindo em https. Parece que o nginx não gostou disso. Uma vez que mudamos de httppara https, sem problemas.

    • 1

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve