Kako keširati sadržaj u NGINX-u


NGINX je konsolidovani open-source web server visokih performansi koji ubrzava isporuku sadržaja i aplikacija, poboljšava sigurnost i poboljšava skalabilnost. Jedan od najčešćih slučajeva upotrebe Nginxa je Keširanje sadržaja, što je najefikasniji način za poboljšanje performansi web stranice.

Pročitajte također: 10 najboljih alata za keširanje otvorenog koda za Linux

Možete koristiti NGINX da ubrzate lokalne izvorne servere tako što ćete ga konfigurirati za keširanje odgovora uzvodnih servera i također za kreiranje rubnih servera za mreže za isporuku sadržaja (CDN-ovi). NGINX pokreće neke od najvećih CDN-ova.

Kada je konfigurisan kao keš memorija, NGINX će:

  • keširajte statički i dinamički sadržaj.
  • poboljšati performanse dinamičkog sadržaja uz mikro-keširanje.
  • posluživati zastarjeli sadržaj uz ponovnu provjeru valjanosti u pozadini za bolje performanse.
  • nadjačati ili postaviti Cache-Control zaglavlja i još mnogo toga.

U ovom članku ćete naučiti kako konfigurirati NGINX kao Keširanje sadržaja u Linuxu kako bi vaši web serveri radili što je moguće efikasnije.

Preduvjeti:

Trebali biste imati NGINX instaliran na vašem Linux serveru, ako ne slijedite ove vodiče za instalaciju Nginxa:

  • Kako instalirati Nginx na CentOS 8
  • Kako instalirati Nginx na CentOS 7

Keširajte statički sadržaj na Nginxu

Statički sadržaj je sadržaj web stranice koji ostaje isti (ne mijenja se) na svim stranicama. Primjeri statičkog sadržaja uključuju datoteke kao što su slike, video zapisi, dokumenti; CSS datoteke i JavaScript datoteke.

Ako vaša web stranica koristi mnogo statičkog sadržaja, tada možete optimizirati njezine performanse tako što ćete omogućiti keširanje na strani klijenta gdje pretraživač pohranjuje kopije statičkog sadržaja radi bržeg pristupa.

Sljedeći primjer konfiguracije je dobar, samo zamijenite www.example.com URL-om imena vaše web stranice i izvršite izmjene na drugim nazivima putanja prema potrebi.

server {
    # substitute your web server's URL for www.example.com
    server_name www.example.com;
    root /var/www/example.com/htdocs;
    index index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ .php$ {
        try_files $uri =404;
        include fastcgi_params;
        # substitute the socket, or address and port, of your WordPress server
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        #fastcgi_pass 127.0.0.1:9000;
 	}   

    location ~* .(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg
                  |jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid
                  |midi|wav|bmp|rtf)$ {
        expires max;
        log_not_found off;
        access_log off;
    }
}

Keširanje dinamičkog sadržaja na Nginxu

NGINX koristi trajni keš disk koji se nalazi negdje u lokalnom sistemu datoteka. Dakle, počnite kreiranjem lokalnog direktorija diska za pohranjivanje keširanog sadržaja.
# mkdir -p /var/cache/nginx

Zatim postavite odgovarajuće vlasništvo na direktorij keša. Trebao bi biti u vlasništvu korisnika NGINX (nginx) i grupe (nginx) kako slijedi.

chown nginx:nginx /var/cache/nginx

Sada nastavite dalje da vidite kako omogućiti dinamički sadržaj na Nginxu u donjem odjeljku.

Omogućavanje FastCGI keša u NGINX-u

FastCGI (ili FCGI) je široko korišćen protokol za povezivanje interaktivnih aplikacija kao što je PHP sa web serverima kao što je NGINX jako>. To je proširenje CGI (Common Gateway Interface).

Glavna prednost FCGI je da upravlja višestrukim CGI zahtjevima u jednom procesu. Bez toga, web server mora otvoriti novi proces (koji se mora kontrolirati, obraditi zahtjev i zatvoriti) za svaki zahtjev klijenta za uslugu.

