
Ich möchte mit Nginx einige statische Dateien zwischenspeichern. Aber irgendwie kriege ich es nicht zum Laufen.
Das ist mein nginx.conf
:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
#multi_accept on;
}
http {
#GZIP
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types application/javascript application/json application/ld+json application/xml font/eot font/otf font/ttf text/css text/javascript text/plain text/xml;
# SERVERS
server {
listen 80;
server_name example.com;
if ($http_host ~* ^www\.(.*)$ )
{
return 301 https://$1$request_uri;
}
return 301 https://$http_host$request_uri;
}
server {
listen 443 ssl;
if ($http_host ~* ^www\.(.*)$ )
{
return 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;
server_name example.com;
# Pass all traffic to my webapplication
location / {
proxy_set_header Host $host;
proxy_pass http://localhost:8080;
}
#Browser caching
location ~* \.(js|css)$ {
expires 180d;
add_header Pragma "public";
add_header Cache-Control "public";
}
location ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
expires 365d;
add_header Pragma "public";
add_header Cache-Control "public";
}
}
}
Das Problem liegt im Teil „Browser-Caching“. Wenn ich diesen Codeblock aktiviere, wird meine Site zwar geladen, aber alle CSS-Dateien, JavaScript-Dateien und Bilder geben eine 404-Fehlermeldung zurück. Es ist, als würden diese Dateien meine ignorieren location /
.
Ich konnte dieses Problem durch Kopieren/Einfügen lösen
proxy_set_header Host $host;
proxy_pass http://localhost:8080;
in allen meinen location
-Blöcken, aber das ist nicht wirklich elegant und hat dazu geführt, dass sich meine Site tatsächlich viel langsamer anfühlte ...
location
Ich habe auch versucht, die beiden -Blöcke für das Browser-Caching in den Block zu verschieben, location \
sodass letzterer als „übergeordneter“ Block fungiert. Das hat das Verhalten von Bildern usw. jedoch nicht geändert und 404 zurückgegeben.
Wie konfiguriere ich das Caching statischer Dateien in Nginx?
Bearbeiten:
Ich habe meinem -Block Folgendes hinzugefügt http
:
map $uri $cache_control {
~/Website/assets/media/images "public, no-transform";
}
map $uri $expire {
~/Website/assets/media/images 365d;
}
Habe meinem -Block Folgendes hinzugefügt server
:
expires $expire;
add_header Cache-Control $cache_control;
Es wird nichts zwischengespeichert.
Antwort1
Wenn Sie Ihre statischen Assets nicht direkt aus dem Dateisystem über nginx bereitstellen können, wie @TeroKilkanen vorschlägt, können Sie eine ähnliche Technik verwenden wie inDasAntwort:
map $uri $expire {
~\.(?:j|cs)s$ 180d;
~\.(?:jpe?g|png|webp|woff2?|ttf)$ 365d;
default off;
}
map $uri $cache_control {
~\.(?:js|css|jpe?g|png|webp|woff2?|ttf)$ public;
}
server {
...
expires $expire;
add_header Pragma $cache_control;
add_header Cache-Control $cache_control;
...
}
Wenn Ihre Anforderungs-URI nicht mit dem regulären Ausdruck übereinstimmt, $cache_control
hat die Variable einen leeren Wert und Nginx fügt seiner Antwort überhaupt keinen Header Pragma
hinzu .Cache-Control
Antwort2
Dies beantwortet zwar nicht wirklich Ihre Frage, zeigt aber eine bevorzugte Möglichkeit, statische Assets mit nginx bereitzustellen.
Da Sie die Webanwendung anscheinend auf demselben Host ausführen, empfehle ich Ihnen, die statischen Dateien direkt mit nginx bereitzustellen.
root /path/to/webroot;
location ~* \.(js|jss)$ {
expires 180d;
add_header Pragma "public";
add_header Cache-Control "public;
try_files $uri =404;
}
location ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
expires 365d;
add_header Pragma "public";
add_header Cache-Control "public";
try_files $uri =404;
}
Dieses hat immer noch doppelte Definitionen für das Caching. Sie können einige der Duplikate beseitigen, indem Sie Anweisungen in einer separaten Datei angeben und include
diese Datei in Ihre Konfiguration einbinden.
Sie würden Folgendes in proxy_header.conf
die Datei eingeben:
add_header Pragma "public";
add_header Cache-Control "public";
Und in Ihrer Konfiguration:
location ~* ... {
include /path/to/webroot;
expires 365d;
}