internetul Windows. Android

Configurarea cache-ului static folosind Nginx în Debian. Configurarea compresiei și cache-ului pe găzduirea cu anteturile HTTP Nginx și Apache HTTP pe serverul Nginx

Antetul HTTP expiră împreună cu mai multe titluri, cum ar fi cache-controlul, vă permite să gestionați cache-ul, raportați astfel cât timp va fi relevant conținutul solicitat. După expirarea "duratei de viață", memoria cache încetează să mai fie relevantă și este necesar să solicitați resurse originale să afle dacă au fost modificări în conținut. Antetul expirărilor este o poziție standard reglementată în protocolul HTTP și este susținut de aproape orice cache. În ceea ce privește antetul de control al cache-ului, acesta a fost introdus în http / 1.1, permițându-vă astfel să furnizați posibilitatea de a efectua un control mai mare asupra conținutului, precum și rezolvarea limitărilor asociate expirării. Pentru a utiliza controlul cache-ului în mod eficient, se recomandă să se indice momentul după care cache-ul încetează să fie relevant.

În acest post, considerăm exemple de stabilire a parametrului expirat în Nginx. În primul rând, să încercăm să setăm perioada maximă de stocare a cache-ului posibil în setări.
Pune cache-ul pentru timpul maxim

Server (... locație ~ * ^. + \\. (JPG | GIF | PNG) $ (expiră max;) ...)

O valoare frecventă de timp de cache poate fi specificată în zile, să presupunem că în setările trebuie să setăm 7 zile, să arate că aceasta va fi după cum urmează.
Pune cache-ul timp de o săptămână

Server (... locație ~ * ^. + \\. (JPG | GIF | PNG) $ (expiră 7d;) ...)

Astfel, browserul după prima solicitare a fișierelor le va cere din nou numai după 7 zile. Tot acest lucru vor fi în memoria cache a browserului utilizatorului. Există, de asemenea, posibilitatea de a număra timpul de viață al memoriei cache din momentul în care ultimul fișier se schimbă.
Pune cache-ul din momentul în care ultimul fișier se schimbă

Server (... locație ~ * ^. + \\. (JPG | GIF | PNG) $ (expiră modificat 3d;) ...)

Folosind această metodă, ca rezultat, primim timpul cache-ului, care va depinde de data ultimei modificări a fișierului. De la ultima modificare, browserul va solicita un fișier după 3 zile. Pentru anumite sarcini, o astfel de metodă de caching poate fi mai convenabilă.
De asemenea, puteți dezactiva cache-ul fișierelor de browser, pentru a face acest lucru setați valoarea parametrului în Oprit.
Dezactivați cache-ul fișierului în browser

Server (... Locație ~ * ^. + \\. (JPG | GIF | PNG) $ (expiră off;) ...)

Valoarea specificată în acest mod dezactivează complet acțiunea de control al cache-ului. Folosind caching-ul, partea clientului evită nevoia de a descărca întregul conținut, deoarece Are deja copii locale ale fișierelor. Pentru a seta timpul caching-ului, este necesar să fiți în mod semnificativ, fără prea multă fanatism, cache foarte lungă poate fi întotdeauna rațională, dacă datele pe care le schimbați destul de dinamic.

Caching (cache) este o tehnologie sau un proces de creare a unei copii a datelor privind transportatorii de informații rapide (memoria cache, numerar). Pur și simplu punerea și aplicarea realităților clădirilor site-ului, aceasta poate fi crearea unei copii HTML statice a paginii sau a unei părți a acestuia, care este generată utilizând script-uri PHP (sau altul, cumva Perl, ASP.NET), în funcție de În ce limbă este scrisă de site-ul CMS) și stocată pe disc, în memoria RAM sau chiar parțial în browser (luați în considerare mai multe detalii mai jos). Când pagina este solicitată de la client (browser), în loc să o colecteze cu scripturi, browserul va primi copia ei gata, care este mult mai economică cu privire la costurile de găzduire a resurselor și mai rapide, pe măsură ce treceți pagina finalizată durează mai puțin timp (uneori semnificativ mai puțin), cum să-l creați din nou.

De ce să folosiți cache-ul pe site

  • Pentru a reduce sarcina la găzduire
  • Pentru a recupera rapid conținutul site-ului browserului

Ambele argumente, cred că nu au nevoie în comentarii.

Dezavantaje și efectul negativ al cache-ului site-ului

Destul de ciudat, caching-ul site-ului are propriile minusuri. În primul rând, se referă la site-uri, conținutul care se schimbă dinamic atunci când interacționează cu acesta. Adesea, acestea sunt site-uri care dau conținutul sau o parte din acesta folosind AJAX. În general, Ajax caching este, de asemenea, posibil și chiar necesar, dar acesta este un subiect pentru o conversație separată și nu se referă la tehnologiile utilizate în mod tradițional care vor fi discutate în continuare.
De asemenea, pot apărea probleme de la utilizatorii înregistrați pentru care memoria cache permanentă poate deveni o problemă atunci când interacționează cu elementele site-ului. Aici, ca regulă, cache-ul este oprit sau cache-ul obiectului elementelor individuale ale site-ului este utilizat: widget-uri, meniuri și altele asemenea.

