Kako predmemorirati sadržaj u NGINX-u


NGINX je konsolidirani web poslužitelj visokih performansi otvorenog koda koji ubrzava isporuku sadržaja i aplikacija, poboljšava sigurnost i poboljšava skalabilnost. Jedan od najčešćih slučajeva upotrebe Nginxa je Content Caching, koji je najučinkovitiji način za poboljšanje performansi web stranice.

Možete koristiti NGINX za ubrzanje lokalnih poslužitelja tako što ćete ga konfigurirati za predmemoriranje odgovora s uzvodnih poslužitelja, a također i za stvaranje rubnih poslužitelja za mreže za isporuku sadržaja (CDN). NGINX pokreće neke od najvećih CDN-ova.

Kada je konfiguriran kao predmemorija, NGINX će:

  • predmemorirati statički i dinamički sadržaj.
  • poboljšati performanse dinamičkog sadržaja mikro-predmemoriranjem.
  • poslužuju zastarjeli sadržaj uz ponovnu provjeru valjanosti u pozadini radi bolje izvedbe.
  • nadjačati ili postaviti zaglavlja Cache-Control i još mnogo toga.

U ovom ćete članku naučiti kako konfigurirati NGINX kao predmemoriranje sadržaja u Linuxu kako bi vaši web poslužitelji radili što učinkovitije.

Trebali biste instalirati NGINX na svoj Linux poslužitelj, ako ne slijedite ove upute za instalaciju Nginxa:

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

Predmemoriraj statički sadržaj na Nginxu

Statični sadržaj je sadržaj web stranice koji ostaje isti (ne mijenja se) na svim stranicama. Primjeri statičnog sadržaja uključuju datoteke poput slika, videozapisa, dokumenata; CSS datoteke i JavaScript datoteke.

Ako vaše web mjesto koristi puno statičnog sadržaja, tada možete optimizirati njegovu izvedbu tako što ćete omogućiti predmemoriranje na strani klijenta u kojem preglednik pohranjuje kopije statičkog sadržaja za brži pristup.

Sljedeći primjer konfiguracije dobar je put, samo zamijenite www.example.com URL-om naziva vašeg web mjesta i prema potrebi izvršite izmjene u drugim imenima puta.

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;
    }
}

Predmemoriraj dinamički sadržaj na Nginxu

NGINX koristi postojanu predmemoriju na disku smještenu negdje u lokalnom datotečnom sustavu. Dakle, počnite s izradom lokalnog direktorija diska za spremanje predmemoriranog sadržaja.
# mkdir -p/var/cache/nginx

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

# chown nginx:nginx /var/cache/nginx

Sada nastavite dalje da biste vidjeli kako omogućiti dinamički sadržaj na Nginxu u odjeljku ispod.

Omogućavanje FastCGI predmemorije u NGINX-u

FastCGI (ili FCGI) je široko korišteni protokol za povezivanje interaktivnih aplikacija poput PHP-a s web poslužiteljima kao što je NGINX. To je produžetak CGI-a (Common Gateway Interface).

Glavna prednost FCGI-a je u tome što upravlja s više CGI zahtjeva u jednom procesu. Bez toga, web poslužitelj mora otvoriti novi postupak (koji treba kontrolirati, obraditi zahtjev i zatvoriti) za svaki zahtjev klijenta za uslugom.

Za obradu PHP skripti u implementaciji LEMP stog, NGINX koristi FPM (FastCGI Process Manager) ili PHP-FPM, popularnu alternativnu PHP FastCGI implementaciju. Jednom kada se PHP-FPM proces pokrene, NGINX je konfiguriran za proxy zahtjeve za obradu. Stoga se NGINX također može konfigurirati za predmemoriranje odgovora s PHP-FPM pozadinskog poslužitelja aplikacija.

Pod NGINX-om, predmemorija sadržaja FastCGI deklarira se pomoću direktive koja se naziva fastcgi_cache_path u kontekstu najviše kode http {} , unutar NGINX konfiguracijske strukture. Također možete dodati fastcgi_cache_key koji definira ključ (identifikator zahtjeva) za predmemoriranje.

