Jinsi ya Kuhifadhi Yaliyomo katika NGINX


NGINX kuwa chanzo-wazi kilichounganishwa, seva ya wavuti ya utendaji wa juu ambayo huharakisha uwasilishaji wa maudhui na programu, huongeza usalama, na kuboresha uboreshaji. Mojawapo ya matukio ya kawaida ya matumizi ya Nginx ni Uhifadhi wa Maudhui, ambayo ndiyo njia bora zaidi ya kuongeza utendaji wa tovuti.

Unaweza kutumia NGINX kuharakisha seva asili za ndani kwa kuisanidi ili kuweka akiba ya majibu kutoka kwa seva za juu na pia kuunda seva za ukingo za mitandao ya uwasilishaji wa yaliyomo (CDNs). NGINX inawapa nguvu baadhi ya CDN kubwa zaidi.

Inaposanidiwa kama kache, NGINX itafanya:

  • akiba ya maudhui tuli na yanayobadilika.
  • boresha utendakazi wa maudhui kwa kutumia akiba ndogo.
  • tumikia maudhui ya zamani huku ukisasisha upya chinichini kwa utendakazi bora.
  • batilisha au weka vichwa vya Cache-Control, na zaidi.

Katika makala haya, utajifunza jinsi ya kusanidi NGINX kama Uhifadhi wa Maudhui katika Linux ili kufanya seva zako za wavuti ziendeshe kwa ufanisi iwezekanavyo.

Unapaswa kuwa na NGINX iliyosanikishwa kwenye seva yako ya Linux, ikiwa sio kufuata miongozo hii ili kusakinisha Nginx:

  • Jinsi ya kusakinisha Nginx kwenye CentOS 8
  • Jinsi ya kusakinisha Nginx kwenye CentOS 7

Yaliyomo kwenye Cache kwenye Nginx

Maudhui tuli ni maudhui ya tovuti ambayo yanasalia kuwa yale yale (hayabadiliki) katika kurasa zote. Mifano ya maudhui tuli ni pamoja na faili kama vile picha, video, hati; Faili za CSS, na faili za JavaScript.

Ikiwa tovuti yako inatumia mengi ya maudhui tuli, basi unaweza kuboresha utendaji wake kwa kuwezesha uhifadhi wa upande wa mteja ambapo kivinjari huhifadhi nakala za maudhui tuli kwa ufikiaji wa haraka.

Sampuli ya usanidi ifuatayo ni nzuri, badilisha tu www.example.com na URL ya jina la tovuti yako na ufanye marekebisho kwa majina mengine ya njia inavyofaa.

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

Maudhui ya Akiba ya Nguvu kwenye Nginx

NGINX hutumia kashe ya msingi ya diski iliyoko mahali fulani kwenye mfumo wa faili wa ndani. Kwa hivyo anza kwa kuunda saraka ya diski ya ndani kwa kuhifadhi yaliyomo kwenye akiba.
# mkdir -p /var/cache/nginx

Ifuatayo, weka umiliki unaofaa kwenye saraka ya kache. Inapaswa kumilikiwa na mtumiaji wa NGINX (nginx) na kikundi (nginx) kama ifuatavyo.

# chown nginx:nginx /var/cache/nginx

Sasa endelea zaidi ili kuona jinsi ya kuwezesha maudhui yanayobadilika kwenye Nginx katika sehemu iliyo hapa chini.

Kuwezesha FastCGI Cache katika NGINX

FastCGI (au FCGI) ni itifaki inayotumika sana kwa kuingiliana kwa programu shirikishi kama vile PHP na seva za wavuti kama vile NGINX. Ni ugani wa CGI (Common Gateway Interface).

Faida kuu ya FCGI ni kwamba inadhibiti maombi mengi ya CGI katika mchakato mmoja. Bila hivyo, seva ya tovuti lazima ifungue mchakato mpya (ambao unapaswa kudhibitiwa, kushughulikia ombi, na kufungwa) kwa kila ombi la mteja la huduma.

Ili kuchakata hati za PHP katika uwekaji wa rafu za LEMP, NGINX hutumia FPM (Kidhibiti Mchakato wa FastCGI) au PHP-FPM, utekelezaji mbadala maarufu wa PHP FastCGI. Mara tu mchakato wa PHP-FPM unapoendelea, NGINX imesanidiwa kuwa maombi ya seva mbadala kwake kwa ajili ya kuchakatwa. Kwa hivyo NGINX inaweza pia kusanidiwa ili majibu ya akiba kutoka kwa seva ya nyuma ya programu ya PHP-FPM.

Chini ya NGINX, akiba ya maudhui ya FastCGI inatangazwa kwa kutumia mwongozo unaoitwa fastcgi_cache_path katika muktadha wa kiwango cha juu cha http{}, ndani ya muundo wa usanidi wa NGINX. Unaweza pia kuongeza fastcgi_cache_key ambayo inafafanua ufunguo (kitambulisho cha ombi) kwa akiba.