Cum să configurați cache-ul pe site-ul dvs.

Pentru a începe, este necesar să se înțeleagă ce tehnologii sunt utilizate în mod tradițional pentru a cache a conținutului site-urilor.
Toate căile posibile pot fi împărțite în 3 grupe.

Server caching.

Cache cu nginx.

Caching Htache (Apache)

Dacă aveți acces numai la k.htaccess, iar serverul de lucru este numai Apache, atunci puteți utiliza astfel de aplicații ca compresie GZIP și expiră anteturile pentru a utiliza o memorie cache de browser.

Porniți compresia GZIP pentru tipurile de fișiere de MIME corespunzătoare

Addoutfilterbytype de defilare text / text simplu / html addoutputfilterbytype de defilare text / css addoutputfilterbytype text / javascript aplicație / javascript addoutputfilterbytype defilare text / xml aplicație / aplicație Xml / RSS + xml addoutputfilterbytype defilare aplicație / json addoutputfilterbytype Deflaționați aplicația / aplicația VND.MS-Fontokject / x-font-ttf font / opentype imagine / svg + xml imagine / x-pictograma

Pornirea expirărilor de anteturi pentru fișiere statice pentru o perioadă de 1 an (365 de zile)

Expirezativ pe expireSdefault "Access Plus 365 de zile"

Caching memcached

Caching folosind acceleratorul PHP

Dacă motorul motorului este scris în PHP, apoi cu fiecare descărcare a oricărei pagini a site-ului, scripturile PHP sunt executate: Interpretul codului citește scripturile scrise de programator, generează un cod de byte, o mașină clară, o execută și o execută dă rezultatul. Acceleratorul PHP vă permite să excludeți generarea permanentă a codcode-ului, cachează codul compilat în memorie sau pe disc, crescând astfel productivitatea și reducerea timpului petrecut de PHP. De la acceleratoarele acceptate astăzi există:

  • Extensia cache ferestre pentru PHP
  • Xcache.
  • Zend Opcache.

În versiunea PHP 5.5 și deasupra acceleratorului este deja construit în Zend Opcache.Prin urmare, pentru a activa acceleratorul, doar actualizați versiunea PHP

Caching-ul site-ului

De regulă, înseamnă posibilitatea ca site-ul CMS să creeze copii HTML statice ale paginilor. Majoritatea motoarelor și a cadrelor populare posedă o astfel de oportunitate. Personal, am lucrat cu Smarty, Wordpress, așa că pot să vă asigur că se confruntă perfect cu munca lor. În cuvântul original din cutie nu există capabilități de caching pe care aveți nevoie de niciun proiect puțin încărcat, dar există multe plug-in-uri populare pentru cache:

  1. care se angajează doar în generarea de pagini statice ale site-ului;
  2. Hyper cache, care, în esență, funcționează la fel ca și pluginul anterior;
  3. DB cache. Esența lucrării este de a acoperi interogări la baza de date. De asemenea, o caracteristică foarte utilă. Pot fi utilizate într-un pachet cu două plug-uri anterioare;
  4. W3 Total cache. A lăsat-o pentru desert, acesta este pluginul meu preferat în WordPress. Site-ul este transformat cu acesta, întorcându-se de la un autobuz dur la o mașină de curse. Avantajul său imens este un set imens de caracteristici, cum ar fi mai multe opțiuni de cache (statice, acceleratori, memcached, cereri de baze de date, cache de obiect și pagină), concatenare și miniere de cod (combinând și comprimarea fișierelor CSS, JavaScript, compresie HTML datorită eliminării spații), folosind CDN și multe altele.

Ce pot spune - utilizați CMS corecte, iar caching-ul de înaltă calitate va fi disponibil de la aproape caseta.

Keching pe partea laterală a browserului (client), anteturi de cache

Keching în browser este posibil deoarece orice browser de auto-respect vă permite și încurajează. Poate că acesta este titlurile HTTP pe care serverul le oferă clientului, și anume:

  • Expiră;
  • Cache-control: varsta max;
  • Modificat ultima dată;
  • Etag.

Datorită acestora, utilizatorii care intră în repetate rânduri, petrec extrem de puțin timp pentru a descărca pagini. Anteturile de cache trebuie să fie aplicate la toate resursele statice memorate: fișiere șablon, imagini, fișiere JavaScript și CSS, dacă există, PDF, audio și video și așa mai departe.
Se recomandă stabilirea titlurilor astfel încât etapele să fie stocate timp de cel puțin o săptămână și nu mai mult de un an, cel mai bun an.

Expiră.

Antetul expirărilor este responsabil pentru cât timp cache-ul este relevant, iar browserul poate utiliza resursele cache fără a solicita noua lor versiune de la server. Este puternic și extrem de de dorit să se folosească, deoarece acționează în mod necesar. Titlul este recomandat să indice perioada din săptămâna la un an. Mai mult de un an este mai bine să nu indicați că aceasta este o încălcare a regulilor RFC.

De exemplu, pentru a configura expirarea în Nginx pentru toate fișierele statice pe an (365 de zile), codul din fișierul de configurare Nginx trebuie să fie prezent.

