Nginx: proxy_cache für Bilder funktioniert nicht

oicfar

Lt. Commander
Registriert
Juni 2020
Beiträge
1.900
Hi,

gestern habe ich schon viele Stunden damit verbracht rauszubekommen, wieso meine Cache Konfiguration in Nginx nicht greift. Finde aber keine Lösung.

Konfiguration:

Code:
user  nginx;

...

load_module modules/ngx_http_image_filter_module.so;

...

http {
    ...

    proxy_cache_path /var/cache/nginx_gitea/ levels=1:2 keys_zone=mylocal_cache:10M max_size=1G inactive=2d use_temp_path=off;

    ...

    map $request_uri $width {
        default 28;
        ~\?size=512 512;
        ~\?size=420 420;
        ~\?size=280 280;
        ~\?size=140 140;
        ~\?size=100 100;
        ~\?size=84 84;
        ~\?size=72 72;
        ~\?size=56 56;
        ~\?size=48 48;
        ~\?size=45 45;
        ~\?size=40 40;
        ~\?size=28 28;
        ~\?size=24 24;
    }

    include /etc/nginx/conf.d/*.conf;
}

Code:
server {

    ...

    location ~ "^/proxytest/(?<image>[0-9a-f]+)$" {
        alias /usr/share/nginx/proxytest/$image;

        proxy_cache_key "$image$width";
        proxy_cache mylocal_cache;
        proxy_cache_valid any 60m;

        add_header X-Avatar-Filename $image;
        add_header X-Avatar-Width $width;
        add_header X-Debug-Header "Testing X-Proxy-Cache: [$upstream_cache_status]";
        add_header X-Cache $upstream_cache_status;
        add_header X-Cache-Status $upstream_status;

        add_header Cache-Control "public, max-age=600";

        image_filter test;
        #image_filter_buffer 10M;
        image_filter_jpeg_quality 75;
        image_filter resize $width -;
        image_filter_buffer 1M;
        access_log /var/log/nginx/gitea_avatars.access.log;
        error_log /var/log/nginx/gitea_avatars.error.log error;
    }

    ...
}

Die URL sieht wie folgt aus: http://server/proxytest/1111?size=100

Das Bild wird skaliert zurück geliefert. D.h. das funktioniert. Aber in /var/cache/nginx_gitea/ werden keine skalierten Bilder abgelegt. Und in der Response ist X-Cache und X-Cache-Status nicht vorhanden, da beide leer sind. Und leere Header-Elemente werden nicht gesendet. Man sieht an X-Debug-Header, dass $upstream_cache_status leer ist.

1697711982250.png


Schon durch die Skalierung ist mein ursprüngliches Problem gelöst.

Aber wieso greift das Caching nicht?
 
@zenokortin ich will ja auf dem Server das skalierte Bild speichern. D.h. es soll nicht beim nächsten Aufruf neu skaliert werden sondern das zuvor generierte ausgelesen und ausgeliefert werden. D.h. mit meiner Konfiguration erwarte ich, dass das unter /var/cache/nginx_gitea/ abgelegt wird.
 
Ändert ja nichts an meiner Aussage, teste mal die Auflösung in den Filenamen zu nehmen und es entsprechend statisch auszuliefern.

also http://server/proxytest/1111-100.jpg

Wo kommen die skalierten Bilder eigentlich her?

edit: Querystring war wohl schon der richtige Ansatz. Dein Querystring als $width wird wohl das Problem sein
proxy_cache_key $scheme$proxy_host$uri$is_args$args;
oder
proxy_cache_key $scheme$proxy_host$uri$is_args$arg_parameter$arg_parameter2;
 
Zuletzt bearbeitet:
zenokortin schrieb:
Ändert ja nichts an meiner Aussage, teste mal die Auflösung in den Filenamen zu nehmen und es entsprechend statisch auszuliefern.

also http://server/proxytest/1111-100.jpg

Wo kommen die skalierten Bilder eigentlich her?
Musst du dir den 2. Spoiler anschauen.

alias /usr/share/nginx/proxytest/$image;

Das auslesen und die Skalierung funktionieren. Nur das Skalierte Bild wird nicht im Cache Ordner abgelegt. In den error.log's ist auch kein Fehler.

Auch die anderen proxy-cache-key's bringen keine Änderung.

1697731868719.png
 
Ich bin bei nginx nicht wirklich drin.

Aber ich hab auf Anhieb mehrere Anleitungen (eins, zwei) auf Google gefunden, die sich in einigen Details von deiner Lösung unterscheiden.
 
  • Gefällt mir
Reaktionen: oicfar
@zenokortin die 1. variante habe ich auch schon gestern entdeckt. Wollte aber nicht so recht laufen. Nun habe ich die Config bereinigt und noch mal implementiert. Nun geht es.

1697739273102.png


Und die skalierten Images sind auch da
1697739311613.png


Finde es ein wenig seltsam, dass die alias Variante nicht so wollte.

Danke!
 
  • Gefällt mir
Reaktionen: zenokortin
Zurück
Oben