Kando na hilo, ili kusoma hali ya juu ya akiba, ongeza agizo la add_header X-Cache-Status ndani ya http{} muktadha - hii ni muhimu kwa madhumuni ya utatuzi.

Ikizingatiwa kuwa faili ya usanidi wa kizuizi cha seva ya tovuti yako iko /etc/nginx/conf.d/testapp.conf au /etc/nginx/sites-available/testapp.conf (chini ya Ubuntu na derivatives zake), fungua faili ya kuhariri na uongeze. mistari ifuatayo juu ya faili.

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;

Maagizo ya fastcgi_cache_path yanabainisha idadi ya vigezo ambavyo ni:

  • /var/cache/nginx - njia ya saraka ya diski ya ndani kwa kache.
  • viwango - inafafanua viwango vya daraja la kache, inaweka safu ya saraka ya ngazi mbili chini ya /var/cache/nginx.
  • keys_zone (jina:size) - huwezesha uundaji wa eneo la kumbukumbu lililoshirikiwa ambapo vitufe vyote vinavyotumika na taarifa kuhusu data (meta) huhifadhiwa. Kumbuka kuwa kuhifadhi vitufe kwenye kumbukumbu huharakisha mchakato wa kukagua, kwa kurahisisha NGINX kubaini kama ni MISS au HIT, bila kuangalia hali kwenye diski.
  • isiyotumika - hubainisha muda ambao baada ya hapo data iliyohifadhiwa ambayo haijafikiwa kwa muda uliobainishwa hufutwa kutoka kwenye akiba bila kujali upya wao. Thamani ya 60m katika usanidi wetu wa mfano inamaanisha faili ambazo hazijafikiwa baada ya 60 zitaondolewa kwenye akiba.
  • max_size - hubainisha ukubwa wa juu zaidi wa kache. Kuna vigezo zaidi unavyoweza kutumia hapa (soma hati za NGINX kwa habari zaidi).

Vigeu katika maagizo ya fastcgi_cache_key vimefafanuliwa hapa chini.

NGINX inazitumia katika kuhesabu ufunguo (kitambulisho) cha ombi. Muhimu, kutuma jibu lililohifadhiwa kwa mteja, ombi lazima liwe na ufunguo sawa na jibu lililohifadhiwa.

  • $scheme - mpango wa ombi, HTTP au HTTPS.
  • $request_method – njia ya ombi, kwa kawaida \GET au \POST.
  • $host – hili linaweza kuwa jina la mpangishi kutoka kwa safu ya ombi, au jina la mpangishi kutoka kwa sehemu ya kichwa cha ombi la \Mpangishi, au jina la seva linalolingana na ombi, kwa mpangilio wa kutanguliza.
  • $request_uri - inamaanisha ombi kamili la URI (yenye hoja).

Pia, kigezo cha $upstream_cache_status katika maagizo ya add_header X-Cache-Status huhesabiwa kwa kila ombi ambalo NGINX hujibu, iwe ni MISS (jibu halijapatikana kwenye akiba, lililopatikana kutoka kwa seva ya programu) au HIT (jibu linalotolewa kutoka kwa akiba) au maadili mengine yoyote yanayotumika.

Kisha, ndani ya maagizo ya location ambayo hupitisha maombi ya PHP kwa PHP-FPM, hutumia maagizo ya fastcgi_cache ili kuwezesha akiba ambayo umefafanua hapo juu.

Pia weka muda wa kuweka akiba kwa majibu tofauti kwa kutumia fastcgi_cache_valid maagizo kama inavyoonyeshwa.

fastcgi_cache CACHEZONE;
fastcgi_cache_valid  60m;

Iwapo tu muda wa kuhifadhi utabainishwa kama ilivyo kwetu, ni majibu 200, 301 na 302 pekee ndiyo yamehifadhiwa. Lakini pia unaweza kubainisha majibu kwa uwazi au kutumia yoyote (kwa msimbo wowote wa majibu):

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

Uboreshaji Utendaji wa Uhifadhi wa FastCGI kwenye Nginx

Ili kuweka idadi ya chini ya mara ambazo ombi kwa ufunguo sawa lazima lifanywe kabla ya jibu kuhifadhiwa, jumuisha maagizo ya fastcgi_cache_min_uses, ama katika http{} au seva{} au eneo{} muktadha.

fastcgi_cache_min_uses  3

Ili kuwezesha uthibitishaji upya wa vipengee vya akiba vilivyokwisha muda wake kwa kutumia maombi ya masharti na sehemu za kichwa za \If-Modified-Tangu na \If-None-Match, ongeza maagizo ya fastcgi_cache_revalidate, ndani ya http{} au seva{} au eneo{} muktadha.

fastcgi_cache_revalidate on;

Unaweza pia kuagiza NGINX kuwasilisha maudhui yaliyohifadhiwa wakati seva asili au seva ya FCGI iko chini, kwa kutumia maagizo ya proxy_cache_use_stale, ndani ya maagizo ya eneo.

Usanidi huu wa sampuli unamaanisha kuwa NGINX inapopokea hitilafu, muda umekwisha, na hitilafu zozote zilizobainishwa kutoka kwa seva ya juu na ina toleo la zamani la faili iliyoombwa katika maudhui yaliyohifadhiwa, hutoa faili ya zamani.