Locație ~ * ^. + \\. (JPEG | JPEG | GIF | PNG | SVG | JS | CSS | MP3 | Ogg | MPE? G | AVI | ZIP | GZ | BZ2 RAR | SWF) $ (expiră 365d;)

Cache-control: varsta max;

Cache-control: Max-vârsta este responsabil pentru același lucru.
Mai preferabil, utilizarea expiră decât controlul cache-ului datorită unei prevalențe mai mari. Cu toate acestea, dacă expirarea și controlul cache-ului vor fi prezente în titluri în același timp, se va acorda prioritate controlului cache-ului.

În nginx. Cache-control se transformă în același mod ca și Expiră., Directiva expiră: 365d;

Ultima modificare și etag

Aceste titluri funcționează pe principiul imprimărilor digitale. Aceasta înseamnă că pentru fiecare adresă URL din Keshe va fi instalată propriul ID unic. Modificat ultima dată. Creează-o pe baza ultimei schimbări. Titlu Etag. Utilizează orice identificator unic de resurse (cel mai adesea este o versiune a fișierului sau a unui conținut hash). Modificat ulterior este un titlu "slab", deoarece browserul utilizează algoritmi eurouri pentru a determina dacă să solicite un element din memoria cache.

În Nginx pentru fișierele statice Etag. și Modificat ultima dată. Inclusă în mod implicit. Pentru paginile dinamice, acestea sunt fie mai bine să nu indice, fie acest lucru ar trebui să facă un script care generează o pagină sau ceea ce este mai bine să utilizați o memorie cache configurată corespunzător, atunci Nginx va avea grijă de titluri. De exemplu, pentru WordPress, puteți profita de.

Aceste titluri permit browserului să actualizeze eficient resursele cache, trimițând solicitări de câte ori utilizatorul repornește în mod explicit pagina. Obțineți interogări condiționate Nu returnați un răspuns complet dacă resursa nu sa schimbat pe server și, astfel, furnizează o întârziere mai mică decât cererile complete, reducând astfel sarcina de găzduire și reducerea timpului de răspuns.

Utilizarea simultană a expirărilor și controlului cache-ului: Vârsta MAX este redundantă, la fel ca utilizarea simultană a ultimului modificat și ETAG. Utilizați expirarea + etag sau expirați + ultimul mod în legătură.

Activați compresia GZIP pentru fișierele statice

Desigur, compresia GZIP nu se aplică cache-ului ca atare direct, totuși, traficul este foarte salvat și mărește viteza de descărcare a paginilor.

Cum să activați GZIP pentru serverul static (.... gzip on; gzip_dizable "; gzip_ypes text / simplu text / aplicație CSS / aplicație xml / xml + RSS text / javascript aplicație / javascript;) Cum să activați GZIP pentru statică pentru a permite compresia GZIP V.HTACCESS, trebuie să introduceți următorul cod la începutul fișierului: Text AddOutputFilterByType dezumfle / plain AddOutputFilterByType dezumfla text / html AddOutputFilterByType dezumfla text / XML AddOutputFilterByType dezumfla text / css AddOutputFilterByType dezumfla application / xml aplicație AddOutputFilterByType dezumfle / xhtml + xml AddOutputFilterByType aplicație dezumfle / RSS + xml AddOutputFilterByType dezumfle cerere / javascript AddOutputFilterByType dezumfla application / X- JavaScript.

Pe site-urile nu prea încărcate, datorită cache-ului și pre-compresiei browserului, este posibil să faceți fără plug-in-uri de cache. Cu toate acestea, în acest post există directive care sunt relevante numai pentru găzduirea pe care funcționează serverul Apache HTTP. Unii pensii pentru salvarea resurselor de servere sunt dezactivate Apache sau nu îl instalați deloc, preferând să configureze doar un server Web mai puțin voasic Nginx. Să vedem cum puteți configura compresia avansată și cache-ul browserului dacă numai Nginx funcționează pe găzduirea dvs.

1. Pre-compresie
Înainte de a da conținutul paginilor în browserul vizitatorului, îl puteți comprima. Compresia reduce dimensiunea fișierelor transmise (uneori de mai multe ori), ceea ce duce la o creștere a vitezei de încărcare a paginii și reduce traficul de ieșire. Trebuie doar să comprimați fișiere care conțin text text, HTML, PHP, JS, XML și alte similare. Textul este bine comprimat, chiar și cu un nivel scăzut de compresie, volumul falămelor transmise scade cu 50-80%. Desigur, fișierele sunt mici, doar zeci de kilobyte, dar dacă considerați că există mii de astfel de faali și sunt încărcate cu mii de vizitatori în fiecare zi, atunci cum spun ei, cu lumea pe un fir - un guler , economiile se dovedesc a fi semnificative.

1-1. Pre-compresie / Apache
Pentru cei care au Apache, trebuie să aflați de la gazdă, ce module speciale care implementează sunt instalate - mod_pagespeed sau mod_defilat? De obicei în apache 2x instalați mod_defilat. Există încă mod_gzip, dar a fost instalat în versiunile anterioare, deci este puțin probabil să-l întâlnească.

Dacă modulul MOD_PageSpeed \u200b\u200beste instalat, atunci în FILE.HTACCESS, care este în rădăcina site-ului dvs., trebuie să introduceți:


MODPAGESPEED ON.
# Folosind comenzi, filme etc.

Dacă modulul mod_deflat este instalat, atunci în FILE.HTACCESS, care este în rădăcina site-ului dvs., trebuie să introduceți:


Addoutputfilterbytype Deflați text / html Text / simplu text / aplicație xml / aplicație XHTML + xml text / css text / aplicație javascript / aplicație javascript / x-javascript


În acest caz, toate fișierele text sunt expuse la compresie - TXT, HTML, XML, XHTML, CSS, JS.

Sau în httpd.conf. Situat în / usr / local / ETS / Apache22 /:


Addoutputfilterbytype defilare aplicație / javascript
Addoutputfilterbytype defilare aplicație / x-javascript
Addoutputfilterbytype Deflați text / javascript
AddoutFinterByType Deflați text / css

BrowserMatch ^ Mozilla / 4 Gzip-Doar-Text / HTML
BrowserMatch ^ Mozilla / 4 \\ .0 No-gzip
BrowserMatch \\ BMSIE! No-gzip! Gzip-numai-text / HTML


După care aveți nevoie pentru a reporni Apache

/usr/local/etc/rc.d/apache22 reporniți.

1-2. Pre-compresie / nginx
Dacă găzduirea se execută sub Nginx, directivele vor arăta diferite. La File.htaccess, care este în rădăcina site-ului dvs., trebuie să introduceți:

server (
Gzip pe;
Gzip_types text / html text / css / x-javascript text / text simplu / imagine xml / x-pictograma;
}

1-3. Pre-compresie / script
Se întâmplă că serverul care asigură funcționarea blogului dvs. nu acceptă mod_defilat sau mod_gzip. În acest caz, puteți recurge la un script universal care funcționează pe Apache și pe Nginx.

În fișierul principal pe care l-ați utilizat de către motor, la început, prima linie pe care trebuie să o introduceți:

funcție iscientsupportgzip () ()
dacă (header_sent () || conexiune_aborted ()) returnează false;
dacă ("http_acept_encoding"), "gzip") \u003d\u003d\u003d fals) returnează false;
Dacă (Getenv ("http_user_agent"), "konqueror")! \u003d\u003d fals) întoarce false;
Întoarce-te adevărat;
}

