Einrichten eines Reverse-Proxys zum Zwischenspeichern von Bildern


7

Ich habe einen schnellen Python-Server geschrieben, um neu abgetastete Bilder bereitzustellen. Beispielsweise könnte eine URL ungefähr so ​​aussehen http://images.domain.com/resample/100x100/9f362e1994264321.jpg. Da das Resampling von Bildern teuer ist, ist eine Caching-Ebene erforderlich. Es scheint, als wäre ein Nginx-Reverse-Proxy eine gute Option dafür, und hier und hier scheinen gute Ausgangspunkte zu sein.

Es gibt jedoch ein Problem. Es gibt Millionen von Bildern. Wenn Sie also http://images.domain.com/resample/100x100/9f362e1994264321.jpgim Dateisystem als /home/nginx/cache/resample/100x100/9f362e1994264321.jpg(oder etwas Ähnliches) speichern , cache/resample/100x100/werden möglicherweise Millionen von Dateien darin enthalten sein, was die Dateisuche sehr ineffizient macht.

Ich beschäftige mich mit diesem Problem beim Speichern der Originalbilder, indem ich sie auf viele Unterverzeichnisse verteile, z 9f/36/9f362e1994264321.jpg. Ich bin mir jedoch nicht sicher, wie ich dasselbe mit Nginx machen könnte. Ich könnte die URL ändern, um dies ebenfalls zu tun, und ich werde es tun, wenn dies die einzige Lösung ist, aber ich möchte die URL lieber so hübsch wie möglich halten.

Kann ich das mit Nginx machen? Wenn nicht mit Nginx, kann ich etwas anderes tun, wie Lack?


nginx ist kein Cache-Server. Das einzige, was Sie tun können, sind Tricks wie das Manipulieren von Ablauf-Headern. Schau dir den Lack an.
Pause

Dies ist mit Sicherheit kein Duplikat!
Michael Hampton

Antworten:


7

Anstatt einige irrelevante Links zu googeln, sollten Sie auf jeden Fall die Dokumentation zu ngx_http_proxy_module.html gelesen haben .

Richtlinie proxy_cacheist genau das, was Sie brauchen. Die Konfiguration sollte ungefähr so ​​aussehen.

http {

    # ...

    proxy_cache_path /var/www/cache levels=1:2 keys_zone=imgcache:10m max_size=1000m inactive=720m;
    proxy_temp_path /var/www/cache/tmp;

    # ...

    server {

        # ...

        location /resample {
            proxy_pass          http://bla.bla.my.backend;
            proxy_cache         imgcache;
            #proxy_cache_key    $scheme$proxy_host$request_uri;
            #proxy_cache_valid 200 302 60m;
            #proxy_cache_valid 404 10m
        }

        # ...

    }

}

In dem /var/www/cacheOrdner wird eine Verzeichnisstruktur auf zwei Ebenen erstellt. Die zwischengespeicherte Antwort für http://mysite.com/resample/dir/file.jpg wird als MD5- proxy_cache_keyWert gespeichert . Wenn Sie beispielsweise #proxy_cache_key $scheme$proxy_host$request_uri;oben einen Kommentar abgeben, wird die Antwort in der Datei / var / www / cache / f / 08 / 8db24849a311cc3314955992686d308f zwischengespeichert

Weil MD5 ("http://bla.bla.my.backend/resample/dir/file.jpg") = 8db24849a311cc3314955992686d308f und level = 1: 2 in die dir-Struktur übersetzt wurden und die Zeichen vom letzten, ... 08f -> f / 08 / md5value gezählt wurden


1

Dies macht die Suche nach Dateien sehr ineffizient.

Das klingt nach vorzeitiger Optimierung.

Sie haben keine Informationen darüber angegeben, unter welchem ​​Betriebssystem dies ausgeführt wird. Da Sie Varnish erwähnen, gehe ich davon aus, dass dies ein Unix-Geschmack ist. Angenommen, es ist Linux (obwohl das meiste davon auch für andere Betriebssysteme gilt) ....

Haben Sie es tatsächlich gemessen und mit dem Ansatz des Umschreibens von Pfaden verglichen? Wenn Sie eine Verschlechterung feststellen, wird wahrscheinlich ein sehr altes Dateisystem ausgeführt (oder eines, das durch teilweises Patchen aktualisiert wurde). Mit ext4 oder BTRFS würde ich keinen messbaren Unterschied erwarten.

Aber das ist eher nebensächlich. Reverse-Proxys wissen, dass sie möglicherweise viele Dateien zwischenspeichern - und ordnen URL-Pfade nicht unbedingt direkt Dateisystempfaden zu.

Sie werden auf Probleme mit einer sehr großen Anzahl von Dateien stoßen, die vom Cache verwaltet werden - diese haben jedoch mit der VFS / Methodik zu tun. Das Verringern des vfs_cache_pressure sollte helfen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.