Rails 4 - 使用 Cloudfront 和 Paperclip
Rails 4 - use cloudfront with Paperclip
我有一个应用程序已经可以(在暂存和生产中)使用 S3。
现在我们希望它与 cloudfront 一起工作。
我发现出于某种原因我在两个地方有回形针定义:
/confog/initializers/paperclip.rb:
if Rails.env.production? || Rails.env.staging? || true
Paperclip::Attachment.default_options[:url] = ':s3_domain_url'
Paperclip::Attachment.default_options[:path] = '/:class/:attachment/:id_partition/:style/:filename'
end
/config/environments/staging.rb 和 /config/environments/production.rb
config.paperclip_defaults = {
:storage => :s3,
:s3_credentials => {
:bucket => s3_options[:bucket],
:access_key_id => s3_options[:access_key_id],
:secret_access_key => s3_options[:secret_access_key]
}
}
(我从我拥有的 s3.yml 文件加载 s3_options
)
第一个问题 - 这两个地方是否有必要(或者说是错误的)配置?
使用这个配置我得到这个:
> Profile.last.image.url
=> "https://mybucket.s3.amazonaws.com/profiles/images/000/000/001/original/someimage.jpg?1439912576"
我的目标:
获取 cloundfront url 而不是 s3.
我尝试了几种方法:
添加到paperclip.rb这一行:
Paperclip::Attachment.default_options[:s3_host_alias] = "xxxxx.cloudfront.net"
(其中 xxxxx
代表云端哈希)。
结果:没有任何改变。
添加到paperclip.rb这一行:
Paperclip::Attachment.default_options[:s3_host_name] = "xxxxx.cloudfront.net"
(其中 xxxxx
代表云端哈希)。
结果:回形针连接存储桶名称之前它:
> Profile.last.image.url
=> "https://mybucket.xxxxx.cloudfront.net/profiles/images/000/000/001/original/someimage.jpg?1439912576"
在paperclip.rb中禁用配置并将这些行添加到环境配置文件中(我在[=116上试过了=]):
config.paperclip_defaults = {
:
:s3_credentials => {
:
:
:url => "xxxxx.cloudfront.net",
:s3_host_name => "xxxxx.cloudfront.net",
:path => '/:class/:attachment/:id_partition/:style/:filename',
}
}
结果:回形针连接存储桶名称在之后:
> Profile.last.image.url
=> "https://xxxxx.cloudfront.net/mybucket/profiles/images/000/000/001/original/someimage.jpg?1439912576"
如 (3),但将这些行添加到更高一级:
config.paperclip_defaults = {
:storage => :s3,
:url => "xxxxx.cloudfront.net",
:s3_host_name => "xxxxx.cloudfront.net",
:path => '/:class/:attachment/:id_partition/:style/:filename',
:s3_credentials => {
:
:
}
}
结果:同(3).
简单地说,无论我在 :s3_host_name
中放入什么,paperclip 在某个地方连接存储桶名称。
有什么想法吗?
比我想象的要容易。
看起来回形针使用 :url
作为字符串或作为指示如何构造 url.
的符号的参考
在我的 /config/environments/staging.rb 和 /config/environments/production.rb 文件中,我现在有:
config.paperclip_defaults = {
:storage => :s3,
:url => ':s3_alias_url',
:s3_host_alias => "xxxxx.cloudfront.net",
:path => '/:class/:attachment/:id_partition/:style/:filename',
:s3_credentials => {
:
:
}
}
结束使用:
amazon = AppConfiguration.for :amazon
config.paperclip_defaults = {
storage: :s3,
url: ':s3_alias_url',
s3_host_alias: amazon.cloudfront,
path: '/:class/:attachment/:id_partition/:style/:filename',
s3_protocol: :https,
s3_credentials: {
bucket: amazon.s3_bucket_name,
access_key_id: amazon.aws_access_key_id,
secret_access_key: amazon.aws_secret_access_key
}
}
替代 AppConfiguration
config.paperclip_defaults = {
storage: :s3,
url: ':s3_alias_url',
s3_host_alias: ENV['AMAZON_CLOUDFRONT'],
path: '/:class/:attachment/:id_partition/:style/:filename',
s3_protocol: :https,
s3_credentials: {
bucket: ENV['AMAZON_S3_BUCKET_NAME'],
access_key_id: ENV['AMAZON_AWS_ACCESS_KEY_ID'],
secret_access_key: ENV['AMAZON_AWS_SECRET_ACCESS_KEY']
}
}
重要的是,不要在这里使用Rails.application.secrets。在 rails 4.1.8 至少
上加载配置文件时不可用
我有一个应用程序已经可以(在暂存和生产中)使用 S3。
现在我们希望它与 cloudfront 一起工作。
我发现出于某种原因我在两个地方有回形针定义:
/confog/initializers/paperclip.rb:
if Rails.env.production? || Rails.env.staging? || true
Paperclip::Attachment.default_options[:url] = ':s3_domain_url'
Paperclip::Attachment.default_options[:path] = '/:class/:attachment/:id_partition/:style/:filename'
end
/config/environments/staging.rb 和 /config/environments/production.rb
config.paperclip_defaults = {
:storage => :s3,
:s3_credentials => {
:bucket => s3_options[:bucket],
:access_key_id => s3_options[:access_key_id],
:secret_access_key => s3_options[:secret_access_key]
}
}
(我从我拥有的 s3.yml 文件加载 s3_options
)
第一个问题 - 这两个地方是否有必要(或者说是错误的)配置?
使用这个配置我得到这个:
> Profile.last.image.url
=> "https://mybucket.s3.amazonaws.com/profiles/images/000/000/001/original/someimage.jpg?1439912576"
我的目标: 获取 cloundfront url 而不是 s3.
我尝试了几种方法:
添加到paperclip.rb这一行:
Paperclip::Attachment.default_options[:s3_host_alias] = "xxxxx.cloudfront.net"
(其中
xxxxx
代表云端哈希)。
结果:没有任何改变。添加到paperclip.rb这一行:
Paperclip::Attachment.default_options[:s3_host_name] = "xxxxx.cloudfront.net"
(其中
xxxxx
代表云端哈希)。
结果:回形针连接存储桶名称之前它:> Profile.last.image.url => "https://mybucket.xxxxx.cloudfront.net/profiles/images/000/000/001/original/someimage.jpg?1439912576"
在paperclip.rb中禁用配置并将这些行添加到环境配置文件中(我在[=116上试过了=]):
config.paperclip_defaults = { : :s3_credentials => { : : :url => "xxxxx.cloudfront.net", :s3_host_name => "xxxxx.cloudfront.net", :path => '/:class/:attachment/:id_partition/:style/:filename', } }
结果:回形针连接存储桶名称在之后:
> Profile.last.image.url => "https://xxxxx.cloudfront.net/mybucket/profiles/images/000/000/001/original/someimage.jpg?1439912576"
如 (3),但将这些行添加到更高一级:
config.paperclip_defaults = { :storage => :s3, :url => "xxxxx.cloudfront.net", :s3_host_name => "xxxxx.cloudfront.net", :path => '/:class/:attachment/:id_partition/:style/:filename', :s3_credentials => { : : } }
结果:同(3).
简单地说,无论我在 :s3_host_name
中放入什么,paperclip 在某个地方连接存储桶名称。
有什么想法吗?
比我想象的要容易。
看起来回形针使用 :url
作为字符串或作为指示如何构造 url.
在我的 /config/environments/staging.rb 和 /config/environments/production.rb 文件中,我现在有:
config.paperclip_defaults = {
:storage => :s3,
:url => ':s3_alias_url',
:s3_host_alias => "xxxxx.cloudfront.net",
:path => '/:class/:attachment/:id_partition/:style/:filename',
:s3_credentials => {
:
:
}
}
结束使用:
amazon = AppConfiguration.for :amazon
config.paperclip_defaults = {
storage: :s3,
url: ':s3_alias_url',
s3_host_alias: amazon.cloudfront,
path: '/:class/:attachment/:id_partition/:style/:filename',
s3_protocol: :https,
s3_credentials: {
bucket: amazon.s3_bucket_name,
access_key_id: amazon.aws_access_key_id,
secret_access_key: amazon.aws_secret_access_key
}
}
替代 AppConfiguration
config.paperclip_defaults = {
storage: :s3,
url: ':s3_alias_url',
s3_host_alias: ENV['AMAZON_CLOUDFRONT'],
path: '/:class/:attachment/:id_partition/:style/:filename',
s3_protocol: :https,
s3_credentials: {
bucket: ENV['AMAZON_S3_BUCKET_NAME'],
access_key_id: ENV['AMAZON_AWS_ACCESS_KEY_ID'],
secret_access_key: ENV['AMAZON_AWS_SECRET_ACCESS_KEY']
}
}
重要的是,不要在这里使用Rails.application.secrets。在 rails 4.1.8 至少
上加载配置文件时不可用