Kif Cache Kontenut f'NGINX


NGINX huwa server tal-web konsolidat ta' sors miftuħ u ta' prestazzjoni għolja li jħaffef il-kunsinna tal-kontenut u tal-applikazzjoni, isaħħaħ is-sigurtà u jtejjeb l-iskalabbiltà. Wieħed mill-aktar każijiet ta 'użu komuni ta' Nginx huwa Content Caching, li huwa l-aktar mod effettiv biex tingħata spinta lill-prestazzjoni ta 'websajt.

Tista 'tuża NGINX biex taċċellera s-servers ta' oriġini lokali billi tikkonfiguraha biex tikkonserva r-risposti minn servers upstream u wkoll biex toħloq servers edge għal netwerks ta 'kunsinna ta' kontenut (CDNs). NGINX jagħti setgħa lil wħud mill-akbar CDNs.

Meta kkonfigurat bħala cache, NGINX se:

  • cache kontenut statiku u dinamiku.
  • ttejjeb il-prestazzjoni tal-kontenut dinamiku bil-mikro-caching.
  • jservi kontenut mhux użat waqt li jerġa' jiġi validat fl-isfond għal prestazzjoni aħjar.
  • jissostitwixxi jew issettja l-headers ta' Cache-Control, u aktar.

F'dan l-artikolu, titgħallem kif tikkonfigura NGINX bħala Content Caching fil-Linux biex is-servers tal-web tiegħek jaħdmu bl-aktar mod effiċjenti possibbli.

Għandu jkollok NGINX installat fuq is-server Linux tiegħek, jekk le segwi dawn il-gwidi biex tinstalla Nginx:

  • Kif tinstalla Nginx fuq CentOS 8
  • Kif tinstalla Nginx fuq CentOS 7

Cache Kontenut Statiku fuq Nginx

Il-kontenut statiku huwa kontenut ta' websajt li jibqa' l-istess (ma jinbidilx) madwar il-paġni. Eżempji ta' kontenut statiku jinkludu fajls bħal immaġini, vidjows, dokumenti; Fajls CSS, u fajls JavaScript.

Jekk il-websajt tiegħek tagħmel użu minn ħafna kontenut statiku, allura tista 'tottimizza l-prestazzjoni tagħha billi tippermetti l-caching min-naħa tal-klijent fejn il-browser jaħżen kopji tal-kontenut statiku għal aċċess aktar mgħaġġel.

Il-konfigurazzjoni tal-kampjun li ġejja hija tajba, ibdel www.example.com bil-URL tal-isem tal-websajt tiegħek u agħmel modifiki f'ismijiet oħra kif xieraq.

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

Cache Kontenut Dinamika fuq Nginx

NGINX juża cache persistenti bbażata fuq disk li jinsab x'imkien fis-sistema tal-fajls lokali. Allura ibda billi toħloq id-direttorju tad-disk lokali għall-ħażna tal-kontenut fil-cache.
# mkdir -p /var/cache/nginx

Sussegwentement, issettja s-sjieda xierqa fuq id-direttorju tal-cache. Għandu jkun proprjetà tal-utent NGINX (nginx) u l-grupp (nginx) kif ġej.

# chown nginx:nginx /var/cache/nginx

Issa kompli aktar biex tara kif tippermetti kontenut dinamiku fuq Nginx fit-taqsima ta 'hawn taħt.

Jippermettu FastCGI Cache f'NGINX

FastCGI (jew FCGI) huwa protokoll użat ħafna għall-interfaċċjar ta 'applikazzjonijiet interattivi bħal PHP ma' servers tal-web bħal NGINX. Hija estensjoni tas-CGI (Common Gateway Interface).

Il-vantaġġ ewlieni ta 'FCGI huwa li tamministra talbiet multipli CGI fi proċess wieħed. Mingħajrha, il-webserver irid jiftaħ proċess ġdid (li jrid jiġi kkontrollat, jipproċessa talba, u jingħalaq) għal kull talba tal-klijent għal servizz.