Osim toga, da biste pročitali status predmemorije upstream, dodajte direktivu add_header X-Cache-Status unutar konteksta http {} - ovo je korisno u svrhe otklanjanja pogrešaka.

Pod pretpostavkom da se datoteka konfiguracije bloka poslužitelja vaše web lokacije nalazi na /etc/nginx/conf.d/testapp.conf ili /etc/nginx/sites-available/testapp.conf (pod Ubuntu i njegovim izvedenicama), otvorite datoteku za uređivanje i dodajte sljedeći redovi na vrhu 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 navodi broj parametara koji su:

  • /var/cache/nginx - put do direktorija lokalnog diska za predmemoriju.
  • razine - definira hijerarhijske razine predmemorije, postavlja hijerarhiju direktorija na dvije razine pod/var/cache/nginx.
  • tipka_zona (naziv: veličina) - omogućuje stvaranje dijeljene memorijske zone u kojoj su pohranjeni svi aktivni ključevi i podaci o podacima (meta). Imajte na umu da spremanje ključeva u memoriju ubrzava postupak provjere, olakšavajući NGINX-u da utvrdi je li to MISS ili HIT, bez provjere statusa na disku.
  • neaktivan - određuje vrijeme nakon kojeg se predmemorirani podaci kojima se nije pristupilo tijekom navedenog vremena brišu iz predmemorije bez obzira na njihovu svježinu. Vrijednost 60m u našoj primjeru konfiguracije znači da će se datotekama kojima se ne pristupi nakon 60 ukloniti iz predmemorije.
  • max_size - određuje maksimalnu veličinu predmemorije. Ovdje možete koristiti više parametara (pročitajte NGINX dokumentaciju za više informacija).

Varijable u fastcgi_cache_key direktivi opisane su u nastavku.

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

  • $shema - shema zahtjeva, HTTP ili HTTPS.
  • $request_method - metoda zahtjeva, obično “GET” ili “POST”.
  • $host - to može biti ime hosta iz retka zahtjeva, ili ime hosta iz polja zaglavlja zahtjeva "Host" ili ime poslužitelja koje odgovara zahtjevu, prema redoslijedu prioriteta.
  • $request_uri - znači puni izvorni URI zahtjeva (s argumentima).

Također, varijabla $upstream_cache_status u direktivi add_header X-Cache-Status izračunava se za svaki zahtjev na koji NGINX odgovara, bez obzira radi li se o MISS-u (odgovor nije pronađen u predmemoriji, dobiven s poslužitelja aplikacija) ili HIT (odgovor poslužen iz predmemorije) ili bilo koja druga podržana vrijednost.

Dalje, unutar direktive location koja prosljeđuje PHP zahtjeve PHP-FPM-u, koristi direktive fastcgi_cache za aktiviranje predmemorije koju ste upravo definirali gore.

Također postavite vrijeme predmemoriranja za različite odgovore pomoću fastcgi_cache_valid direktive kao što je prikazano.

fastcgi_cache CACHEZONE;
fastcgi_cache_valid  60m;

Ako je samo vrijeme predmemoriranja određeno kao u našem slučaju, predmemorira se samo 200, 301 i 302 odgovora. Ali također možete eksplicitno odrediti odgovore ili upotrijebiti 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 izvedbe brzog keširanja na Nginxu

Da biste postavili minimalni broj zahtjeva da se zahtjev s istim ključem mora podnijeti prije spremanja odgovora, uključite direktivu fastcgi_cache_min_uses , bilo u http {} ili kontekst poslužitelja {} ili lokacija {} .

fastcgi_cache_min_uses  3

Da biste omogućili ponovnu provjeru isteklih stavki predmemorije pomoću uvjetnih zahtjeva s poljima zaglavlja "If-Modified-Since" i "If-None-Match", dodajte direktivu fastcgi_cache_revalidate , unutar http {} ili poslužitelj {} ili lokacija {} kontekst.

fastcgi_cache_revalidate on;

Također možete uputiti NGINX da isporuči predmemorirani sadržaj kada izvorni poslužitelj ili FCGI poslužitelj nije u funkciji, koristeći direktivu proxy_cache_use_stale , unutar direktive o lokaciji.

