/ / Codeigniter: conflitto di vernice e cookie / sessione - php, sessione, cache, vernice

Codeigniter: conflitto di vernice e cookie / sessione - php, session, caching, varnish

Ho un sito Web che dipende dalla sessione e dai cookie. Voglio implementare la cache di Varnish su di essa.

  1. Quando il browser è aperto, il sito Web ha lo stesso ID sessione, fino alla chiusura del browser. Ma il ETÀ il valore nell'intestazione rimane 0 . Questo valore AGE descrive se la vernice sta memorizzando nella cache la pagina o meno. 0 significa che non è memorizzato nella cache.

  2. Per verificare che la memorizzazione nella cache di Varnish funzioni o meno, curl -I domainname è il comando, ho colpito questo tramite il terminale, l'intestazione dà diverso PHPSESSIONID su ogni HIT e anche il valore di AGE rimane 0.

Non è possibile determinare esattamente come in ciò che non consente al sito di essere memorizzato nella cache da Varnish.

Solo per provare io commented the session_start(), e qui ci sono le seguenti osservazioni. Sul browser

  1. Il cookie ID sessione non è stato creato nel browser.
  2. L'età è rimasta ancora 0 per diversi risultati nella stessa pagina.

Sul terminale

  1. L'ID sessione php non è stato mostrato nella risposta dell'intestazione.
  2. Il valore dell'età era 0 al primo colpo, ma ai colpi successivi continuava a ottenere un valore numerico incrementale.

Sembra che Varnish non riesca a memorizzare nella cache gli accessi al browser. Specialmente quando viene specificato il dominio.

Qualsiasi aiuto Come far funzionare la cache di vernice per il sito Web basato sulla sessione?

risposte:

0 per risposta № 1

Varnish non memorizza nella cache le pagine che impostano i cookie per impostazione predefinita. Esistono due modi per aggirare questo problema:

  1. Rimuovi i cookie dalla pagina. Questo funzionerà solo per te se la pagina non richiede una sessione in primo luogo (cioè non ha contenuti specifici dell'utente). Puoi farlo in questo modo:

    // ... default.vcl
    sub vcl_recv {
    unset req.http.Cookie;
    
    return(hash);
    }
    
  2. Aggiungi il cookie all'hash generato da Varnish,il che significa che ogni sessione avrà la propria cache individuale (ne trarranno comunque vantaggio in termini di prestazioni, ma in nessun modo così significativamente come se si potesse andare per l'opzione 1. In questo modo:

    // ... default.vcl
    sub vcl_hash {
    hash_data(req.url);
    
    if (req.http.host) {
    hash_data(req.http.host);
    } else {
    hash_data(server.ip);
    }
    
    hash_data(req.http.Cookie);
    
    return(lookup);
    }
    

Potresti avere alcune pagine che sembrano non averecontenuti specifici dell'utente su (come dire che hai un blog, i post sul blog non avrebbero bisogno di contenuti specifici dell'utente) ma potresti avere qualcosa che indica se l'utente ha effettuato l'accesso o meno. Se riesci a farlo accadere su AJAX a un endpoint memorizzato nella cache o per sessione quindi tutto funzionerà correttamente.

Con l'opzione 2, potresti trovare la necessità di memorizzare temporaneamente il Cookie in un'altra intestazione in modo che Varnish memorizzi effettivamente la pagina nella cache, puoi farlo in questo modo:

// ... default.vcl
sub vcl_recv {
set req.http.X-Cookie = req.http.Cookie;
unset req.http.Cookie;

return(hash);
}

Quindi modifica semplicemente il vcl_hash funzione da usare req.http.X-Cookie invece di req.http.Cookie.