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.jpg
im 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?
quelle
Antworten:
Anstatt einige irrelevante Links zu googeln, sollten Sie auf jeden Fall die Dokumentation zu ngx_http_proxy_module.html gelesen haben .
Richtlinie
proxy_cache
ist genau das, was Sie brauchen. Die Konfiguration sollte ungefähr so aussehen.In dem
/var/www/cache
Ordner wird eine Verzeichnisstruktur auf zwei Ebenen erstellt. Die zwischengespeicherte Antwort für http://mysite.com/resample/dir/file.jpg wird als MD5-proxy_cache_key
Wert 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 zwischengespeichertWeil
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 wurdenquelle
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.
quelle