proxy_cache_use_stale error timeout http_500;

Maagizo mengine muhimu ya kurekebisha vyema utendakazi wa akiba ya FCGI ni fastcgi_cache_background_update ambayo hufanya kazi pamoja na maagizo ya proxy_cache_use_stale. Inapowashwa, inaagiza NGINX kutoa maudhui ya zamani wakati wateja wanaomba faili ambayo muda wake umeisha au iko katika mchakato wa kusasishwa kutoka kwa seva ya juu.

fastcgi_cache_background_update on;

fastcgi_cache_lock ni muhimu pia, kwa urekebishaji mzuri wa akiba kwa kuwa ikiwa wateja wengi wataomba maudhui sawa ambayo hayako kwenye akiba, NGINX itasambaza ombi la kwanza tu kwa seva ya juu, akiba jibu kisha tumikia maombi mengine ya mteja kutoka kwa kache.

fastcgi_cache_lock on;

Baada ya kufanya mabadiliko yote hapo juu kwenye faili ya usanidi wa NGINX, ihifadhi na uifunge. Kisha angalia muundo wa usanidi kwa makosa yoyote ya syntax kabla ya kuanzisha upya huduma ya NGINX.

# nginx -t
# systemctl restart nginx

Ifuatayo, jaribu ikiwa kache inafanya kazi vizuri, jaribu kufikia programu yako ya wavuti au tovuti kutoka kwa kutumia amri ifuatayo ya curl (mara ya kwanza inapaswa kuonyesha MISS, lakini maombi yanayofuata yanapaswa kuonyesha HIT kama inavyoonyeshwa kwenye picha ya skrini).

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

Hapa kuna picha nyingine ya skrini inayoonyesha NGINX ikitoa data ya zamani.

Kuongeza Vighairi kwenye Akiba ya Bypass

Inawezekana kuweka masharti ambayo NGINX isitume majibu yaliyoakibishwa kwa wateja, kwa kutumia fastcgi_cache_bypass maelekezo. Na kuagiza NGINX kutohifadhi majibu kutoka kwa seva ya juu kabisa, tumia fastcgi_no_cache.

Kwa mfano, ikiwa unataka maombi ya POST na URL zilizo na kamba ya hoja ziende kwa PHP kila wakati. Kwanza, tangaza ikiwa taarifa ili kuweka hali kama ifuatavyo.

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

Kisha wezesha ubaguzi ulio hapo juu katika maagizo ya location ambayo hupitisha maombi ya PHP kwa PHP-FPM, kwa kutumia fastcgi_cache_bypass na fastcgi_no_cache maelekezo.

 
fastcgi_cache_bypass $skip_cache; 
fastcgi_no_cache $skip_cache;

Kuna sehemu nyingine nyingi za tovuti yako ambazo huenda hutaki kuwezesha uhifadhi wa maudhui. Ufuatao ni mfano wa usanidi wa NGINX wa kuboresha utendakazi wa tovuti ya WordPress, iliyotolewa kwenye blogu ya nginx.com.

Ili kuitumia, fanya mabadiliko (kama vile kikoa, njia, majina ya faili, n.k.) ili kuonyesha kile kilicho katika mazingira yako.

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

Inawasha Akiba ya Wakala katika NGINX

NGINX pia inaauni uhifadhi wa majibu kutoka kwa seva zingine zilizowekwa (imefafanuliwa na maagizo ya proxy_pass). Kwa kesi hii ya majaribio, tunatumia NGINX kama seva mbadala ya programu ya wavuti ya Node.js, kwa hivyo tutawasha NGINX kama akiba ya programu ya Node.js. Maagizo yote ya usanidi yaliyotumiwa hapa yana maana sawa na maagizo ya FastCGI katika sehemu iliyotangulia, kwa hivyo hatutayaelezea tena.

Ili kuwezesha uhifadhi wa majibu kutoka kwa seva mbadala, jumuisha maagizo ya proxy_cache_path katika muktadha wa kiwango cha juu cha http{}. Ili kubainisha jinsi maombi yanavyohifadhiwa, unaweza pia kuongeza maagizo ya proxy_cache_key kama ifuatavyo.

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;

Ifuatayo, wezesha kache katika maagizo ya eneo.

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

Ili kufafanua masharti ambayo NGINX haitumi maudhui yaliyoakibishwa na haihifadhi jibu hata kidogo kutoka kwa seva ya juu ya mkondo, jumuisha proxy_cache_bypass na proxy_no_cache.

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

Utendaji Bora wa Akiba ya Wakala

Maagizo yafuatayo ni muhimu kwa kusawazisha utendakazi wa akiba ya seva mbadala. Pia zina maana sawa na maagizo ya 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;

Kwa maelezo zaidi na maagizo ya usanidi wa akiba, angalia hati za moduli kuu mbili ngx_http_proxy_module.

Nyenzo za Ziada: Vidokezo vya Kuboresha Utendaji wa WordPress.