Puncte:0

Adăugarea blocului de locație la fișierele cache face ca aceste fișiere să revină 404

drapel in

Vreau să pun în cache câteva fișiere statice folosind Nginx. Dar cumva nu o pot face să funcționeze.

Acesta este al meu nginx.conf:

utilizator www-date;
worker_proceses auto;
pid /run/nginx.pid;
includ /etc/nginx/modules-enabled/*.conf;

evenimente {
    conexiuni_muncitor 768;
    #multi_accept on;
}


http {

    #GZIP
    gzip on;
    gzip_vary on;
    gzip_proxied orice;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_versiunea 1.1;
    gzip_min_length 256;
    aplicație gzip_types/aplicație javascript/aplicație json/ld+aplicație json/font xml/font eot/font otf/text ttf/text css/text javascript/text simplu/xml;

    # SERVERE
    Server {
            asculta 80;

        nume_server example.com;
        dacă ($http_host ~* ^www\.(.*)$ )
        {
            returnează 301 https://$1$request_uri;
        }

        returnează 301 https://$http_host$request_uri;
    }
    Server {
        asculta 443 ssl;

        dacă ($http_host ~* ^www\.(.*)$ )
        {
            returnează 301 $scheme://$1$request_uri;
        }


        #SSL
        ssl_certificate /root/.acme.sh/example.com/fullchain.cer;
        ssl_certificate_key /root/.acme.sh/example.com/example.com.key;

        nume_server example.com;

        # Transferați tot traficul către aplicația mea web
        Locație / {
            proxy_set_header Gazdă $gazdă;
            proxy_pass http://localhost:8080;
        }

        #Browser cache
        locație ~* \.(js|css)$ {
            expiră 180d;
            add_header Pragma „public”;
            add_header Cache-Control „public”;
        }
        locație ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
            expiră 365d;
            add_header Pragma „public”;
            add_header Cache-Control „public”;
        }

    }
}

Problema se bazează în partea „Browser caching”. Când activez acest bloc de cod, site-ul meu se încarcă, dar toate fișierele css, fișierele javascript și imaginile returnează un 404. Este ca și cum acele fișiere îmi ignoră Locație /.

Am reușit să rezolv această problemă prin copiere/lipire

proxy_set_header Gazdă $gazdă;
proxy_pass http://localhost:8080;

în toate mele Locație-blocuri, dar asta nu este chiar elegant și de fapt a făcut ca site-ul meu să se simtă mult mai lent...

Am încercat și eu să le mut pe cele două Locație-blocuri pentru memorarea în cache a browserului în bloc Locație \ astfel că acesta din urmă ar acționa ca „părinte”. Dar asta nu a întâmpinat comportamentul imaginilor etc., care revin 404.

Cum aș configura stocarea în cache a fișierelor statice în Nginx?

Editați | ×: Am adăugat următoarele la mine http-bloc:

  harta $uri $cache_control {
                ~/Website/assets/media/imagini „public, no-transform”;
        }
        harta $uri $expire {
            ~/Website/assets/media/images 365d;
        }

Am adăugat următoarele la mine Server-bloc:

 expiră $expire;
                add_header Cache-Control $cache_control;

Nimic nu este stocat în cache.

Ivan Shatsky avatar
drapel gr
Care este aplicația dvs. web backend? Ce vă face să nu puteți servi fișiere statice cu nginx fără a apela backend-ul, așa cum sugerează Tero Kilkanen?
O'Niel avatar
drapel in
Aplicația mea web back-end este o aplicație Rust. Și adresa URL în care sunt găsite resursele/fișierele nu este aceeași cu locația reală de pe server. Îmi rescriu căile de acces și resurse în rutele web.
Ivan Shatsky avatar
drapel gr
Ok, dacă nu vă puteți servi activele statice folosind numai nginx și ar trebui să trimiteți toate cererile către backend, verificați [this](https://stackoverflow.com/a/64287782/7121513) răspuns. Cred că asta este exact ceea ce cereți (are nevoie de o adaptare minimă).
O'Niel avatar
drapel in
@IvanShatsky Vedeți editarea. Fișierele nu sunt stocate în cache.
Ivan Shatsky avatar
drapel gr
Adăugați linia `default off;` la blocul `map $uri $expire { ... }`.Care este acel prefix `/Website`? Este într-adevăr o parte din URI și nu numele de domeniu? Verificați dacă anteturile de răspuns necesare sunt prezente în browserul DevTools sau curl. Ești sigur că aplicația de backend nu adaugă nici unul dintre acestea?
O'Niel avatar
drapel in
Am crezut că calea este calea reală a fișierului pe VPS. Am eliminat partea `Website` și acum funcționează! Mulțumiri!
Ivan Shatsky avatar
drapel gr
Din moment ce ai început deja o recompensă, nu te deranjează dacă am scris-o ca răspuns? :) Voi folosi blocuri `hartă` ușor diferite pentru a răspunde la întrebarea dvs. inițială în care fișierele JS/CSS și imagine ar trebui să primească valori diferite de antet `Expire`.
O'Niel avatar
drapel in
@IvanShatsky Desigur, prietene. Ajutorul dumneavoastră este apreciat.
Puncte:1
drapel us

Acest lucru nu răspunde de fapt la întrebarea dvs., dar arată o modalitate preferată de a servi activele statice cu nginx.

Deoarece se pare că rulați aplicația web pe aceeași gazdă, vă recomand să serviți fișierele statice direct folosind nginx.

root /path/to/webroot;

locație ~* \.(js|jss)$ {
    expiră 180d;
    add_header Pragma „public”;
    add_header Cache-Control "public;

    try_files $uri =404;
}

locație ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
    expiră 365d;
    add_header Pragma „public”;
    add_header Cache-Control „public”;

    try_files $uri =404;
}

Acesta are încă definiții duplicat pentru stocarea în cache. Puteți elimina o parte din duplicare specificând directive într-un fișier separat și folosind include pentru a include fișierul în configurația dvs.

Veți introduce următoarele pentru proxy_header.conf fişier:

add_header Pragma „public”;
add_header Cache-Control „public”;

Și în configurația dvs.:

locație ~* ... {
    include /path/to/webroot;
    expiră 365d;
}
Puncte:1
drapel gr

Dacă nu vă puteți servi activele statice direct din sistemul de fișiere prin nginx, așa cum sugerează @TeroKilkanen, puteți utiliza o tehnică similară cu cea prezentată în acest Răspuns:

harta $uri $expire {
    ~\.(?:j|cs)s$ 180d;
    ~\.(?:jpe?g|png|webp|woff2?|ttf)$ 365d;
    implicit dezactivat;
}
harta $uri $cache_control {
    ~\.(?:js|css|jpe?g|png|webp|woff2?|ttf)$ public;
}
Server {
    ...
    expiră $expire;
    add_header Pragma $cache_control;
    add_header Cache-Control $cache_control;
    ...
}

Dacă URI-ul solicitării dvs. nu se potrivește cu expresia regex, $cache_control variabila va avea o valoare goală și nginx nu va adăuga Pragma și Cache-Control antet la răspunsul său.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.