Biex tipproċessa skripts PHP fi skjerament ta 'munzell LEMP, NGINX juża FPM (FastCGI Process Manager) jew PHP-FPM, implimentazzjoni alternattiva popolari ta' PHP FastCGI. Ladarba l-proċess PHP-FPM ikun qed jaħdem, NGINX huwa kkonfigurat biex jipprokura talbiet għalih għall-ipproċessar. Għalhekk NGINX jista 'jiġi kkonfigurat ukoll biex jiġbor ir-risponsi mis-server ta' applikazzjoni backend PHP-FPM.

Taħt NGINX, il-cache tal-kontenut FastCGI hija ddikjarata bl-użu ta' direttiva msejħa fastcgi_cache_path fil-kuntest tal-ogħla livell http{}, fi ħdan l-istruttura tal-konfigurazzjoni NGINX. Tista' wkoll iżżid il-fastcgi_cache_key li tiddefinixxi ċavetta (identifikatur tar-rikjesta) għall-caching.

Barra minn hekk, biex taqra l-istatus tal-cache upstream, żid id-direttiva add_header X-Cache-Status fil-kuntest http{} - dan huwa utli għal skopijiet ta 'debugging.

Jekk wieħed jassumi li l-fajl tal-konfigurazzjoni tal-blokk tas-server tas-sit tiegħek jinsab f'/etc/nginx/conf.d/testapp.conf jew /etc/nginx/sites-available/testapp.conf (taħt Ubuntu u d-derivattivi tiegħu), iftaħ il-fajl tal-editjar u żid il-linji li ġejjin fil-quċċata tal-fajl.

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;

Id-direttiva fastcgi_cache_path tispeċifika n-numru ta' parametri li huma:

  • /var/cache/nginx – it-triq għad-direttorju tad-disk lokali għall-cache.
  • livelli – jiddefinixxi l-livelli ta' ġerarkija ta' cache, jistabbilixxi ġerarkija ta' direttorju fuq żewġ livelli taħt /var/cache/nginx.
  • keys_zone (isem:daqs) – jippermetti l-ħolqien ta' żona ta' memorja kondiviża fejn iċ-ċwievet attivi kollha u l-informazzjoni dwar id-dejta (meta) huma maħżuna. Innota li l-ħażna taċ-ċwievet fil-memorja tħaffef il-proċess tal-iċċekkjar, billi tagħmilha aktar faċli għal NGINX biex tiddetermina jekk huwiex MISS jew HIT, mingħajr ma jiċċekkja l-istatus fuq id-diska.
  • inattiv – jispeċifika l-ammont ta' żmien li warajh id-dejta fil-cache li ma tiġix aċċessata matul iż-żmien speċifikat titħassar mill-cache irrispettivament mill-freskezza tagħha. Valur ta' 60m fil-konfigurazzjoni eżempju tagħna jfisser li fajls li ma jiġux aċċessati wara 60 se jitneħħew mill-cache.
  • max_size – jispeċifika d-daqs massimu tal-cache. Hemm aktar parametri li tista' tuża hawn (aqra d-dokumentazzjoni NGINX għal aktar informazzjoni).

Il-varjabbli fid-direttiva fastcgi_cache_key huma deskritti hawn taħt.

NGINX jużahom fil-kalkolu taċ-ċavetta (identifikatur) ta 'talba. Importanti, biex tibgħat tweġiba cached lill-klijent, it-talba għandu jkollha l-istess ċavetta bħal rispons cached.

  • $scheme – skema ta' talba, HTTP jew HTTPS.
  • $request_method – metodu ta' talba, normalment \GET jew \POST.
  • $host – dan jista' jkun l-isem tal-host mil-linja tat-talba, jew l-isem tal-host mill-qasam tal-header tat-talba \Host, jew l-isem tas-server li jaqbel ma' talba, fl-ordni ta' preċedenza.
  • $request_uri – tfisser l-URI tat-talba oriġinali sħiħa (bl-argumenti).