Za obradu PHP skripti u LEMP stack implementaciji, NGINX koristi FPM (FastCGI Process Manager) ili PHP-FPM, popularna alternativna PHP FastCGI implementacija. Jednom kada je pokrenut proces PHP-FPM, NGINX je konfigurisan za proxy zahtjeve za obradu. Stoga se NGINX također može konfigurirati da kešira odgovore sa PHP-FPM servera pozadinskih aplikacija.

Pod NGINX, predmemorija sadržaja FastCGI je deklarirana korištenjem direktive koja se zove fastcgi_cache_path u http{} najvišeg nivoa kontekstu, unutar NGINX konfiguracijske strukture. Također možete dodati fastcgi_cache_key koji definira ključ (identifikator zahtjeva) za keširanje.

Osim toga, da biste pročitali status uzvodne keš memorije, dodajte add_header X-Cache-Status direktivu unutar http{} konteksta – ovo je korisno za potrebe otklanjanja grešaka.

Pod pretpostavkom da se konfiguracijski fajl bloka servera vaše web lokacije nalazi na /etc/nginx/conf.d/testapp.conf ili /etc/nginx/sites-available/testapp.conf ( pod Ubuntu i njegovim derivatima), otvorite datoteku za uređivanje i dodajte sljedeće redove na vrh datoteke.

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHEZONE:10m; inactive=60m max_size=40m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
add_header X-Cache $upstream_cache_status;

Direktiva fastcgi_cache_path specificira broj parametara koji su:

  • /var/cache/nginx – put do direktorija lokalnog diska za keš memoriju.
  • nivoi – definira nivoe hijerarhije keša, postavlja hijerarhiju direktorija na dva nivoa pod /var/cache/nginx.
  • keys_zone (name:size) – omogućava kreiranje zajedničke memorijske zone u kojoj se pohranjuju svi aktivni ključevi i informacije o podacima (meta). Imajte na umu da pohranjivanje ključeva u memoriju ubrzava proces provjere, tako što olakšava NGINX-u da odredi da li je PROPUŠTEN ili HIT, bez provjere statusa na disku.
  • neaktivan – određuje količinu vremena nakon kojeg se keširani podaci kojima se nije pristupilo tokom navedenog vremena brišu iz keša bez obzira na njihovu svježinu. Vrijednost 60m u našem primjeru konfiguracije znači da će datoteke kojima se nije pristupilo nakon 60 biti uklonjene iz keša.
  • max_size – specificira maksimalnu veličinu keš memorije. Ovdje možete koristiti više parametara (pročitajte NGINX dokumentaciju za više informacija).

Varijable u fastcgi_cache_key direktivi su opisane u nastavku.

NGINX ih koristi u izračunavanju ključa (identifikatora) zahtjeva. Važno je da za slanje keširanog odgovora klijentu, zahtjev mora imati isti ključ kao i keširani odgovor.

  • $scheme – šema zahtjeva, HTTP ili HTTPS.
  • $request_method – metoda zahtjeva, obično “GET ” ili “POST”.
  • $host – ovo može biti ime hosta iz reda zahtjeva, ili ime hosta iz polja zaglavlja zahtjeva “Host ” ili ime servera koje odgovara zahtjevu, po redoslijedu .
  • $request_uri – znači puni originalni URI zahtjeva (sa argumentima).

Također, varijabla $upstream_cache_status u add_header X-Cache-Status direktivi se izračunava za svaki zahtjev na koji NGINX odgovori, bilo da je MISS > (odgovor nije pronađen u keš memoriji, dobijen sa servera aplikacija) ili HIT (odgovor serviran iz keša) ili bilo koja od drugih podržanih vrijednosti.

Zatim, unutar location direktive koja prosljeđuje PHP zahtjeve na PHP-FPM, koristi fastcgi_cache direktive za aktiviranje keš memorije koju ste upravo definirali gore.

Također postavite vrijeme keširanja za različite odgovore koristeći fastcgi_cache_valid direktivu kao što je prikazano.

fastcgi_cache CACHEZONE;
fastcgi_cache_valid  60m;

Ako je navedeno samo vrijeme keširanja kao u našem slučaju, samo 200, 301 i 302 odgovori se keširaju. Ali također možete eksplicitno specificirati odgovore ili koristiti bilo koji (za bilo koji kod odgovora):

