Heroku, Grails: отсутствуют ресурсы при использовании нескольких веб-динамов - PullRequest
2 голосов
/ 16 января 2012

Я создал приложение Grails и загрузил его в heroku.
Если я использую 'heroku scale web = 1' , все выглядит нормально.Но если я запускаю 'heroku scale web = 2' , некоторые статические ресурсы исчезают.
Из журналов я могу выяснить, что все статические ресурсы из web.2 dyno отсутствуют.Но этот dyno запускается без ошибок.

Как я могу решить эту проблему?

Ответы [ 3 ]

5 голосов
/ 31 января 2012

https://github.com/grails-plugins/grails-resources/pull/11

По словам владельца плагина ресурсов Марка Палмера, они игнорируют проверку старых ссылок на статические ресурсы.

Итак, это проявляется какпроблема с балансировкой нагрузки, которая возникнет в любой системе, если вы не используете липкое распределение нагрузки (как в случае с Heroku).Вот что происходит в случае с Heroku:

  1. Запрос поступает на someapp.com
  2. index.gsp подается с сервера приложений 1, web.1 index.gsp содержит
  3. Плагин ресурсов генерирует отображение из /static/js/resource.js в /js/resource.js на web.1
  4. Клиент делает запрос для /static/js/resource.js
  5. Запрос направляется на другой сервер приложений, web.2
  6. / static / js / resource.js не был сопоставлен на web.2 и 404s

Из моего исследования лучше всего объявлять ваши ресурсы в файле ресурсов.

См. Следующее:

http://grails -plugins.github.com / grails-resources /guide / 3.% 20Declaring% 20resources.html

Это сообщит серверу приложений во время загрузки, что ресурс существует заранее, избегая процесса загрузки adhoc.

Например,как и в моем предыдущем письме, MyResources.groovy будет выглядеть так:

modules = { 
  application { 
    resource url:'js/application.js' 
    resource url:'js/ui.geo_autocomplete.js' 
  } 
}

Итак, вы можете использовать любой из двухметоды - явно указывать ресурсы или использовать загрузку adhoc (добавьте следующее в ваш Config.groovy:)

grails.resources.adhoc.includes = [] 
grails.resources.adhoc.excludes = ["*"]

Это существенно отключает обработку ресурсов adhoc.

1 голос
/ 18 декабря 2012

У меня были похожие проблемы с файлами изображений, которые не могут быть напрямую определены в ApplicationResources.groovy. Я нашел обходной путь для этого, хотя:

Добавьте файл CSS в ApplicationResources.groovy, в котором есть несколько определений классов для всех ресурсов, которые необходимо загрузить, следующим образом:

.asset1 {
  background: url('path/to/image1.png');
}
.asset2 {
  background: url('path/to/image2.png');
}
.asset3 {
  background: url('path/to/image3.png');
}
...

А в ApplicationResources.groovy определите следующее:

modules = {
    ...
    myModule {
        resource url: 'path/to/assets.css'
    }
    ...
}

Теперь плагин Resources уже имеет те пути, готовые для изображений, когда модуль, содержащий файл CSS, загружается из представления GSP или если на изображения динамически ссылаются из JavaScript и т. Д.

Скорее хаки, но это работает. Протестировал это в Heroku с двумя динамо.

0 голосов
/ 16 января 2012

Все активы, которые находятся в вашем слаге (ваш git push) должны присутствовать на всех динамо.Это активы, которые были загружены?Если это так, Heroku имеет эффективно доступную только для чтения файловую систему (http://devcenter.heroku.com/articles/dyno-isolation#ephemeral_filesystem),, поэтому вам необходимо убедиться, что эти активы идут к чему-то внешнему, например Amazons S3.

http://grails.org/plugin/amazon-s3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...