Dacă (iscientsupportgzip ()) (
Ob_start ("ob_gzhandler");
}
Altfel (
Ob_start ();
}


Rezultatul tuturor acestor directive va fi faptul că browserul vizitatorului obține o versiune a paginii comprimate - îl descarcă, despachetează în fișierele de timp și se afișează în formă normală și introduceți imagini direct de pe site. Toate bruze moderne sunt capabile să utilizeze opțiunile de fișiere comprimate, iar cele care încă nu știu cum să obțină fișiere necomprimate.

2. Caching browser.
Împreună cu compresia, puteți da browserului să utilizeze copia cache. De ce descărcați fișiere de pe site de fiecare dată dacă nu s-au schimbat de la ultima vizită? Este mai bine să urmăriți modificările fișierelor și să descărcați numai cele care au fost supuse acestora, iar cele care rămân de la ultima abordare a site-ului nu sa schimbat, pentru a-și lua memoria cache. Această metodă permite reducerea semnificativă a traficului între browserul vizitatorului și găzduirea site-ului, ceea ce duce la o reducere a timpului de încărcare a paginii. Mai ales o creștere vizibilă a vitezei pe pagini cu imagini. Într-adevăr, imaginile se schimbă pe site foarte rar, iar de ce le pompează de fiecare dată, sunt deja în memoria cache a browserului?

2-1. Browser / antet de instalare / Apache
Apache oferă cache-uri de browser utilizând module mod_expires și mod_headers: mod_expires determină relevanța datelor cache și mod_headers este accesibilitatea lor publică. Colaborarea conduce la o verificare flexibilă a datelor înainte de descărcare: Browserul primește titluri speciale, determină dacă datele care se află în memoria cache sunt depășite de la ultima vizită la pagină și dacă sunt depășite, le actualizează, descărcând noi versiuni de Fișiere și, dacă nu sunt depășite, atunci afișează fișiere din memoria cache fără descărcarea de pe server.

Dacă aveți Apache, adăugați la fișier la File.htaccess pentru a instala anteturile expiră:


Expire.
ExpireSdefault "Access Plus 5 secunde"
ExpireSbyType Image / X-icon "Access Plus 2592000 secunde"
ExpireSbyType Image / JPEG "Access Plus 2592000 secunde"
ExpireSbyType Image / PNG "Access Plus 2592000 secunde"
EXPIRESBYTYPE IMAGINES / GIF "Access Plus 2592000 secunde"
ExpireSbyType Application / X-Shockwave-Flash "Access Plus 2592000 secunde"
ExpireSbyType Text / CSS "Access plus 604800 secunde"
ExpireSbyType Text / JavaScript "Access Plus 216000 secunde"
ExpireSbyType Application / JavaScript "Access Plus 216000 secunde"
ExpireSbyType Application / X-JavaScript "Access Plus 216000 secunde"
ExpireSbyType Text / HTML "Access plus 600 secunde"
ExpireSbyType Application / XHTML + XML "Access Plus 600 secunde"