Ukoll, il-varjabbli $upstream_cache_status fid-direttiva add_header X-Cache-Status hija kkalkulata għal kull talba li NGINX iwieġeb għaliha, kemm jekk hija MISS (rispons mhux misjub fil-cache, akkwistat minn server tal-applikazzjoni) jew HIT (rispons moqdi mill-cache) jew xi wieħed mill-valuri appoġġjati l-oħra.

Sussegwentement, fi ħdan id-direttiva location li tgħaddi talbiet PHP lil PHP-FPM, tuża d-direttivi fastcgi_cache biex tattiva l-cache li għadek kif iddefinijt hawn fuq.

Issettja wkoll il-ħin tal-caching għal tweġibiet differenti billi tuża d-direttiva fastcgi_cache_valid kif muri.

fastcgi_cache CACHEZONE;
fastcgi_cache_valid  60m;

Jekk huwa speċifikat biss il-ħin tal-caching bħal fil-każ tagħna, 200, 301, u 302 tweġibiet biss huma cached. Imma tista' wkoll tispeċifika t-tweġibiet b'mod espliċitu jew tuża kwalunkwe (għal kwalunkwe kodiċi ta' rispons):

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

Irfinar tal-Prestazzjoni tal-Caching FastCGI fuq Nginx

Biex tissettja n-numru minimu ta' drabi li trid issir talba bl-istess ċavetta qabel ma r-risposta tkun fil-cache, inkludi d-direttiva fastcgi_cache_min_uses, jew fil-http{} jew >server{} jew lokazzjoni{} kuntest.

fastcgi_cache_min_uses  3

Biex tippermetti l-validazzjoni mill-ġdid ta’ oġġetti tal-cache skaduti bl-użu ta’ talbiet kondizzjonali bl-oqsma tal-intestaturi \Jekk-Modifikat-Minnnu u \Jekk-Xejn-Match, żid id-direttiva fastcgi_cache_revalidate, fi ħdan id-direttiva http{} jew server{} jew location{} kuntest.

fastcgi_cache_revalidate on;

Tista' wkoll tagħti struzzjonijiet lil NGINX biex iwassal kontenut fil-cache meta s-server tal-oriġini jew is-server tal-FCGI ma jkunx hemm, billi tuża d-direttiva proxy_cache_use_stale, fi ħdan id-direttiva tal-post.

Din il-konfigurazzjoni tal-kampjun tfisser li meta NGINX jirċievi żball, timeout, u kwalunkwe mill-iżbalji speċifikati mis-server upstream u jkollu verżjoni mhux użata tal-fajl mitlub fil-kontenut cached, jagħti l-fajl mhux użat.

proxy_cache_use_stale error timeout http_500;

Direttiva oħra utli biex titjieb il-prestazzjoni tal-caching FCGI hija fastcgi_cache_background_update li taħdem flimkien mad-direttiva proxy_cache_use_stale. Meta ssettjat fuq, jagħti struzzjonijiet lil NGINX biex iservi kontenut mhux użat meta l-klijenti jitolbu għal fajl li jkun skada jew ikun fil-proċess li jiġi aġġornat mis-server upstream.

fastcgi_cache_background_update on;

Il-fastcgi_cache_lock huwa utli wkoll, għall-irfinar tal-prestazzjoni tal-cache peress li jekk klijenti multipli jitolbu għall-istess kontenut li mhux fil-cache, NGINX jgħaddi biss l-ewwel talba lis-server upstream, cache l- rispons imbagħad jaqdi t-talbiet tal-klijenti l-oħra mill-cache.

fastcgi_cache_lock on;

Wara li tagħmel il-bidliet kollha ta 'hawn fuq fil-fajl tal-konfigurazzjoni NGINX, issalva u agħlaq. Imbagħad iċċekkja l-istruttura tal-konfigurazzjoni għal kwalunkwe żball ta 'sintassi qabel ma terġa' tibda s-servizz NGINX.

# nginx -t
# systemctl restart nginx

Sussegwentement, ittestja jekk il-cache huwiex qed jaħdem sew, ipprova jaċċessa l-applikazzjoni tal-web jew is-sit tiegħek billi tuża l-kmand curl li ġej (l-ewwel darba għandha tindika MISS, iżda talbiet sussegwenti għandhom jindikaw HIT kif muri fil-screenshot).

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

Hawnhekk hawn screenshot ieħor li juri NGINX li jservi dejta qadima.

Żieda ta' Eċċezzjonijiet għal Bypass Cache

Huwa possibbli li jiġu stabbiliti kundizzjonijiet li taħthom NGINX m'għandux jibgħat tweġibiet fil-cache lill-klijenti, bl-użu tad-direttiva fastcgi_cache_bypass. U biex tagħti struzzjonijiet lil NGINX biex ma taħkex risponsi mis-server upstream xejn, uża l-fastcgi_no_cache.

Pereżempju, jekk trid li t-talbiet POST u l-URLs b'sekwenza ta' mistoqsijiet dejjem imorru għall-PHP. L-ewwel, iddikjara dikjarazzjoni if biex tissettja l-kundizzjoni kif ġej.

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

Imbagħad attiva l-eċċezzjoni ta' hawn fuq fid-direttiva location li tgħaddi talbiet PHP lil PHP-FPM, billi tuża d-direttivi fastcgi_cache_bypass u fastcgi_no_cache.

 
fastcgi_cache_bypass $skip_cache; 
fastcgi_no_cache $skip_cache;

Hemm ħafna partijiet oħra tas-sit tiegħek li għalihom forsi ma tridx li tippermetti l-caching tal-kontenut. Dan li ġej huwa eżempju ta 'konfigurazzjoni NGINX għat-titjib tal-prestazzjoni ta' sit WordPress, ipprovdut fuq il-blog nginx.com.

Biex tużah, agħmel bidliet (bħal id-dominju, il-mogħdijiet, l-ismijiet tal-fajls, eċċ.) biex tirrifletti dak li jeżisti fl-ambjent tiegħek.

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

Attivazzjoni tal-Proxy Cache f'NGINX

NGINX jappoġġa wkoll il-caching ta' tweġibiet minn servers proxy oħra (definiti mid-direttiva proxy_pass). Għal dan il-każ tat-test, qed nużaw NGINX bħala reverse proxy għal applikazzjoni tal-web Node.js, għalhekk se nippermettu NGINX bħala cache għall-applikazzjoni Node.js. Id-direttivi kollha tal-konfigurazzjoni użati hawn għandhom tifsiriet simili bħad-direttivi FastCGI fit-taqsima preċedenti, għalhekk mhux se nispjegawhom mill-ġdid.

Biex tippermetti l-caching tat-tweġibiet minn server proxy, inkludi d-direttiva proxy_cache_path fil-kuntest tal-ogħla livell http{}. Biex tispeċifika kif it-talbiet jiġu miżmuma fil-cache, tista' wkoll iżżid id-direttiva proxy_cache_key kif ġej.

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;

Sussegwentement, attiva l-cache fid-direttiva tal-post.

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

Biex tiddefinixxi l-kundizzjonijiet li taħthom NGINX ma jibgħatx kontenut fil-cache u ma jaħdimx rispons għal kollox mis-server upstream, inkludi l-proxy_cache_bypass u proxy_no_cache.

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

Irfinar tal-Prestazzjoni tal-Proxy Cache

Id-direttivi li ġejjin huma utli għall-irfinar tal-prestazzjoni tal-proxy cache. Għandhom ukoll l-istess tifsiriet bħad-direttivi FastCGI.

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;

Għal aktar informazzjoni u direttivi tal-konfigurazzjoni tal-caching, ara d-dokumentazzjoni għaż-żewġ moduli ewlenin ngx_http_proxy_module.

Riżorsi Addizzjonali: Għajnuniet għat-Titjib tal-Prestazzjoni ta 'WordPress.