Podešavanje optimizacije Nginxa s predmemoriranjem

Nginx je moćan softver za web aplikacije za hostiranje web stranica. S vremenom je Nginx konačno nadmašio Apache u najčešće korištenom softveru web poslužitelja nakon lansiranja početkom 2000-ih, uglavnom zbog performansi plus mogućnosti da bude više od tradicionalnog web poslužitelja. Jedna od mnogih stvari za koje se Nginx koristi je postavljanje kao obrnuti proxy ili balansator opterećenja.

Međutim, ključna značajka je propuštena većinu puta kada se koristi kao prednja strana za stražnje poslužitelje. To je sposobnost koju Nginx ima u odnosu na HAProxy u relativno jednostavnom hvatanju statičkih resursa sa pisanjem na disk ili ako imate snažan poslužitelj s prilično obiljem RAM-a koji dodaje predmemoriju u memoriju za vrhunske performanse.

U sljedećem vodiču vidjet ćete neke primjere kako to učiniti, trenutno dajući vašem Nginx poslužitelju poticaj ako koristite Nginx u situaciji obrnutog proxyja.

Preduvjeti

  • Preporučeni OS: Bilo koji Linux operativni sustav s instaliranim Nginxom.
  • Korisnički račun: Korisnički račun sa sudo ili root pristupom.

Oglas


Napravite Nginx predmemoriju (tradicionalna predmemorija diska)

U prvom primjeru stvorit ćete direktorij i dodati zonu bloku vašeg Nginx poslužitelja s tradicionalnim statičkim datotekama za predmemoriju na disk. Dugoročno, ako ne koristite SSD, to ponekad može biti negativan čimbenik. Također, čak i kod SSD-a, stalno pisanje može skratiti životni vijek ovisno o starosti i kvaliteti tvrdog diska.

Prvo stvorite direktorij za pohranu podataka iz predmemorije:

sudo mkdir -p /cache/tmpfs/

Zatim dodajte sljedeće u svoj blok poslužitelja, izmijenite postojeći blok proxy poslužitelja i dodajte dodatke.

proxy_cache_path /cache/nginx/tmpfs levels=1:2 keys_zone=my_zone:100m max_size=6g inactive=1d use_temp_path=off;

server {
    ...
    location / {
        proxy_cache my_zone;
        proxy_cache_key $scheme$request_method$proxy_host$request_uri;
        proxy_cache_valid 404 302 1m;
        proxy_cache_valid 200 1d;
        proxy_http_version   1.1;
        add_header X-Cache-Status $upstream_cache_status;
    }
    ...
}

Napomena, provjerite ide li (proxy_cache_path) u HTTP dio, a ne u blok poslužitelja. Također, putevi datoteke moraju biti apsolutni, inače neće raditi. Sve u svemu, u vodiču su uklonjene datoteke koje nisu dirane 24 sata i provjera valjanosti predmemorije 24 sata prije nego što se osvježe.

Ovdje je raščlamba terminologije Nginxa.

  • keys_zone: postavlja zonu zajedničke memorije za pohranjivanje ključeva predmemorije i metapodataka kao što su mjerači vremena korištenja. Posjedovanje kopije ključeva u memoriji omogućuje NGINX-u da brzo utvrdi je li zahtjev (POGODITI) ili (PROPUSTITI) bez potrebe ići na disk, što uvelike ubrzava provjeru. Zona od 1 MB može pohraniti podatke za oko 8,000 10 ključeva, tako da zona od 80,000 MB konfigurirana u primjeru može pohraniti podatke za oko XNUMX XNUMX ključeva.
  • neaktivan: određuje koliko dugo stavka može ostati u predmemoriji bez pristupa. U ovom primjeru, datoteka koja nije zatražena 60 minuta automatski se briše iz predmemorije procesom upravitelja predmemorije, bez obzira na to je li istekla ili ne. Zadana vrijednost je 10 minuta (10m). Neaktivni sadržaj razlikuje se od sadržaja koji je istekao. NGINX ne briše automatski sadržaj koji je istekao kako je definirano zaglavljem kontrole predmemorije (Cache-Control:max-age=120 na primjer). Istekao (mokraća) sadržaj se briše samo kada mu se nije pristupilo vrijeme određeno kao neaktivan. Kada se pristupi sadržaju koji je istekao, NGINX ga osvježava s izvornog poslužitelja i resetira neaktivni mjerač vremena.
  • maksimalna_veličina: postavlja gornju granicu veličine predmemorije (na 10 gigabajta u ovom primjeru). Nije obavezno; nenavođenje vrijednosti omogućuje povećanje predmemorije kako bi iskoristio sav raspoloživi prostor na disku. Kada veličina predmemorije dosegne ograničenje, pokreće se proces koji se zove upravitelj predmemorije uklanja datoteke koje su najmanje korištene za vraćanje veličine predmemorije ispod ograničenja.
  • proxy_cache_path: put datoteke do mape predmemorije koju ste stvorili.
  • add_header X-Cache-Status $upstream_cache_status: dodaje HTTP zaglavlje X-Cache-Status u odgovorima klijentima