Ova konfiguracija uzorka znači da kada NGINX primi pogrešku, vremensko ograničenje i bilo koju navedenu pogrešku s uzlaznog poslužitelja i ako u predmemoriranom sadržaju ima ustaljelu verziju tražene datoteke, isporučuje staru datoteku.

proxy_cache_use_stale error timeout http_500;

Još jedna korisna direktiva za fino podešavanje izvedbe predmemoriranja FCGI je fastcgi_cache_background_update koja radi zajedno s direktivom proxy_cache_use_stale . Kad se postavi na, upućuje NGINX da poslužuje ustajali sadržaj kada klijenti zahtijevaju datoteku koja je istekla ili je u procesu ažuriranja s uzlaznog poslužitelja.

fastcgi_cache_background_update on;

Korisan je i fastcgi_cache_lock za precizno podešavanje performansi predmemorije jer ako više klijenata zahtijeva isti sadržaj koji nije u predmemoriji, NGINX će proslijediti samo prvi zahtjev uzlaznom poslužitelju, predmemorirati odgovor zatim poslužite ostale zahtjeve klijenta iz predmemorije.

fastcgi_cache_lock on;

Nakon što napravite sve gore navedene promjene u NGINX konfiguracijskoj datoteci, spremite je i zatvorite. Zatim provjerite ima li u sintaksnim pogreškama konfiguracijske strukture prije ponovnog pokretanja usluge NGINX.

# nginx -t
# systemctl restart nginx

Zatim ispitajte funkcionira li predmemorija ispravno, pokušajte pristupiti svojoj web aplikaciji ili web mjestu pomoću sljedeće naredbe curl (prvi put treba navesti MISS, ali sljedeći zahtjevi trebaju navesti HIT kao što je prikazano na snimci zaslona).

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

Evo još jedne snimke zaslona koja prikazuje NGINX koji poslužuje zastarjele podatke.

Dodavanje iznimaka u zaobilaznu predmemoriju

Moguće je postaviti uvjete pod kojima NGINX ne bi smio slati predmemorirane odgovore klijentima, koristeći fastcgi_cache_bypass direktivu. Da biste naložili NGINX-u da uopće ne predmemorira odgovore s uzlaznog poslužitelja, upotrijebite fastcgi_no_cache .

Na primjer, ako želite da POST zahtjevi i URL-ovi sa nizom upita uvijek idu na PHP. Prvo deklarirajte if izjavu za postavljanje uvjeta kako slijedi.

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

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

 
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 predmemoriranje sadržaja. Slijedi primjer NGINX konfiguracije za poboljšanje izvedbe WordPress web stranice pružene na blogu nginx.com.

Da biste ga koristili, napravite promjene (poput domene, staze, imena datoteka itd.) Kako bi 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 predmemorije proxyja u NGINX-u

NGINX također podržava predmemoriranje odgovora s drugih proxy poslužitelja (definirano direktivom proxy_pass ). Za ovaj testni slučaj koristimo NGINX kao obrnuti proxy za web-aplikaciju Node.js, pa ćemo omogućiti NGINX kao predmemoriju za aplikaciju Node.js. Sve ovdje korištene konfiguracijske direktive imaju slična značenja kao FastCGI direktive u prethodnom odjeljku, pa ih nećemo više objašnjavati.

Da biste omogućili predmemoriranje odgovora s proksiiranog poslužitelja, uključite direktivu proxy_cache_path u kontekst http {} najviše razine. Da biste odredili kako se zahtjevi predmemoriraju, možete dodati i direktivu proxy_cache_key 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 o lokaciji.

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 predmemorirani sadržaj i uopće ne predmemorira odgovor s uzlaznog poslužitelja, 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 predmemorije proxyja

Sljedeće su smjernice korisne za fino podešavanje izvedbe proxy predmemorije. Oni također imaju isto značenje kao i FastCGI smjernice.

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 smjernice konfiguracije predmemoriranja, pogledajte dokumentaciju za dva glavna modula ngx_http_proxy_module.

Dodatni resursi: Savjeti za poboljšanje izvedbe WordPressa.