Giunsa ang Pag-cache sa sulud sa NGINX


Ang NGINX usa ka hiniusa nga open-source, high-performance nga web server nga nagpadali sa paghatud sa sulud ug aplikasyon, nagpauswag sa seguridad, ug nagpauswag sa scalability. Usa sa labing kasagaran nga mga kaso sa paggamit sa Nginx mao ang usa ka Content Caching, nga mao ang labing epektibo nga paagi aron mapalambo ang pasundayag sa usa ka website.

Mahimo nimong gamiton ang NGINX aron mapadali ang mga lokal nga gigikanan nga mga server pinaagi sa pag-configure niini sa mga tubag sa cache gikan sa mga upstream server ug usab aron makahimo mga sulud nga server alang sa mga network sa paghatud sa sulud (CDNs). Ang NGINX adunay gahum sa pipila sa labing kadaghan nga CDN.

Kung gi-configure ingon usa ka cache, ang NGINX:

  • cache static ug dinamikong sulod.
  • pagpauswag sa dynamic nga content performance gamit ang micro-caching.
  • pag-alagad sa lipas nga sulod samtang nag-validate pag-usab sa background para sa mas maayong performance.
  • i-override o itakda ang mga ulohan sa Cache-Control, ug uban pa.

Niini nga artikulo, mahibal-an nimo kung giunsa ang pag-configure sa NGINX ingon usa ka Content Caching sa Linux aron mahimo ang imong mga web server nga modagan nga epektibo kutob sa mahimo.

Kinahanglan nimo nga ma-install ang NGINX sa imong server sa Linux, kung dili sunda kini nga mga giya aron ma-install ang Nginx:

  • Unsaon Pag-instalar sa Nginx sa CentOS 8
  • Unsaon Pag-instalar sa Nginx sa CentOS 7

Cache Static Content sa Nginx

Ang static nga sulod mao ang sulod sa usa ka website nga nagpabilin nga pareho (wala mag-usab) sa mga panid. Ang mga pananglitan sa static nga sulod naglakip sa mga file sama sa mga hulagway, mga video, mga dokumento; CSS file, ug JavaScript files.

Kung gigamit sa imong website ang daghang static nga sulud, mahimo nimong ma-optimize ang pasundayag niini pinaagi sa pagpagana sa pag-cache sa kilid sa kliyente kung diin ang browser nagtipig mga kopya sa static nga sulud alang sa mas paspas nga pag-access.

Ang mosunod nga sampol nga pag-configure maayo, ilisan lang ang www.example.com sa URL sa imong ngalan sa website ug paghimo og mga kausaban sa ubang mga ngalan sa dalan kon angay.

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 Dynamic Content sa Nginx

Ang NGINX naggamit sa usa ka padayon nga disk-based cache nga nahimutang sa usa ka dapit sa lokal nga file system. Busa sugdi pinaagi sa paghimo sa lokal nga direktoryo sa disk para sa pagtipig sa naka-cache nga sulod.
# mkdir -p /var/cache/nginx

Sunod, ibutang ang angay nga pagpanag-iya sa direktoryo sa cache. Kini kinahanglan nga gipanag-iya sa NGINX user (nginx) ug grupo (nginx) ingon sa mosunod.

# chown nginx:nginx /var/cache/nginx

Karon ipadayon ang dugang aron makita kung giunsa paghimo ang dinamikong sulud sa Nginx sa ubos nga seksyon.

Pag-enable sa FastCGI Cache sa NGINX

Ang FastCGI (o FCGI) usa ka kaylap nga gigamit nga protocol alang sa interfacing sa mga interactive nga aplikasyon sama sa PHP sa mga web server sama sa NGINX. Kini usa ka extension sa CGI (Common Gateway Interface).

