Verwenden CDN mit carrierwave + Nebel in s3 + cloudfront mit rails 3.1
Ich bin mit Nebel mit carrierwave in meiner website. Aber die Bilder laden sehr sehr langsam.
Dann will ich beschleunigen das laden der Bilder mit einem CDN.
Ich folgte diesem tutorial zum erstellen CDN für Bilder:
http://maketecheasier.com/configure-amazon-s3-as-a-content-delivery-network/2011/06/25
Ich habe jetzt meine distribution bereitgestellt für die Bilder aber ich weiß nicht, wie funktioniert das cdn. Ich habe in Initialisierungen/Nebel.rb wird die nächste Konfiguration:
CarrierWave.configure do |config|
config.fog_credentials = {
:provider => 'AWS',
:aws_access_key_id => 'key',
:aws_secret_access_key => 'key',
:region => 'eu-west-1'
}
config.fog_host = "http://da33ii2cvf53u.cloudfront.net" #config.asset_host instead of config.fog_host for new fog gem versions
config.fog_directory = 'pin-pro'
config.fog_public = false
#config.fog_attributes = {'Cache-Control' => 'max-age=315576000'}
end
Ich weiß nicht, ob dies korrekt ist, aber in meiner lokalen Maschine es nicht funktioniert gut für mich. Ich sehe das Bild, ist die gleiche Strecke wie vorher:
https://s3-eu-west-1.amazonaws.com/pin-pro/uploads/pins/medium_610cafbe-5d43-4223-ab0e-daa4990863c4.jpg?AWSAccessKeyId=AKIAIDX34WHYKB3ZKFVA&Signature=RwQriNpiRXaTxyfYVvYjsvclUa8%3D&Expires=1333203059
Wie kann ich ein CDN Nebel-Datei in carrierwave mit s3 und cloudfront?
- Wenn ich mit dieser Einstellung:
fog_host
, dann bekomme ich diese Fehlermeldung: undefined method `fog_host=' für CarrierWave::Uploader::Base:Klasse, Welche version von carrierwave sind Menschen mit? - Sollten Sie verwenden
config.asset_host
stattconfig.fog_host
. Ich habe dieses Problem in Frage zu stellen. Viel Glück! - Ja, ich habe bemerkt, dass, nachdem einige Graben 🙂 vielen Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht es aus wie Sie haben nicht Hinzugefügt, die Zeile unten, um Ihre config. Ersetzen Sie die Beispiel-Adresse unten mit Ihren cloudfront-Adresse von Amazon.
Aus der github README: https://github.com/jnicklas/carrierwave
"Können Sie Optional auch Ihre CDN-host-name in der Konfiguration. Dies wird dringend empfohlen, da ohne Sie jede Anfrage erfordert eine Suche von Daten und Informationen"
config.asset_host = "http://c000000.cdn.rackspacecloud.com"
CarrierWave wird nicht funktionieren, wenn Sie eingestellt config.fog_public = false und Punkt config.asset_host zu einer CloudFront-Verteilung. Dies dokumentiert wurde mehrere Male:
https://github.com/carrierwaveuploader/carrierwave/issues/1158
https://github.com/carrierwaveuploader/carrierwave/issues/1215
In einem aktuellen Projekt war ich glücklich mit CarrierWave zu handhaben-uploads für S3, aber wollte es zurückgeben unterzeichnet CloudFront-URL verwendet Modell.attribute_url. Ich kam mit der folgenden (zugegebenermaßen hässlichen) workaround, dass ich hoffe, dass andere davon profitieren können oder verbessern auf:
Fügen Sie die'cloudfront-signer' Edelstein zu Ihrem Projekt ein und konfigurieren Sie Sie gemäß den Anweisungen. Dann fügen Sie die folgende überschreibung der /lib/carrierwave/uploader/url.rb in eine neue Datei in config/Initialisierungen (beachten Sie die mehrere Einfügungen von AWS::CF::Signer.sign_url):
Dann überschreiben /lib/carrierwave/storage/Nebel.rb, indem Sie den folgenden, um das Ende der gleichen Datei:
Schließlich in config/Initialisierungen/carrierwave.rb:
Das ist es. Nun können Sie mit Modell.attribute_url und wird es wieder ein signiertes CloudFront-URL zu einer privaten Datei hochgeladen hat, CarrierWave, um Ihren S3-bucket.
scheint, dass amazon cdn funktioniert nicht mit
config.fog_public = false
, also private Dateien sind zugänglich nur vom s3, nicht vom cdnNach einigem suchen und mit diesen zu kämpfen, für eine lange Zeit fand ich eine Seite, die sagt, dass CarrierWave nicht unterstützt CloudFront signierte urls. CloudFront signierte urls sind anders als S3 signierte urls, die verursacht mir einige Verwirrung. Sobald ich, dass herausgefunden wurde, war es viel einfacher zu wissen, was zu tun ist.
Wenn Sie konfigurieren CarrierWave mit
config.fog_public = false
dann wird es automatisch beginnen Unterzeichnung S3 urls, aber es kann nicht konfiguriert werden, um mitFog
und CloudFront private Inhalte in der version von CarrierWave ich bin mit(1.0.0)
. Ich habe sogar versucht, mit dercarrierwave-aws
gem und das hat auch nicht geholfen.Also, was passieren würde, ist, dass CarrierWave würde, melden Sie die URL und den host würde in etwa so Aussehen:
Dass die Punkte direkt an den S3-bucket, aber ich brauchte es, um zu CloudFront. Ich brauchte die Gastgeber dann wie folgt Aussehen:
Und was würde passieren, wenn ich
config.asset_host
gleich meine CloudFront Lage ist, würde ich diese bekommen, (mit Doppel-slashes vor "uploads"):Dass auch deutlich gemacht, CarrierWave war noch nicht entwickelt, um verwendet werden, mit CloudFront. Hoffentlich werden Sie es verbessern. Dies war mein work-around. Es ist hässlich, aber es funktionierte zu tun bekommen, was ich brauchte, ohne zu modifizieren CarrierWave sich, wie ich hoffe, CarrierWave wird irgendwann hinzufügen von Unterstützung für CloudFront.
und mein CloudFront host-Teil.
cf_url = s3_url.gsub("my_bucket_name.s3-us-west-2.amazonaws.com", "s3.cloudfront_domain_name.com")
zum entfernen der S3-signiert-url an das Ende der Zeichenfolge:
non_signed_cf_url = cf_url.gsub(/\?.+/, '')
Dies ist, weil die Unterschrift falsch, denn es wurde mithilfe der API für S3 und nicht für CloudFront für die Unterzeichnung der URL.cloudfront-signer
gem:signed_cf_url = Aws::CF::Signer.sign_url(non_signed_cf_url, :expires => 1.day.from_now)
Gibt es ein paar andere Dinge, die Sie müssen sich bewusst sein, wenn man private Inhalte über CloudFront:
(Signierte URLs oder
Signed Cookies)" auf "ja"
response-content-disposition
undresponse-content-type
(ich war in der Lage, diese erfolgreich zu arbeiten, aber Sie haben url_encoded richtig.)(CNAMEs)" wenn Sie eine.
*.mp4
dass eine Signatur erforderlich ist, für alle mp4-Dateien und platziert, dass über das Standard-Verhalten. Und dann habe ich die Standard-cache-Verhalten festlegen, NICHT benötigen, signierte urls, die erlaubt, alle anderen Dateien - wie Bilder, die - öffentlich zugänglich über die CloudFront-Verteilung.