9

Ich verwende Imagine über LIIPImagineBundle für Symfony2, um zwischengespeicherte Versionen von in S3 gespeicherten Bildern zu erstellen.So können Sie Cloudfront mitteilen, dass 302 Antworten von S3-Redirects nicht zwischengespeichert werden sollen oder wie dieses Problem bei der Bildzwischenspeicherung behoben werden kann

Gecachte Bilder werden in einem von CloudFront bereitgestellten S3 Web-aktivierten Bucket gespeichert. Allerdings ist die standardmäßige LIIPImagineBundle-Implementierung von S3 viel zu langsam für mich (prüfen, ob die Datei in S3 existiert und dann eine URL entweder für die zwischengespeicherte Datei oder für die Auflösungsfunktion erstellt), also habe ich meinen eigenen Arbeitsablauf ausgearbeitet:

  1. Pässe Client die Cloudfront-URL, die im Cache gespeicherte Bild sollte existieren
  2. Kunde das Bild über die Cloudfront URL anfordert, wenn es nicht dann die S3-bucket hat Regel eine Umleitung existiert, die 302 die Benutzer zu einem vorstellen, Umleitungen Webserver-Pfad, der die zwischengespeicherte Version der Datei generiert und an der entsprechenden Position unter S3
  3. Die Weiterleitung webserve 301 speichert S Der Benutzer kehrt zur URL der Cloud-Front zurück, in der das Image gespeichert ist und der Client das Image bereitstellt.

Das funktioniert gut, solange ich Cloudfront nicht verwende. Das Problem scheint zu sein, dass Cloudfront die 302-Weiterleitungsantwort zwischenspeichert (obwohl die HTTP-Spezifikation angibt, dass dies nicht der Fall sein sollte). Wenn ich also cloudfront verwende, wird der Client in einer endlosen Weiterleitungsschleife vom Webserver zur Cloudfront hin und her gesendet, und jede nachfolgende Anfrage an die Datei leitet auch dann noch an den Webserver weiter, nachdem die Datei generiert wurde.

Wenn ich S3 direkt anstelle von Cloudfront verwende, gibt es keine Probleme und diese Lösung ist solide.

Nach Amazon's documentation S3 Redirect-Regeln erlauben es mir nicht, benutzerdefinierte Header (zum Setzen von Cache-Control-Header oder dergleichen) zu spezifizieren, und ich glaube nicht, dass CloudFront erlaubt das Zwischenspeichern von Redirects zu steuern (wenn sie ist es gut versteckt). Die Ungültigkeitsoptionen von CloudFront sind so begrenzt, dass ich glaube, dass sie nicht funktionieren (kann nur 3 Objekte zu jeder Zeit ungültig machen) ... Ich könnte ein Argument an die erste Umleitung (vom Imagine-Webserver) zurückgeben, um das Endlose zu reparieren redirect (zB image.jpg? 1), aber nachfolgende Anfragen an das gleiche Objekt werden immer noch 302 zum Webserver und dann zurück zur Cloudfront, obwohl es existiert. Ich habe das Gefühl, dass es eine elegante Lösung für dieses Problem geben sollte, aber es entzieht sich mir. Jede Hilfe würde geschätzt werden !!

+0

ha ich bin auf dem gleichen Zug wie Sie –

Antwort

1

Wenn Sie wirklich CloudFront hier verwenden müssen, ist das Einzige, woran ich denken kann, dass Sie den Benutzer nicht direkt dem 302, 301 Tanz unterwerfen. Könnten Sie eine Art Proxy-Skript/-Seite in Front S3 und den ganzen Prozess einführen? (oder macht das dann den Punkt besiegen).

So eine Cache-Miss würde wie folgt aussehen:

  • Besucheranfragen Proxy-Seite durch Cloudfront.
  • Proxy Seite anfordert Bild von S3
  • Proxy Seite 302 von S3 empfängt, folgt von hier aus Stellen zurückkehrt Web Server
  • Im Idealfall nur das Bild (während es S3 aktualisieren zu lassen) oder 301 folgen zurück S3
  • Proxy-Seite zurückgibt Bild
  • Bild Besucher wird von Cloudfront gecached
+0

Interessante Lösung, danke für das Teilen! Schade, dass dies die einzige Möglichkeit ist, dies über Cloudfront zu tun. Es scheint, als würde ich besser direkt von S3 aus bedienen, als dies zu verwenden, aber danke nochmal für die Eingabe. – Pez

7

ich das gleiche Problem zu lösen, indem Sie den „Default TTL“ in Cloudfront „Cache Beha Einstellung vior "Einstellungen zu 0, aber immer noch erlaubt meine Größe Bilder zwischengespeichert werden, indem Sie die CacheControl MetaData auf der S3-Datei mit max-age=12313213.

Auf diese Weise werden Redirects nicht zwischengespeichert (Standard-TTL-Verhalten), aber meine Bilder in der Größe werden (CacheControl max-age bei s3-Cache-Treffer) sein.

+0

Interessante Lösung, danke für den Austausch – Pez