Ang panguna nga bentaha sa FCGI mao nga kini nagdumala sa daghang mga hangyo sa CGI sa usa ka proseso. Kung wala kini, ang webserver kinahanglan nga magbukas sa usa ka bag-ong proseso (nga kinahanglan kontrolon, iproseso ang usa ka hangyo, ug sirado) alang sa matag hangyo sa kliyente alang sa usa ka serbisyo.

Aron maproseso ang mga script sa PHP sa usa ka LEMP stack deployment, ang NGINX naggamit sa FPM (FastCGI Process Manager) o PHP-FPM, usa ka popular nga alternatibo nga PHP FastCGI nga pagpatuman. Sa diha nga ang proseso sa PHP-FPM nagdagan, ang NGINX gi-configure sa proxy nga mga hangyo niini alang sa pagproseso. Sa ingon ang NGINX mahimo usab nga ma-configure sa cache nga mga tubag gikan sa PHP-FPM backend application server.

Ubos sa NGINX, ang FastCGI content cache gideklarar gamit ang direktiba nga gitawag og fastcgi_cache_path sa top-level http{} context, sulod sa NGINX configuration structure. Mahimo usab nimong idugang ang fastcgi_cache_key nga nagpatin-aw sa usa ka yawe (panghiling identifier) alang sa pag-cache.

Gawas pa, aron mabasa ang kahimtang sa upstream nga cache, idugang ang add_header nga X-Cache-Status nga direktiba sulod sa http{} nga konteksto – kini mapuslanon alang sa mga katuyoan sa pag-debug.

Sa pag-ingon nga ang server block configuration file sa imong site nahimutang sa /etc/nginx/conf.d/testapp.conf o /etc/nginx/sites-available/testapp.conf (ubos sa Ubuntu ug sa mga derivatives niini), ablihi ang file sa pag-edit ug idugang ang mosunod nga mga linya sa ibabaw sa file.

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;

Ang fastcgi_cache_path nga direktiba nagtino sa gidaghanon sa mga parametro nga mao ang:

  • /var/cache/nginx – ang agianan paingon sa lokal nga disk directory para sa cache.
  • mga lebel – naghubit sa lebel sa hierarchy sa usa ka cache, nagbutang kini og duha ka lebel nga hierarchy sa direktoryo ubos sa /var/cache/nginx.
  • keys_zone (ngalan: gidak-on) – makapahimo sa paghimo sa usa ka shared memory zone diin ang tanang aktibong yawe ug impormasyon bahin sa datos (meta) gitipigan. Timan-i nga ang pagtipig sa mga yawe sa memorya makapadali sa proseso sa pagsusi, pinaagi sa pagpasayon sa NGINX sa pagtino kon MISS o HIT ba kini, nga walay pagsusi sa status sa disk.
  • dili aktibo – nagpiho sa gidugayon sa panahon nga human niana ang mga naka-cache nga datos nga wala ma-access sa panahon nga gitakda matangtang gikan sa cache bisan pa sa ilang kabag-o. Ang kantidad nga 60m sa among pananglitan nga configuration nagpasabut nga ang mga file nga dili ma-access pagkahuman sa 60 makuha gikan sa cache.
  • max_size – nagtino sa pinakataas nga gidak-on sa cache. Adunay daghang mga parameter nga imong magamit dinhi (basaha ang dokumentasyon sa NGINX alang sa dugang nga kasayuran).

Ang mga variable sa fastcgi_cache_key nga direktiba gihulagway sa ubos.

Gigamit kini sa NGINX sa pagkalkula sa yawe (identifier) sa usa ka hangyo. Importante, sa pagpadala sa usa ka cached tubag sa kliyente, ang hangyo kinahanglan nga adunay sama nga yawe sa usa ka cached tubag.

  • $scheme – request scheme, HTTP o HTTPS.
  • $request_method – paagi sa paghangyo, kasagaran \GET o \POST.
  • $host – kini mahimong hostname gikan sa request line, o hostname gikan sa \Host request header field, o ang server name nga katumbas sa usa ka request, sa han-ay sa pag-una.
  • $request_uri – nagpasabot sa tibuok orihinal nga hangyo nga URI (nga adunay mga argumento).