În acest caz, relevanța cache-ului pentru diferite Falams este indicată în câteva secunde.

Dacă aveți Apache, pentru instalare pentru setarea antetului de control al cache-ului, adăugați la fișier.htaccess:






Antetul set de cache-control "Public"


Antetul set de cache-control "privat"


Antetul set de cache-control "privat, must-reevaluat"


În acest caz, relevanța este verificată în ICO, JPG, JPEG, PNG, GIF, SWF, CSS, JS, HTML, XHTML, PHP.

2-2. Browser Caching / Nginx
Dacă nu aveți Apache, dar există Nginx, pentru a specifica browserul pentru a lua datele Sugain, trebuie să introduceți următoarele linii în Config Nginx:

locație ~ * \\. (JPG | PNG | GIF | JPEG | css | js) $ (
Expiră 24h;
}


În acest caz, relevanța cache-ului este de 24 de ore, iar tipurile de fișiere verificate sunt listate - JPG, PNG, GIF, JPEG, CSS, JS.

Aici este actualul și toate fundațiile, de succes accelerați site-urile dvs.! ;)

Web-server și proxy-proxy Reverse sunt construite în posibilități foarte puternice de cache a răspunsurilor HTTP. Cu toate acestea, în unele cazuri, documentația și exemplele nu sunt suficiente, ca rezultat, nu totul se dovedește atât de ușor și pur și simplu așa cum aș dori. De exemplu, configurile mele sunt Nginx-și locurile sunt scrise în sânge. Acest articol voi încerca să îmbunătățesc ușor situația.

În acest articol: a) pietre subacvate în cache cu bandă completă; b) cache-ul cu rotație; c) Crearea unei ferestre dinamice într-o pagină Zashed.

Voi presupune că utilizați o grămadă de nginx + fastcgi_php. Dacă aplicați Nginx + Apache + MOD_PHP, înlocuiți doar numele directivelor cu Fastcgi_Cache * pe proxy_cache *

Dacă alegeți dacă pagina este stocată pe partea PHP sau pe partea Nginx, aleg nginx. În primul rând, vă permite să oferiți 5-10 mii de solicitări pe secundă fără dificultăți și fără conversații inteligente despre "sarcina mare". În al doilea rând, Nginx monitorizează în mod independent dimensiunea cache-ului și îl periază atât în \u200b\u200btimpul uzurii cât și când datele sunt deplasate.

Caching-ul întregii pagini este în întregime

Dacă pe site-ul dvs. pagina principală, deși este generată dinamic, dar rareori se schimbă, puteți reduce cu tărie încărcătura pe server, Schings IT în Nginx. Cu o înaltă prezență, chiar cache-ul pentru o perioadă scurtă de timp (5 minute și mai puțin) oferă deja o creștere uriașă a performanței, deoarece cache-ul funcționează foarte repede. Chiar și pagina pentru doar 30 de secunde, veți obține încă o descărcare semnificativă a serverului, salvând dinamica actualizării datelor (în multe cazuri actualizează o dată la fiecare 30 de secunde destul de suficient).

De exemplu, puteți cerceta pagina principală ca aceasta:

