[ruby-on-rails] Rails 4 : 프로덕션에서로드되지 않는 자산
내 앱을 프로덕션에 넣으려고하는데 이미지 및 CSS 자산 경로가 작동하지 않습니다.
현재 내가하고있는 일은 다음과 같습니다.
- 이미지 자산은 /app/assets/images/image.jpg에 있습니다.
- 스타일 시트는 /app/assets/stylesheets/style.css에 있습니다.
- 내 레이아웃에서 다음과 같이 css 파일을 참조합니다.
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
- 유니콘을 다시 시작하기 전에 실행
RAILS_ENV=production bundle exec rake assets:precompile
하고 성공하고public/assets
디렉토리에 지문 파일이 표시됩니다 .
내 사이트를 탐색 할 때에 대한 404 찾을 수 없음 오류가 발생합니다 mysite.com/stylesheets/styles.css
.
내가 뭘 잘못하고 있죠?
업데이트 :
내 레이아웃에서 다음과 같이 보입니다.
<%= stylesheet_link_tag "bootstrap.min", media: "all", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
생성 소스는 다음과 같습니다.
<link data-turbolinks-track="true" href="/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/stylesheets/styles.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/application-0c647c942c6eff10ad92f1f2b0c64efe.js"></script>
Rails가 컴파일 된 CSS 파일을 제대로 찾지 못하는 것 같습니다. 그러나 자바 스크립트에서 올바르게 작동하는 이유 는 매우 혼란 스럽 습니다 ( /assets/****.js
경로에 유의하십시오 ).
답변
Rails 4에서는 아래와 같이 변경해야합니다.
config.assets.compile = true
config.assets.precompile = ['*.js', '*.css', '*.css.erb']
이것은 나와 함께 작동합니다. 다음 명령을 사용하여 자산을 사전 컴파일하십시오.
RAILS_ENV=production bundle exec rake assets:precompile
행운을 빕니다!
답변
방금 동일한 문제가 발생하여 config / environments / production.rb에서이 설정을 찾았습니다.
# Rails 4:
config.serve_static_assets = false
# Or for Rails 5:
config.public_file_server.enabled = false
그것을 다음으로 변경 true
작동 . 기본적으로 Rails는 파일을 Rails 앱에 프록시하는 대신 공용 폴더에서 파일에 대한 요청을 처리하도록 프런트 엔드 웹 서버를 구성했을 것으로 예상합니다. 아마도 CSS 스타일 시트가 아닌 자바 스크립트 파일에 대해이 작업을 수행 했습니까?
( Rails 5 문서 참조 ). 주석에서 언급했듯이 Rails 5 RAILS_SERVE_STATIC_FILES
에서는 기본 설정이이므로 환경 변수 만 설정할 수 있습니다 config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
.
답변
에서 /config/environments/production.rb
나는이를 추가했다 :
Rails.application.config.assets.precompile += %w( *.js ^[^_]*.css *.css.erb )
.js는 이미 미리 컴파일되었지만 어쨌든 추가했습니다. .css 및 .css.erb는 분명히 자동으로 발생하지 않습니다. ^[^_]
에서 제외 된 부분 지문이 컴파일되는 – 그것은 정규 표현식입니다.
문서에 자산 파이프 라인이 기본적으로 활성화되어 있다고 명확하게 명시되어 있지만 자바 스크립트에만 적용되는 사실을 명확히 밝히지 않은 것은 약간 실망 스럽습니다.
답변
: 나는 변경하여이 문제를 해결할 수있었습니다
config.assets.compile = false
에
config.assets.compile = true
의/config/environments/production.rb
업데이트 (2018 년 6 월 24 일) : 사용중인 Sprockets 버전이 2.12.5, 3.7.2 또는 4.0.0.beta8 미만인 경우이 방법을 사용 하면 보안 취약점이 발생합니다.
답변
Rails 5의 경우 다음 구성 코드를 활성화해야합니다.
config.public_file_server.enabled = true
기본적으로 Rails 5는 다음 구성 라인과 함께 제공됩니다.
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
따라서 환경 변수 RAILS_SERVE_STATIC_FILES
를 true 로 설정해야 합니다.
답변
프로덕션에서 자산을 제공하려면 다음 두 가지를 수행해야합니다.
- 자산을 미리 컴파일하십시오.
- 서버의 자산을 브라우저에 제공합니다.
1) 자산을 사전 컴파일하기 위해 몇 가지 선택 사항이 있습니다.
-
당신은 실행할 수 있습니다
rake assets:precompile
다음, 소스 코드 제어 (자식)에 커밋, 로컬 컴퓨터에 예를 들어, 카피 스트라 노를 들어, 배포 프로그램을 실행합니다. 이것은 사전 컴파일 된 자산을 SCM에 커밋하는 좋은 방법이 아닙니다. -
RAILS_ENV=production rake assets:precompile
서버를 다시 시작하기 전에 Rails 앱을 프로덕션에 배포 할 때마다 대상 서버에서 실행되는 레이크 작업을 작성할 수 있습니다 .
카피 스트라 노 작업의 코드는 다음과 유사합니다.
on roles(:app) do
if DEPLOY_ENV == 'production'
execute("cd #{DEPLOY_TO_DIR}/current && RAILS_ENV=production rvm #{ruby_string} do rake assets:precompile")
end
end
2) 이제 프로덕션 서버에 자산이 있으므로 브라우저에 제공해야합니다.
다시 말하지만, 몇 가지 선택이 있습니다.
-
config / environments / production.rb 에서 제공하는 Rails 정적 파일을 사용 설정합니다.
config.serve_static_assets = true # old or config.serve_static_files = true # new
Rails를 사용하여 정적 파일을 제공하면 Rails 앱 성능이 저하됩니다.
-
정적 파일을 제공하도록 nginx (또는 Apache)를 구성합니다.
예를 들어 Puma와 함께 작동하도록 구성된 내 nginx는 다음과 같습니다.
location ~ ^/(assets|images|fonts)/(.*)$ { alias /var/www/foster_care/current/public/$1/$2; gzip on; expires max; add_header Cache-Control public; }
답변
Rails 4는 더 이상 자산의 지문이 아닌 버전을 생성하지 않습니다. stylesheets / style.css가 생성되지 않습니다.
사용하면 stylesheet_link_tag
스타일 시트에 대한 올바른 링크가 생성됩니다.
또한 미리 컴파일 된 항목의 목록이 styles.css
있어야합니다.config.assets.precompile