[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. 자산을 미리 컴파일하십시오.
  2. 서버의 자산을 브라우저에 제공합니다.

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