fastcgi_cache CACHEZONE;
fastcgi_cache_valid 200  301 203 60m;
fastcgi_cache_valid 404 10m;
OR
fastcgi_cache CACHEZONE;
fastcgi_cache_valid  any 10m;

Fino podešavanje performansi FastCGI keširanja na Nginxu

Da postavite minimalni broj puta da se zahtjev sa istim ključem mora napraviti prije nego što se odgovor kešira, uključite fastcgi_cache_min_uses direktivu, bilo u http{} ili server{} ili lokacija{} kontekst.

fastcgi_cache_min_uses  3

Da omogućite ponovnu validaciju isteklih stavki predmemorije koristeći uslovne zahtjeve sa poljima zaglavlja “If-Modified-Since” i “If-None-Match”, dodajte fastcgi_cache_revalidate direktiva, unutar http{} ili server{} ili location{} konteksta.

fastcgi_cache_revalidate on;

Također možete uputiti NGINX da isporuči keširani sadržaj kada izvorni ili FCGI server ne radi, koristeći proxy_cache_use_stale direktivu, unutar direktive lokacije.

Ovaj primjer konfiguracije znači da kada NGINX primi grešku, vremensko ograničenje i bilo koju od navedenih grešaka od uzvodnog servera i ima zastarjelu verziju tražene datoteke u keširanom sadržaju, isporučuje zastarjeli fajl.

proxy_cache_use_stale error timeout http_500;

Još jedna korisna direktiva za fino podešavanje performansi FCGI keširanja je fastcgi_cache_background_update koja radi u sprezi sa proxy_cache_use_stale direktivom. Kada je postavljeno na uključeno, daje instrukcije NGINX-u da posluži zastarjeli sadržaj kada klijenti zatraže datoteku koja je istekla ili je u procesu ažuriranja sa uzvodnog servera.

fastcgi_cache_background_update on;

fastcgi_cache_lock je također koristan za fino podešavanje performansi predmemorije jer ako više klijenata zatraži isti sadržaj koji nije u keš memoriji, NGINX će proslijediti samo prvi zahtjev uzvodnom serveru, keširati odgovor zatim služi drugim zahtjevima klijenta iz keša.

fastcgi_cache_lock on;

Nakon što izvršite sve gore navedene promjene u NGINX konfiguracijskoj datoteci, sačuvajte je i zatvorite. Zatim provjerite konfiguracijsku strukturu za bilo kakve sintaksičke greške prije ponovnog pokretanja NGINX usluge.

nginx -t
systemctl restart nginx

Zatim testirajte da li keš ispravno funkcionira, pokušajte pristupiti vašoj web aplikaciji ili web-lokaciji pomoću sljedeće curl komande (prvi put bi trebao ukazivati na MISS, ali sljedeći zahtjevi bi trebali ukazati na HIT kao što je prikazano na snimku ekrana).

curl -I http://testapp.linux-console.net

Evo još jednog snimka ekrana koji prikazuje kako NGINX servira zastarjele podatke.

Dodavanje izuzetaka u zaobilaznu keš memoriju

Moguće je postaviti uslove pod kojima NGINX ne bi trebao slati keširane odgovore klijentima, koristeći fastcgi_cache_bypass direktivu. I da biste uputili NGINX da uopće ne kešira odgovore od upstream servera, koristite fastcgi_no_cache.

Na primjer, ako želite da POST zahtjevi i URL-ovi sa nizom upita uvijek idu u PHP. Prvo, deklarirajte if naredbu da biste postavili uvjet na sljedeći način.

set $skip_cache 0; 
if ($request_method = POST) { 
	set $skip_cache 1; 
} 

Zatim aktivirajte gornji izuzetak u location direktivi koja prosljeđuje PHP zahtjeve na PHP-FPM, koristeći fastcgi_cache_bypass i fastcgi_no_cache direktive.

 
fastcgi_cache_bypass $skip_cache; 
fastcgi_no_cache $skip_cache;

Postoje mnogi drugi dijelovi vaše web stranice za koje možda ne želite omogućiti keširanje sadržaja. Slijedi primjer NGINX konfiguracije za poboljšanje performansi WordPress stranice, koji se nalazi na blogu nginx.com.