Usab, ang $upstream_cache_status variable sa add_header X-Cache-Status nga direktiba kalkulado alang sa matag hangyo nga tubagon sa NGINX, bisan kini usa ka MISS (ang tubag dili makita sa cache, nakuha gikan sa server sa aplikasyon) o usa ka HIT (tubag nga gisilbi gikan sa cache) o bisan unsang ubang gisuportahan nga kantidad.

Sunod, sulod sa lokasyon nga direktiba nga nagpasa sa mga hangyo sa PHP ngadto sa PHP-FPM, naggamit sa fastcgi_cache nga mga direktiba aron ma-aktibo ang cache nga bag-o lang nimong gihubit sa ibabaw.

Itakda usab ang oras sa pag-cache alang sa lainlaing mga tubag gamit ang direktiba nga fastcgi_cache_valid sama sa gipakita.

fastcgi_cache CACHEZONE;
fastcgi_cache_valid  60m;

Kung ang oras sa pag-cache lang ang gitakda sama sa among kaso, 200, 301, ug 302 ra nga mga tubag ang gi-cache. Apan mahimo usab nimo ipiho ang mga tubag nga klaro o gamiton ang bisan unsang (alang sa bisan unsang tubag nga code):

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

Fine-Tuning FastCGI Caching Performance sa Nginx

Aron mabutang ang labing gamay nga gidaghanon sa mga higayon nga ang usa ka hangyo nga adunay parehas nga yawe kinahanglan himuon sa wala pa ma-cache ang tubag, ilakip ang direktiba nga fastcgi_cache_min_uses, bisan sa http{} o server{} o lokasyon{} konteksto.

fastcgi_cache_min_uses  3

Aron mahimo ang re-validation sa mga na-expire na nga cache items gamit ang conditional requests gamit ang \If-Modified-Since ug \If-None-Match header fields, idugang ang fastcgi_cache_revalidate nga direktiba, sulod sa http{} o server{} o lokasyon{} konteksto.

fastcgi_cache_revalidate on;

Mahimo usab nimong tudloan ang NGINX sa paghatud sa naka-cache nga sulud kung ang gigikanan nga server o FCGI server wala, gamit ang direktiba nga proxy_cache_use_stale, sulod sa direktiba sa lokasyon.

Kini nga sample configuration nagpasabot nga sa dihang ang NGINX makadawat og sayop, timeout, ug bisan unsa nga espesipikong mga sayop gikan sa upstream server ug adunay usa ka stale nga bersyon sa gihangyo nga file sa cached content, kini naghatod sa stale file.

proxy_cache_use_stale error timeout http_500;

Laing mapuslanong direktiba sa pag-ayo sa FCGI caching performance mao ang fastcgi_cache_background_update nga naglihok dungan sa proxy_cache_use_stale nga direktiba. Kung gi-on, gimandoan niini ang NGINX nga mag-alagad sa stale content kung ang mga kliyente mangayo alang sa usa ka file nga expire na o anaa sa proseso sa pag-update gikan sa upstream server.

fastcgi_cache_background_update on;

Ang fastcgi_cache_lock mapuslanon usab, alang sa pag-ayo sa pasundayag sa cache nga kung daghang mga kliyente ang mangayo alang sa parehas nga sulud nga wala sa cache, ang NGINX ipasa ang una nga hangyo sa upstream server, i-cache ang tubag dayon pag-alagad sa ubang mga hangyo sa kliyente gikan sa cache.

fastcgi_cache_lock on;

Human sa paghimo sa tanan nga mga kausaban sa ibabaw sa NGINX configuration file, i-save ug isira kini. Dayon susiha ang istruktura sa pag-configure alang sa bisan unsang mga sayup sa syntax sa dili pa i-restart ang serbisyo sa NGINX.

# nginx -t
# systemctl restart nginx