Fastcgi_cache_path / var / cache / nginx nivel \u003d keys_zone \u003d toatăpage: 50m; ... Server (... locație / (... rapidcgi_pass 127.0.0.1:9000; $ http_if_none_match | $ gazdă | $ necesită_uri "; # Vă garantăm că diferiți utilizatori nu vor obține aceeași sesiune cookie. Fastcgi_hide_header" set- cookie "; # forțând pagina de cache nginx în orice caz, indiferent de antetele de cache expuse în PHP. Fastcgi_ignore_headers" cache-control "" expiră ";))

Nu voi exagera foarte mult dacă spun că fiecare linie din acest config este scrisă de sânge. Există multe capcane aici, să le luăm în considerare pe toate.

fastcgi_cache_path: Debuggingul ușor este, de asemenea, important

fastcgi_cache_path / var / cache / nginx nivel \u003d keys_zone \u003d toatăpage: 50m;

În directiva FastcGi_Cache_Path, prezint o valoare "goală" pentru niveluri. Deși acest lucru reduce ușor performanța (fișierele vor fi create direct în / var / cache / nginx, fără divizarea pe directoare), dar face o ordonanță de mărime la depanarea și diagnosticarea problemelor cu cache-ul. Crede-mă, nu veți avea vremuri cu mâinile pentru a urca în / var / cache / nginx și a vedea ce este stocat acolo.

fastcgi_cache_valid: Caching codul de răspuns 304

fastcgi_cache_valid 200 301 302 304 5M;

În directiva FastcGi_Cache_valid, am forțat cache-ul nu numai codurile standard 200 OK, 301 s-au mutat permanent și 302 găsite, dar și 304 nu sunt modificate. De ce? Să ne amintim ce înseamnă 304. Se eliberează cu un corp de răspuns gol în două cazuri:

  • Dacă browserul a trimis titlul "IF-Modificat-Inceput: Data", în ce dată este mai mult sau mai egal cu răspunsul "Ultima modificare: Data". Acestea. Clientul întreabă: "Există o nouă versiune de la data datei? Dacă nu, îmi voi da 304 și voi salva traficul. Dacă există, dă-mi corpul paginii. "
  • Dacă browserul a trimis titlul "Dacă nu există-meci: hash", unde hash este găzduit cu titlul de răspuns "ETAG: Hash". Acestea. Clientul întreabă: "Versiunea curentă a paginii diferă de cea pe care am cerut-o ultima dată? Dacă nu, îmi voi da 304 și voi salva traficul. Dacă da, dați corpului paginii. "

În ambele cazuri, ultima modificare sau eTAG va fi cel mai probabil din memoria cache Nginx, iar verificarea va avea loc foarte repede. Nu este nevoie să "trageți" PHP doar astfel încât scriptul să ofere aceste titluri, în special în lumina faptului că clienții care vor părăsi răspunsul 200 vor fi date din memoria cache.

fastcgi_cache_key: Lucrați cu atenție cu dependențele

fastcgi_cache_key "$ solicitare_method | $ http_if_modified_since | $ http_if_none_match | $ gazdă | $ solicitare_uri";

O atenție deosebită merită valoarea în Directiva FastcGi_Cache_key. Am adus valoarea minimă de lucru a prezentei directive. Pasul spre dreapta, pasul la stânga și veți începe, în unele cazuri, pentru a obține date "greșite" din memoria cache. Asa de:

  • Dependență de $ solicitare_method avem nevoie, pentru că Cererile de la Internet sunt destul de frecvente. Răspunsul la adaptate la cap nu conține niciodată corpul. Dacă eliminați dependența de solicitarea $_method, atunci este posibil ca coincidența că cineva să vă ceară să întrebiți pagina cu cap de cap și apoi veți fi oferit conținutului goale.
  • Dependența de $ http_if_modified_since este nevoie astfel încât cache-ul cu răspunsul 304 care nu este modificat este dat accidental clientului, făcând cererea obișnuită. În caz contrar, clientul poate obține un răspuns gol din memoria cache.
  • La fel cu $ http_if_none_match. Trebuie să fim asigurați de la emiterea de pagini goale clienților!
  • În cele din urmă, dependența de Hoday $ și $ solicitare_uri nu necesită comentarii.
fastcgi_Hide_Header: Rezolvăm problemele de securitate

fastcgi_hide_header "set-cookie";

Directiva Fastcgi_Hide_header este foarte importantă. Fără aceasta, sunteți serios riscați Securitate: utilizatorii pot obține sesiunile altor persoane printr-o cookie de sesiune în memoria cache. (Adevărat, în cele mai recente versiuni ale Nginx, ceva a fost făcut în direcția contabilității automate a acestui factor.) Înțelegi cum se întâmplă? Vasya Pupkin a venit pe site, a fost o sesiune și sesiune cookie. Lăsați cache-ul la acel moment să se dovedească să fie gol, iar Vasin Cookie i-a fost scris. Apoi a venit un alt utilizator, a primit un răspuns din memoria cache și în ea - și cookie Vasi. Deci, și sesiunea lui.

Puteți, bineînțeles, să spuneți: Să nu sunăm la sesiune_start () pe pagina principală, atunci nu vor exista probleme cu cookie-urile. În teorie, acest lucru este așa, dar în practică această metodă este foarte instabilă. Sesiunile încep de multe ori "amânate", și suficientă parte a codului "aleatoriu" pentru a provoca o funcție care necesită acces la sesiune, deoarece obținem o gaură în siguranță. Și siguranța este un astfel de lucru care ar putea exista găuri într-o anumită metodologie prin neglijență, atunci această tehnică este considerată o "gaură" prin definiție. În plus, există și alte cookie-uri, cu excepția sesiunii; De asemenea, ei nu au nevoie să înregistreze în memoria cache.

fastcgi_ignore_headers: Nu oferim site-ul "minciună" de la încărcare atunci când tastați

fastcgi_ignore_headers "Cache-control" "expiră";

Serverul Nginx atrage atenția asupra controlului cache-ului, expiră și anteturile PRAGMA, care oferă PHP. Dacă spun că pagina nu are nevoie de cache (sau că este deja depășită), atunci Nginx nu o scrie în fișierul cache. Acest comportament, deși pare logic, în practică generează o mulțime de dificultăți. Prin urmare, îl blochează: datorită Fastcgi_ignore_headers, conținutul oricărei pagini va cădea în fișierele cache, indiferent de titlurile sale.

Care este această complexitate? Acestea sunt din nou asociate cu funcția sesiune și Session_start (), care în PHP implicit stabilește titlurile "cache-control: no-cache" și "PRAGMA: No-cache". Există trei soluții la problemă:

  • Nu utilizați sesiune_start () pe o pagină în care se presupune cache-ul. Unul din această metodă, am considerat deja mai mare: doar o mișcare neglijentă este suficientă, iar site-ul dvs. care acceptă mii de solicitări pe secundă pentru o pagină principală lipită, instantaneu "minciună" când memoria cache se oprește. Al doilea minus - Va trebui să gestionăm logica de caching în două locuri: în CONFIGUL NINX și în codul PHP. Acestea. Această logică va fi "murdară" în părți complet diferite ale sistemului.
  • Setați INI_SET ("sesiune.cache_limiter", ""). Aceasta va forța PHP să dezactiveze retragerea oricărui titlu care limitează cache-ul atunci când lucrați cu sesiuni. Problema aici este aceeași: logica "murdătoare" a cache-ului, pentru că, în mod ideal, am dori ca toate caching-ul dintr-un singur loc.
  • Ignorați anteturile de interzicere a cache-ului atunci când scrieți în fișierele cache folosind Fastcgi_ignore_headers. Se pare că aceasta este o soluție câștigătoare, așa că îl sfătuiesc.

Cache cu rotație

Pagina principală statică nu este atât de interesantă. Ce trebuie să faceți dacă există multe materiale pe site, iar principalul acționează ca un fel de "Showcase" pentru ei? Pe o astfel de "spectacol", este convenabil să se afișeze materiale "aleatoriu", astfel încât diferiți utilizatori să fi văzut diferit (și chiar un utilizator a primit un conținut nou, repornind pagina din browser).

Rezolvarea sarcinilor - cache de rotație:

  1. Forcem scenariul să producă sincer elementele paginii principale în ordine aleatorie, efectuând solicitările necesare în baza de date (lăsați-o și încet).
  2. Apoi păstrăm în memoria cache nu numai, dar, spun, 10 opțiuni de pagină.
  3. Când utilizatorul intră pe site, arătăm una dintre aceste opțiuni. În același timp, dacă memoria cache este goală, scenariul este lansat și, dacă nu, rezultatul este returnat din memoria cache.
  4. Noi stabilim o depășire a cache-ului timpului mic (de exemplu, 1 minut), astfel încât pentru cei mai mulți utilizatori diferiți "au urmărit" toate materialele site-ului.

Ca rezultat, primele 10 cereri la scriptul generatorului sunt efectuate "onest" și "încărcați" serverul. Dar atunci vor "cade" în memoria cache și într-un minut va fi emis rapid. Performanțele cresc, cu atât mai mari sunt mai mulți vizitatori de pe site.

Aici este o bucată de config nginx care implementează cache cu rotație:

Fastcgi_cache_path / var / cache / nginx nivel \u003d keys_zone \u003d toatăpage: 50m; Perl_set $ Rand "sub (return int rand 10)"; ... Server (... Locație / ... FastcGi_Pass 127.0.0.1:9000; http_if_modificat_since $ http_if_none_match | Http_if_none_match | $ http_s_uri "; # Garantăm că diferiți utilizatori nu vor obține aceeași sesiune cookie. Fastcgi_hide_header" set-cookie "; # forțând pagina de cache Nginx oricum, indiferent de # anteturi de cache prezentate în PHP. Fastcgi_ignore_headers "Cache-control" "expiră"; # forțând browser-ul pentru a reporni pagina de fiecare dată (pentru rotație). Fastcgi_hide_header "cache-control"; add_header cache-control "No-store, no-cache, must-reevaluat, post- Verificați \u003d 0, pre-check \u003d 0 "; fastcgi_hide_header" pragma "; add_header pragma" no-cache "; # proaspăt proaspăt modificat. expiră -1; Atenție !!! Această linie expiră este necesară! Add_header ultima modificare $ Sent_http_expires;))

Este posibil să observați că, în comparație cu exemplul anterior, a trebuit să adaug alte 6 directive în locație. Ele sunt foarte importante! Dar nu vom merge mai departe, luăm în considerare totul în ordine.

perl_set: Dependența Randomizatorului

perl_set $ Rand "sub (return int rand 10)";

Cu directiva Perl_set totul este simplu. Creați o variabilă atunci când utilizați Nginx va apela funcția Interpretului Perl încorporat în el. Potrivit autorului Nginx, aceasta este o operație destul de rapidă, așa că nu vom "salva pe meciuri". Variabila are o valoare aleatorie de la 0 la 9 în fiecare dintre cererile HTTP.

fastcgi_cache_key: dependența de randomizator

fastcgi_cache_key "$ Rand | $ solicitare_method | ...";

Acum amestecăm variabila randomizatorului la cheia cache. Ca rezultat, 10 cache diferite sunt obținute pe aceeași adresă URL pe care am avut nevoie. Datorită faptului că scriptul cauzat de alunecarea cache-ului dă elemente ale paginii principale în ordine aleatorie, primim 10 soiuri ale paginii principale, fiecare dintre care "trăiește" 1 minut (vezi Fastcgi_cache_valid).

add_header: opriți cu forța cache-ul browserului
Fastcgi_Hide_header "Cache-control"; Add_header cache-control "No-store, no-cache, must-reevaluat, post-check \u003d 0, pre-verificare \u003d 0"; Fastcgi_Hide_header "Pragma"; add_header pragma "no-cache";

Mai sus, am spus că Nginx este sensibil la antetele cache emise de scriptul PHP. Dacă scriptul PHP returnează antetele "Pragma: No-Cache" sau "Cache-Control: No-Store" (precum și mai mult, de exemplu, "Controlul cache-ului: nerespectarea, nu mă eliberează, aici A fost, nu am spus, a cărui pălărie "), atunci Nginx nu va salva rezultatul în fișierele cache. Mai ales pentru a suprima un astfel de comportament, folosim Fastcgi_ignore_headers (vezi mai sus).

Care este diferența dintre "PRAGMA: No-cache" din "cache-control: No-cache"? Doar pentru că PRAGMA - HTTP / 1.0 Heritage și este acum acceptată pentru compatibilitatea cu browserele vechi. HTTP / 1.1 utilizează controlul cache-ului.

Cu toate acestea, există încă o memorie cache în browser. Și, în unele cazuri, poate că browserul nu încearcă să facă o cerere către server să afișeze pagina; În schimb, el o va scoate din propria sa cache. pentru că Avem o rotație, suntem inconvenienți pentru noi: la urma urmei, de fiecare dată, introducând pagina, utilizatorul trebuie să vadă noi date. (De fapt, dacă doriți încă să evaporați o singură opțiune, puteți experimenta antetul de control al cache-ului.)

Directiva Add_Header este doar transferuri la browser un antet de interzicere a cache-ului. Ei bine, astfel încât acest titlu nu se ridică accidental, mai întâi eliminăm din răspunsul HTTP pe care am înregistrat scriptul PHP acolo (și ceea ce a fost înregistrat în cache-ul Nginx): Directiva DirectCi_Hide_header. La urma urmei, atunci când scrieți un config Nginx, nu știți că deci decide să ieșim PHP (și dacă session_start () este utilizat, definește cu precizie). Dintr-o dată, își va pune propriul antet de control al cache-ului? Apoi, vor fi două dintre ele: manșon PHP și adăugând prin add_header.

expiră și modificat ultima dată: garantăm repornirea paginii
expiră -1; # Atenție !!! Acest șir expiră este necesar! Add_header ulterior modificat $ sent_http_expires;

Un alt truc: trebuie să stabilim ultima dată modificată la ora curentă. Din păcate, nu există o variabilă în Nginx, dar apare magic, dacă specificați Directiva expiră -1.

Deși este acum (octombrie 2009) nu este documentat, Nginx creează variabile de tipul $ Sent_HTTP_XXX pentru fiecare antet de răspuns XXX, dat clientului. Folosim unul dintre ei.

De ce este atât de important să puneți acest titlu de timp curent? Totul este destul de simplu.

  1. Să ne imaginăm că PHP a emis un titlu "Ultima modificare: Some_Dat".
  2. Acest titlu va fi înregistrat în memoria cache Nginx (puteți verifica: În exemplul nostru, fișierele sunt stocate în / var / cache / nginx) și apoi trimise la browser către client.
  3. Browserul își va aminti pagina și data modificării acestuia ...
  4. ... Prin urmare, data viitoare când introduceți utilizatorul pe site în cererea HTTP va fi întrebarea de titlu ", dacă modificați-sinc: some_data".
  5. Ce va face nginx? El va primi o pagină din cache-ul său, va dezasambla titlurile ei și va compara ultima modificare cu modificarea IF, deoarece. Dacă valorile coincid (sau prima va fi mai mică decât cea de-a doua), atunci Nginx va returna răspunsul "304 care nu se modifică" cu un corp gol. Și utilizatorul nu va vedea nici o rotație: el va primi ceea ce a mai văzut deja înainte.

De fapt, o întrebare mare, deoarece browserul se comportă dacă există simultan o ultimă modificare și controlul memoriei cache-control. Va face o interogare de la o interogare modificată de când? Se pare că diferite browsere se comportă aici în moduri diferite. Experiment.

Există încă un motiv pentru a seta ultima modificare manuală. Faptul este că funcția PHP session_start () afișează cu forța antetul modificat, dar îl arată la acesta ... Timpul de schimbare al fișierului PHP, care a primit primul control. În consecință, dacă aveți pe site toate solicitările merg la același script (controlerul frontal), atunci ultima dvs. modificată va fi aproape întotdeauna egală cu momentul schimbării acestui singur script, care nu este absolut adevărat.

Dinamica "fereastră" în pagina programată

În cele din urmă, menționăm o tehnică care poate fi utilă în lumina cache-ului. Dacă doriți să împărtășiți pagina principală (sau orice altă) a site-ului, interferează cu un bloc mic, care trebuie să fie dinamic, utilizați modulul pentru a lucra cu SSI.

În acea parte a paginii care ar trebui să fie dinamică, introduceți acest "comentariu HTML":

Din punctul de vedere al cache-ului Nginx, acest comentariu este textul obișnuit. Acesta va fi salvat în fișierul cache sub forma unui comentariu. Cu toate acestea, mai târziu, când citiți memoria cache, modulul SSI Nginx va funcționa, ceea ce se va întoarce la adresa URL dinamică. Desigur, la adresa / get_user_info / trebuie să existe un handler PHP, care emite conținutul acestui bloc.

Și, în mod natural, nu uitați să activați SSI pentru această pagină sau chiar pentru întregul server:

SSI include directiva are o altă proprietate extrem de importantă. Când există mai multe astfel de directive pe pagină, atunci toate acestea încep să fie procesate în același timp, în modul paralel. Deci, dacă aveți 4 blocuri, fiecare dintre acestea este încărcat cu 200 ms, în cantitatea paginii va fi primită de utilizator după 200ms, și nu după 800.