Dodatne opcije u nastavku mogu koristiti vašem poslužitelju u kombinaciji s izvornom konfiguracijom proxy predmemorije:

  • proxy_cache_revalidate: upućuje NGINX da koristi uvjetno (DOBITI) zahtjeva prilikom osvježavanja sadržaja s izvornih poslužitelja. Ako klijent zatraži stavku koja je spremljena u predmemoriju, ali je istekla kako je definirano u zaglavljima kontrole predmemorije, NGINX uključuje (ako-izmijenjeno-od) polje u zaglavlju (DOBITI) zahtjev koji šalje izvornom poslužitelju. Time se štedi na propusnosti jer poslužitelj šalje cijelu stavku samo ako je promijenjena od vremena zabilježenog u (Zadnja promjena) zaglavlje priloženo datoteci kada ju je NGINX izvorno predmemorirao.
  • proxy_cache_min_uses: postavlja koliko puta klijenti moraju zatražiti stavku prije nego što je NGINX spremi u predmemoriju. Ovo je korisno ako se predmemorija stalno puni, jer osigurava da se u predmemoriju dodaju samo stavke kojima se najčešće pristupa. Prema zadanim postavkama (proxy_cache_min_uses) postavljeno je na 1.
  • proxy_cache_background_update : (ažuriranje) parametar za (proxy_cache_use_stare) direktive, u kombinaciji s omogućavanjem (proxy_cache_background_update) direktiva, upućuje NGINX da isporuči zastarjeli sadržaj kada klijenti zatraže stavku kojoj je istekao rok ili je u procesu ažuriranja s izvornog poslužitelja. Sva ažuriranja obavljat će se u pozadini. Zastarjela datoteka vraća se za sve zahtjeve dok se ažurirana datoteka u potpunosti ne preuzme.
  • proxy_cache_lock: S (proxy_cache_lock) omogućeno, ako više klijenata zatraži datoteku koja nije trenutna u predmemoriji a (PROPUSTITI), samo je prvi od tih zahtjeva dopušten do izvornog poslužitelja. Preostali zahtjevi čekaju da taj zahtjev bude zadovoljen, a zatim izvlače datoteku iz predmemorije. Bez (proxy_cache_lock) omogućeno, svi zahtjevi koji rezultiraju promašajima predmemorije idu ravno na izvorni poslužitelj.

Nginx cache u RAM-u

Ako vaš poslužitelj ima resurse, keširanje u RAM uvijek će biti bolje od predmemoriranja datoteka na disk, to se čak odnosi i na najsuvremenije SSD pogone. Ovo je usmjereno prema poslužiteljima koji se upravljaju sami i ima obilne resurse kao što je ram koji sjedi uokolo i ne radi ništa. Potencijalno možete postaviti sjajno predmemoriju memorije koja će odmah utjecati na učitavanje vaše web stranice.

Prvo stvorite novi direktorij za predmemoriju u RAM-u:

sudo mkdir -p /cache/nginx/tmpfs

Drugo, montirajte kreirani direktorij u RAM pomoću (tmpfs) pomoću sljedeće naredbe:

sudo mount -t tmpfs -o size=2g tmpfs /cache/nginx/tmpfs

Ovo se montira (/data/nginx/tmpfs) u RAM-u, izdvajajući 2 GB. To se može podesiti povećanjem ili smanjenjem. Manji poslužitelji bi počeli s 512MB umjesto 2g. Međutim, ne postoji točan ili pogrešan odgovor jer je svaki poslužitelj drugačiji.