Sunod, sulayi kung ang cache naglihok sa hustong paagi, sulayi ang pag-access sa imong web application o site gikan sa paggamit sa mosunod nga curl command (sa unang higayon kinahanglan nga magpakita sa usa ka MISS, apan ang sunod nga mga hangyo kinahanglan magpakita sa usa ka HIT sama sa gipakita sa screenshot).

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

Ania ang laing screenshot nga nagpakita sa NGINX nga nagsilbi nga stale data.

Pagdugang og mga Eksepsiyon sa Bypass Cache

Posible nga magbutang og mga kondisyon diin ang NGINX dili kinahanglan magpadala sa mga naka-cache nga tubag sa mga kliyente, gamit ang fastcgi_cache_bypass nga direktiba. Ug sa pagtudlo sa NGINX nga dili i-cache ang mga tubag gikan sa upstream server, gamita ang fastcgi_no_cache.

Pananglitan, kung gusto nimo ang mga hangyo sa POST ug mga URL nga adunay string sa pangutana nga kanunay moadto sa PHP. Una, ipahayag ang usa ka kung pahayag aron itakda ang kondisyon sama sa mosunod.

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

Dayon i-aktibo ang naa sa ibabaw nga eksepsiyon sa lokasyon nga direktiba nga nagpasa sa mga hangyo sa PHP ngadto sa PHP-FPM, gamit ang fastcgi_cache_bypass ug fastcgi_no_cache nga mga direktiba.

 
fastcgi_cache_bypass $skip_cache; 
fastcgi_no_cache $skip_cache;

Adunay daghang uban pang mga bahin sa imong site nga dili nimo gusto nga mahimo ang pag-cache sa sulud. Ang mosunod usa ka pananglitan sa NGINX configuration alang sa pagpalambo sa performance sa usa ka WordPress site, nga gihatag sa nginx.com blog.

Aron magamit kini, paghimo og mga pagbag-o (sama sa domain, mga agianan, mga ngalan sa file, ug uban pa) aron mapakita kung unsa ang naa sa imong palibot.

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

Pag-enable sa Proxy Cache sa NGINX

Gisuportahan usab sa NGINX ang pag-cache sa mga tubag gikan sa ubang mga proxy server (gipasabut sa direktiba nga proxy_pass). Alang sa kini nga kaso sa pagsulay, gigamit namon ang NGINX ingon usa ka reverse proxy alang sa usa ka aplikasyon sa web sa Node.js, aron mahimo namon ang NGINX ingon usa ka cache alang sa aplikasyon sa Node.js. Ang tanan nga mga direktiba sa pagsumpo nga gigamit dinhi adunay parehas nga kahulugan sama sa mga direktiba sa FastCGI sa miaging seksyon, busa dili na namon kini ipasabut pag-usab.

Aron mahimo ang pag-cache sa mga tubag gikan sa usa ka proxy nga server, iapil ang proxy_cache_path nga direktiba sa top-level http{} nga konteksto. Aron matino kung giunsa pag-cache ang mga hangyo, mahimo nimong idugang ang proxy_cache_key nga direktiba sama sa mosunod.

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;

Sunod, i-aktibo ang cache sa direktiba sa lokasyon.

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

Aron matino ang mga kondisyon diin ang NGINX wala magpadala ug naka-cache nga sulod ug wala gayuy magtago ug tubag gikan sa upstream server, iapil ang proxy_cache_bypass ug proxy_no_cache.

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

Fine-Tuning Proxy Cache Performance

Ang mosunod nga mga direktiba mapuslanon alang sa pag-ayo sa paghimo sa proxy cache. Adunay usab sila parehas nga kahulugan sa mga direktiba sa 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;

Para sa dugang nga impormasyon ug mga direktiba sa pag-configure sa pag-cache, tan-awa ang dokumentasyon para sa duha ka nag-unang modules ngx_http_proxy_module.

Dugang nga mga Kapanguhaan: Mga Tip sa Pagpauswag sa Pagganap sa WordPress.