#ruby-on-rails #heroku #amazon-cloudfront
#ruby-on-rails #heroku #amazon-cloudfront
Вопрос:
Я запускаю приложение Rails 4 на Heroku, используя CloudFront в качестве CDN для некоторых ресурсов изображения. У меня есть производственное приложение и промежуточное приложение. В CloudFront у меня есть отдельные дистрибутивы для производства и промежуточной обработки. Я предварительно компилирую ресурсы локально и отправляю их в Heroku.
Мой production.rb имеет следующее:
# production.rb
config.action_controller.asset_host = 'xxxx.cloudfront.net'
# Use special staging CDN if pushing to staging
config.action_controller.asset_host = 'yyyy.cloudfront.net' if ENV['PUSH_TO'] amp;amp; ENV['PUSH_TO'].downcase == 'staging'
Итак, я указываю другой asset_host в зависимости от того, нажимаю ли я на промежуточный или производственный.
Однако, когда я нажимаю на промежуточную обработку, результирующие изображения отсутствуют и указывают на производственный дистрибутив CloudFront.
Я поместил в приложение несколько инструкций протоколирования, чтобы убедиться, что config.action_controller.asset_host
установлено правильное промежуточное распределение.
Если я вручную получу доступ к URL-адресам изображений, сменив хост с производственного на промежуточный, они будут работать, поэтому я знаю, что отпечатки пальцев обновлены правильно.
Мой файл .css.scss.erb содержит:
.importance1 { background-image: image-url("<%= asset_path 'myImage1.png' %>"); }
Я убедился, что очистил свои public/assets
и tmp
папки.
Итак, что может быть причиной того, что мои ресурсы при постановке указывают на неправильный дистрибутив CloudFront?
Обновление: я обнаружил, что только ресурсы, на которые ссылаются asset_path
из других ресурсов (файлов css), получают неправильный хост CDN. Между тем, ресурсы, которые отображаются из представлений с использованием image_tag
, работают нормально. Это заставляет меня думать, что проблема заключается в том, что во время предварительной компиляции ресурсов из asset_path
файлов CSS выводятся неправильные URL-адреса. Не уверен, почему. Я звоню rake RAILS_ENV=production assets:clean assets:precompile
и, как я уже сказал, я попытался изменить production.rb, чтобы явно использовать промежуточный CDN только в качестве теста, и он все еще не использовал его (ресурсы по-прежнему указывают на производственный CDN.)
Комментарии:
1. Просто для проверки работоспособности, вы пробовали использовать if / else?
2. Я еще больше проверил работоспособность и заменил настройки на просто
config.action_controller.asset_host = 'yyyy.cloudfront.net'
, и все еще мои изображения указывают на ‘xxxx.cloudfront.net ‘.
Ответ №1:
Я, наконец, разобрался со своей проблемой.. Несмотря на то, что мое промежуточное приложение использовало правильный asset_host, а файлы обслуживались с правильного CDN, URL-адреса в этих файлах указывали на неправильный CDN (производственный CDN.). Это было связано с тем, что при предварительной компиляции ресурсов переменная PUSH_TO env не была установлена, поэтому логика в моем production.rb использовала производственный CDN. Решение состояло в том, чтобы сделать:
rake RAILS_ENV=production PUSH_TO=staging assets:clean assets:precompile
Ключом был PUSH_TO =staging там. Это устранило все мои проблемы!
Ответ №2:
Ясно, что ваше условие в этой строке возвращает false:
config.action_controller.asset_host = 'yyyy.cloudfront.net' if ENV['PUSH_TO'] amp;amp; ENV['PUSH_TO'].downcase == 'staging'
Либо это, либо asset_host не позволит устанавливать дважды. Не знаю, почему это было бы. Возможно, было бы лучше поместить это в блок else.
Так что исправьте это, и все будет готово.
НО….
Не для этого ли предназначены файлы среды? Почему у вас нет этого в вашем файле environments / staging.rb? Если это не работает там, вы изменили конфигурацию своей среды и как бы нарушили всю цель нескольких сред…
Комментарии:
1. Как я уже сказал, я ввел операторы регистрации, чтобы проверить значение
config.action_controller.asset_host
, и оно правильно установлено для промежуточного хоста. Я подключился к консоли rails и также проверил значение. Я даже полностью заменил эти настройки конфигурации и просто ушелconfig.action_controller.asset_host = 'yyyy.cloudfront.net'
, и все еще изображения указывали наxxxx.cloudfront.net
.