Ako trebate demontirati, izvedite sljedeći kod:

sudo umount /cache/nginx/ramcache

Da biste završili postavljanje s RAM cachiranjem s Nginxom, morate dodati sljedeće (/etc/fstab), tako da kada se poslužitelj automatski ponovno pokrene, direktorij RAM predmemorije ponovno se kreira.

Otvorite (/etc/fstab) datoteka pomoću nano:

sudo nano /etc/fstab

Unesite sljedeće i prilagodite lokaciju i veličinu predmemorije:

tmpfs /cache/nginx/tmpfs tmpfs defaults,size=1g 0 0

Oglas


Nginx proxy međuspremnik

Ako koristite Nginx obrnuti proxy, dobar način za povećanje performansi je korištenje međuspremnika proxyja. To je povezano s načinom na koji Nginx obrađuje odgovor primljen od proxy poslužitelja. To znači da se proxy poslužitelj ne pita za svaki zahtjev klijenta, ali se podaci poslužuju iz predmemorije ako se podaci iz predmemorije i dalje smatraju valjanima (život nije prošao).

Radni primjer u nastavku:

#Enables or disables buffering of responses from the proxied server.
proxy_buffering on;
 
#proxy buffer cache sizes
proxy_buffers 4 256k;
proxy_buffer_size 128k; 
proxy_busy_buffers_size 256k;

WordPress predmemorija

Gore navedeni primjeri vrlo dobro funkcioniraju s WordPress web stranicama. Međutim, bit će potrebna neka dodatna pravila kako bismo osigurali da neke resurse ne spremamo u predmemoriju iz sigurnosnih razloga među najboljima.

Prvo, ovo zalijepite iznad područja (lokacije) koje se sprema u datoteci bloka poslužitelja:

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/*|/tag/.*/feed/*|index.php|/.*sitemap.*\.(xml|xsl)") {
    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;
}

Kao što možete vidjeti, preskačemo predmemoriju na (POST) zahtjevima sa nizom upita koji bi uvijek trebao ići na PHP i ne predmemorirati sve URL-ove koji sadrže neke svakodnevne stvari kao što su feedovi, karte web-lokacije itd.

Zatim dodajte sljedeća dva retka na mjesto predmemorije:

        proxy_cache_bypass $skip_cache;
        proxy_no_cache $skip_cache;

Za novije korisnike koji žele vidjeti potpuni primjer, pogledajte dolje u radnom okruženju:

    location / {
        proxy_pass http://webserver;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache my_zone;
        proxy_cache_key $scheme$request_method$proxy_host$request_uri;
        proxy_cache_valid 404 302 1m;
        proxy_cache_valid 200 31d;
        add_header X-Cache-Status $upstream_cache_status;
        proxy_buffering on;
        proxy_buffers 256 16k;
        proxy_buffer_size 32k;
        proxy_http_version   1.1;
        proxy_cache_bypass $skip_cache;
        proxy_no_cache $skip_cache;
    }
}

Oglas


Keširanje Nginx preglednika

Predmemoriranje preglednika izvrstan je način za smanjenje opterećenja poslužitelja, osobito ako vodite blogove ili drugi sličan sadržaj. Možete postaviti produženo vrijeme za shopping i forume gdje se dinamički sadržaj češće mijenja.

Najčešći primjeri popularnog hvatanja su u nastavku. Unesite ovo u svoj blok poslužitelja.

  # assets, media
  location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
  expires    365d;
  access_log off;
  }
  
  # svg, fonts
  location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ {
  add_header Access-Control-Allow-Origin "*";
  expires    365d;
  access_log off;
  }

Da biste spremili na disk IO i zapisnik, ove resurse možete deklarirati isključenim u svom pristupnom zapisniku kako biste povećali performanse na poslužitelju ako se borite s većim vremenom učitavanja.

Komentari i zaključak

U tutorialu ste naučili kako koristiti Nginx proxy cache koristeći datoteke i RAM. Za dodatne informacije o Nginx predmemoriji, posjetite dokumentaciju Nginx Caching kako biste naučili mnogo jer je prilično opsežna i ima dodatne opcije. Dodaci se mogu učiniti jer je vodič upravo zagrebao površinu onoga što se stvarno može učiniti.

Ostavite komentar