Как я могу обслуживать активы в /public, которые не являются частью конвейера активов с помощью puma/nginx?
Это вопрос AWS, я использую платформу Ruby 2.2 (Puma).
Мои скомпилированные активы (в/public/assets) обслуживаются, как ожидалось. Другие активы в /public не обслуживаются (404).
Где это настроить? Является ли это проблемой nginx? или проблема puma?
Или это просто проблема с изображением AWS?
Здесь показан живой пример (robots.txt должен быть подан из корня):
http://staging.us-west-2.elasticbeanstalk.com/public/robots.txt
Также стоит отметить, что изображение платформы Passenger по умолчанию работает из коробки.
Ответы
Ответ 1
Итак, я использую ту же самую среду, и я нашел решение с небольшим google fu:
С рельсами 4+ в файле:
/config/environments/production.rb
вы должны найти следующие строки в верхней части файла
# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?
Это все прекрасно и денди, так как мы используем пассажира (nginx или apache), но Puma не справляется с этим для нас:)
Чтобы решить эту проблему...
В вашей консоли AWS перейдите на панель управления эластичного бобового стека для рассматриваемого проекта и нажмите "Конфигурация" в меню слева.
Теперь щелкните значок маленькой шестерни в поле "Конфигурация программного обеспечения"
Теперь вы должны увидеть таблицу в разделе "Свойства среды", введите "RAILS_SERVE_STATIC_FILES" в новое поле в поле "Имя свойства", затем введите "true" (без кавычек) в поле значения, нажмите "Применить".
Viola! Теперь ваш проект обслуживает статические файлы:)
Ответ 2
В случае, если это помогает кому-либо, или кто-то знает, как его улучшить, вот конфигурация nginx, которая, наконец, заставила меня работать для меня. В /.ebextensions/01_files.config:
files:
"/etc/nginx/conf.d/webapp_healthd.conf" :
mode: "000755"
owner: root
group: root
content: |
upstream my_app {
server unix:///var/run/puma/my_app.sock;
}
log_format healthd '$msec"$uri"'
'$status"$request_time"$upstream_response_time"'
'$http_x_forwarded_for';
server {
listen 80;
server_name _ localhost; # need to listen to localhost for worker tier
root /var/app/current/public;
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
set $year $1;
set $month $2;
set $day $3;
set $hour $4;
}
access_log /var/log/nginx/access.log main;
access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;
try_files $uri/index.html $uri @my_app;
location @my_app {
proxy_pass http://my_app; # match the name of upstream directive which is defined above
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /assets {
alias /var/app/current/public/assets;
gzip_static on;
gzip on;
expires max;
add_header Cache-Control public;
}
}
"/opt/elasticbeanstalk/hooks/appdeploy/post/03_restart_nginx.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
rm /etc/nginx/conf.d/webapp_healthd.conf.bak
rm /etc/nginx/conf.d/custom.conf
service nginx restart
Ответ 3
Мне нужно просто запустить bundle exec rake assets:precompile