Da biste ga koristili, napravite promjene (kao što su domena, putanje, nazivi datoteka, itd.) kako biste odražavali ono što postoji u vašem okruženju.

fastcgi_cache_path /var/run/NGINX-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m; 
fastcgi_cache_key "$scheme$request_method$host$request_uri"; 
server { 
	server_name example.com www.example.com; 
	root /var/www/example.com; 
	index index.php; 
	access_log /var/log/NGINX/example.com.access.log; 
	error_log /var/log/NGINX/example.com.error.log; 
	set $skip_cache 0; 
	# POST requests and URLs with a query string should always go to PHP 	
	if ($request_method = POST) { 
		set $skip_cache 1; 
	} 
	if ($query_string != "") {
		set $skip_cache 1; 
	} 
	# Don't cache URIs containing the following segments 
	if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php |sitemap(_index)?.xml") { 
		set $skip_cache 1; 
	} 
	# Don't use the cache for logged-in users or recent commenters 
	if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass |wordpress_no_cache|wordpress_logged_in") {
		set $skip_cache 1; 
	} 
	location / { 
		try_files $uri $uri/ /index.php?$args; 
	} 
	location ~ .php$ { 
		try_files $uri /index.php; 
		include fastcgi_params; 
		fastcgi_pass unix:/var/run/php5-fpm.sock; 
		fastcgi_cache_bypass $skip_cache; 
		fastcgi_no_cache $skip_cache; 
		fastcgi_cache WORDPRESS; 
		fastcgi_cache_valid 60m; 
	} 
	location ~ /purge(/.*) {
		fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1"; 
	} 
	location ~* ^.+.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg |gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi |wav|bmp|rtf)$ { 
		access_log off; 
		log_not_found off; 
		expires max; 
	} 
	location = /robots.txt { 
		access_log off; 
		log_not_found off; 
	}
	location ~ /. { 
		deny all; 
		access_log off; 
		log_not_found off; 
	} 
}

Omogućavanje proxy keš memorije u NGINX-u

NGINX takođe podržava keširanje odgovora sa drugih proksi servera (definisano proxy_pass direktivom). Za ovaj test slučaj koristimo NGINX kao obrnuti proxy za Node.js web aplikaciju, tako da ćemo omogućiti NGINX kao keš za Node.js aplikaciju. Sve konfiguracijske direktive koje se ovdje koriste imaju slična značenja kao FastCGI direktive u prethodnom dijelu, tako da ih nećemo ponovo objašnjavati.

Da biste omogućili keširanje odgovora sa proksi servera, uključite proxy_cache_path direktivu u kontekst najvišeg nivoa http{}. Da navedete kako se zahtjevi keširaju, također možete dodati proxy_cache_key direktivu kako slijedi.

proxy_cache_path /var/cache/nginx app1 keys_zone=PROXYCACHE:100m inactive=60m max_size=500m;
proxy_cache_key  "$scheme$request_method$host$request_uri";
add_header X-Cache-Status $upstream_cache_status;
proxy_cache_min_uses 3;

Zatim aktivirajte predmemoriju u direktivi lokacije.

location / {
	proxy_pass http://127.0.0.1:3000;
	proxy_cache        PROXYCACHE;
	proxy_cache_valid 200 302 10m;
	proxy_cache_valid 404      1m;
}

Da biste definirali uvjete pod kojima NGINX ne šalje keširani sadržaj i uopće ne kešira odgovor od upstream servera, uključite proxy_cache_bypass i proxy_no_cache.

 
proxy_cache_bypass  $cookie_nocache $arg_nocache$arg_comment;
proxy_no_cache        $http_pragma $http_authorization;

Fino podešavanje performansi proxy keša

Sljedeće direktive su korisne za fino podešavanje performansi proxy keša. One također imaju isto značenje kao i FastCGI direktive.

proxy_cache_min_uses 3;
proxy_cache_revalidate on;
proxy_cache_use_stale error timeout updating http_500;
proxy_cache_background_update on;
proxy_cache_lock on;

Za više informacija i direktive konfiguracije keširanja, pogledajte dokumentaciju za dva glavna modula ngx_http_fastcgi_module i ngx_http_proxy_module.

Dodatni resursi: NGINX keširanje sadržaja i savjeti za poboljšanje performansi WordPress-a.