L'impostazione scade le intestazioni per il contenuto statico offerto da nginx


96

Sto usando nginx per server il mio contenuto statico, c'è un modo in cui posso impostare le intestazioni di scadenza per ogni file che soddisfa una regola specifica? Ad esempio, posso impostare l'intestazione di scadenza per tutti i file con estensione ".css"?

Risposte:


126

Preferisco fare un'intestazione di cache più completa, oltre ad alcune estensioni di file. Il '?' il prefisso è un segno 'non-cattura', nginx non creerà $ 1. Aiuta a ridurre il carico non necessario.

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}

7
Tutti i miei file statici non sono stati trovati dopo averlo aggiunto.
Jürgen Paul,

@JackSpairow: non riesco davvero a spiegare perché sia ​​successo, poiché ha sempre funzionato per me. Stai eseguendo Nginx mancando il modulo di fornitura add_header? Questo genere di cose ha davvero una portata limitata, sei sicuro che un'altra decelerazione non sia un problema in combinazione?
JM Becker,

24
Probabilmente un altro blocco aveva una definizione per i file statici con un rootset, in quel caso dovresti aggiungere le direttive a quel blocco. (So ​​che è in ritardo di 2 anni, ma per i futuri cittadini)
Aularon,

1
Personalmente apprezzo i chiarimenti, soprattutto per i futuri ricercatori perché spesso vengono visualizzati molto dopo il post originale. +1: P
JM Becker,

l'utilizzo di questo confonde totalmente il mio sito Web wordpress. css e immagini non sono mostrati. c'è qualche altro conflitto da qualche parte?
user1641443


17

Non ho abbastanza reputazione per commentare il motivo per cui la risposta accettata non causerebbe più la visualizzazione dei file, ma l'ho capito e vorrei dare una mano!

Versione breve:

Assicurati di avere una directory root specificata per il tuo blocco di posizione sulle immagini se non ne hai uno globale!

Versione lunga di seguito:


Innanzitutto, il mio metodo di implementazione di questa soluzione è stato molto simile a questa risposta , in cui scrivi la regola (come nella risposta accettata):

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}

in un file img-cache.conf

e quindi includi quel file nella tua server {...}direttiva.

Il mio esempio di somesite.com nella cartella dei miei siti disponibili:

 #Image Caching
 include /etc/nginx/conf/img-cache.conf;

In questo modo è possibile aggiungere il blocco della posizione della memorizzazione nella cache delle immagini a più siti in esecuzione.


In secondo luogo, ho una situazione in cui my / var / www / contiene due cartelle che consento come public_html - sicure e di formazione, quindi devo creare blocchi di posizione specifici nella direttiva server del mio sito individuando queste cartelle.

Come tale, non ho un set di directory radice globale .

Quindi, quando crei i blocchi di posizione delle immagini, potresti non fornire loro una directory principale da cui cercare le immagini!

La mia soluzione era quindi di:

location ~ ^/training.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}

location ~ ^/.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/secure;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}

1
+1 per renderlo riutilizzabile .conf. La cartella appropriata nginx/1.14.0 (Ubuntu)sembra essere /etc/nginx/snippets/.
Jan Werkhoven,

9

È inoltre possibile impostare la scadenza al massimo. Ecco la direttiva che uso per css e js.

# Set css and js to expire in a very long time
location ~* ^.+\.(css|js)$ {
    access_log off;
    expires max;
}

1
Vorrei usare la direttiva root solo nel blocco server {}, quando la utilizzo in posizioni secondarie porta a conseguenze inattese. Non hai bisogno della pausa; neanche perché non sei in un blocco if {}
Dave Cheney il

Hai ragione. Ho dimenticato di ripulirlo. Modificato per riflettere questo.
Jauder Ho,

4

Tutte le soluzioni sopra menzionate negheranno la possibilità di avere alias diversi per percorsi diversi. Inoltre, per avere tutte le diverse scadenze della cache in un unico posto, dovresti usare nginx map nel modo seguente.

...

# Expires mappings
map $sent_http_content_type $expires {
    default                    off;
    text/html                  epoch;
    text/css                   max;
    application/javascript     7d;
    ~image/                    max;
}

...

server {
   listen ...;

   expires $expires;
   location /assets/ {
      # It is now possible to serve some resources from different path
      alias /var/www/my_other_path/
   }

   # and have them all have same expirations
   location / {
       try_files $uri $uri/ /index.html;
   }
...
}

Offdisabilita la memorizzazione nella cache, epoch(per l'epoca unix) risulta sempre il recupero della risorsa, maximposta la data sul valore massimo del browser.

L'immagine ~ / corrisponde a qualsiasi tipo di immagine.

Maggiori informazioni sulle mappe nginx su http://nginx.org/en/docs/http/ngx_http_map_module.html .


Si noti che se $sent_http_content_typeè "text/css;charset=UTF-8"l'espressione sopra fallirà.
Pachanka,

2

Se hai un posto che ospita tutti i tuoi file statici, qualcosa del genere farà ...

 location /static {
            your/location/to/static/files/static;
            expires 30d;
            add_header Cache-Control "public";
    }

La risposta accettata ha fatto sì che nginx non trovasse nessuno dei miei file statici. Non so davvero perché, ma questa è una semplice alternativa.


Ho votato per questo, ma assicurati di aggiungere la /staticcartella (qualunque cosa tu abbia impostato in posizione) alla fine dell'alias (subito dopo .../filesnell'esempio).
Miro J.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.