Rails 4 : 프로덕션에서로드되지 않는 자산


116

내 앱을 프로덕션에 넣으려고하는데 이미지 및 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경로에 유의하십시오 ).


CSS 파일을로드하는 방법을 알려 주실 수 있습니까? 을 사용하는 대신 하드 링크를 시도한 것 같습니다 stylesheet_link_tag.
kik

1
위에 추가되었습니다. 내가 뭘<%= stylesheet_link_tag "style", media: "all", "data-turbolinks-track" => true %>
emersonthis

좋아, 그래서 나는 두 가지를 추천 할 것이다 : 1.이 줄이 경로로 쓰여진 경우 생성 된 소스를 확인 public/assets하고 2. 어딘가에 그 css 파일 (아마도 하드 코딩 된)을로드하려는 다른 명령이 없는지 다시 확인
kik

.erb를 사용하는 것이 문제가된다고 말할 수는 없습니다. 왜냐하면 절대 그렇게하지 않기 때문 .home {background: #FFF url(<%= image_path 'hippopotamus.jpg' %>) no-repeat; }입니다 .home {background: #FFF url(image-path('hippopotamus.jpg')) no-repeat; }. 실제로 스프로킷에서 . 도움이된다면 시도해 볼 수 있습니다.
kik

.erb 확장자를 추가하지 않고도 내 CSS 파일에서 해당 참조를 동적으로 만들 수 있다는 말입니까? 개발 모드에있을 때 링크가 끊어지는 것을 원하지 않았기 때문에 변경했습니다.
emersonthis

답변:


105

Rails 4에서는 아래와 같이 변경해야합니다.

config.assets.compile = true
config.assets.precompile =  ['*.js', '*.css', '*.css.erb'] 

이것은 나와 함께 작동합니다. 다음 명령을 사용하여 자산을 사전 컴파일하십시오.

RAILS_ENV=production bundle exec rake assets:precompile

행운을 빕니다!


11
config.assets.compile을 true로 설정하면 프로덕션 성능이 저하 될 것이라고 생각했습니다. 또한 css.erb? 누가 사용합니까? 그리고 sass와 커피는 어떻습니까?
ahnbizcad

coffee 및 sass 파일이 요청되면 coffee-script 및 sass-rails gem에서 제공하는 프로세서에 의해 처리 된 다음 각각 JavaScript 및 CSS로 브라우저에 다시 전송됩니다.
Rameshwar Vyevhare

1
이 문제는 Rails 4에서 이미 해결되었으므로 turbo-sprocket-rails3 gem을 사용할 필요가 없습니다.
Rameshwar Vyevhare 2014 년

4
죄송합니다. 제 질문에 답하기 위해 말씀하신 내용을 연결할 수 없습니다.
ahnbizcad

1
일반적으로 프로덕션 서버를 실행할 때 Apache 또는 nginx 웹 서버 뒤에서 Passenger 또는 unicorn 또는 puma를 사용하여 Rails를 실행합니다. Apache 또는 nginx가 정적 파일 (js, css, 이미지)을 제공하고 Rails 애플리케이션 서버 (puma, unicorn)가 Rails 코드 및 템플릿을 제공하도록하는 것이 좋습니다. 이렇게하려면을 끄고 config.serve_static_filesApache 및 nginx에서 별칭을 구성하여 assets.
Châu Hồng Lĩnh 2016-06-05

85

방금 동일한 문제가 발생하여 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?.


1
DEPRECATION WARNING : 역할을 명확히하기 위해 구성 옵션의 config.serve_static_assets이름이로 변경되었습니다 config.serve_static_files(단지 public폴더의 모든 항목을 제공 할 수 있으며 자산 파이프 라인과 관련이 없음). 이 serve_static_assets별칭은 Rails 5.0에서 제거됩니다. 그에 따라 구성 파일을 마이그레이션하십시오.
yekta

이전에 내가이 문제에 직면했을 때 그 선을 바꾸면 해결되었지만 이제는 다시 직면하고 있습니다 (이 상황에서 어떻게 계속해서 끝나는 지 모르겠습니다.). 이것만으로는 충분하지 않습니다. 무엇이 잘못되었는지에 대한 더 많은 제안이 있습니까?
IIllIIll

2
이것은 받아 들여진 대답이어야합니다. config.serve_static_filesRails 4.2config.public_file_server.enabledRails 5 에 있지만 . @see github.com/heroku/rails_serve_static_assets/blob/master/lib/...
루카스 넬슨

3
Rails 5.0.0.1 config / environments / production.rb에는 config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?SCM에 체크인 된 코드를 변경하지 않고도 환경에 맞게 다르게 설정할 수 있습니다.
tobinjim

활성화하려면 : "export RAILS_SERVE_STATIC_FILES ="그런 다음 "rails s -e production"을 실행합니다. 비활성화하려면 "unset RAILS_SERVE_STATIC_FILES"
Alfredo Osorio

32

에서 /config/environments/production.rb나는이를 추가했다 :

Rails.application.config.assets.precompile += %w( *.js ^[^_]*.css *.css.erb )

.js는 이미 미리 컴파일되었지만 어쨌든 추가했습니다. .css 및 .css.erb는 분명히 자동으로 발생하지 않습니다. ^[^_]에서 제외 된 부분 지문이 컴파일되는 - 그것은 정규 표현식입니다.

문서에 자산 파이프 라인이 기본적으로 활성화되어 있다고 명확하게 명시되어 있지만 자바 스크립트에만 적용되는 사실을 명확히 밝히지 않은 것은 약간 실망 스럽습니다.


config.assets.precompile에 styles.css를 추가해야합니다
Frederick Cheung

23

: 나는 변경하여이 문제를 해결할 수있었습니다 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 미만인 경우이 방법을 사용 하면 보안 취약점이 발생합니다.


7
이것은 Rails가 CDN에서 자산을로드하는 대신에 자산을 컴파일하고 있다는 것을 의미하지 않습니까?
Benjamin Oakes 2014 년

예 @BenjaminOakes, 그의는 내가 원하는 것을
Yanofsky

2
이 모드는 더 많은 메모리를 사용하고 기본값보다 성능이 떨어지며 권장되지 않습니다. nginx 프록시를 사용하는 것이 좋습니다.
yekta

16

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
Rails 5의 경우 passenger_env_var RAILS_SERVE_STATIC_FILES true;nginx.conf 파일에서 내 앱의 위치 블록을 설정해야 합니다.
Martin Velez

10

프로덕션에서 자산을 제공하려면 다음 두 가지를 수행해야합니다.

  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;
    }

4

Rails 4는 더 이상 자산의 지문이 아닌 버전을 생성하지 않습니다. stylesheets / style.css가 생성되지 않습니다.

사용하면 stylesheet_link_tag스타일 시트에 대한 올바른 링크가 생성됩니다.

또한 미리 컴파일 된 항목의 목록이 styles.css있어야합니다.config.assets.precompile


/ public / assets / 디렉토리에 지문 파일이 있습니다. 내 레이아웃에 다음이 있습니다. <%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>이것이 올바르지 않습니까?`
emersonthis

어떤 이유로 소스를 볼 때 프로덕션 배포가 여전히 원본 파일을 가리키고 <link data-turbolinks-track="true" href="https://stackoverflow.com/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />있지만 javascript 파일은 정확합니다! .js 파일에는 동일한 구성이 작동하지만 .css에는 작동하지 않는 이유를 이해할 수 없습니다.
emersonthis

Rails 5.0.0.beta3에서는 다음 경고가 표시됩니다. DEPRECATION WARNING : serve_static_files은 더 이상 사용되지 않으며 Rails 5.1에서 제거됩니다. public_file_server.enabled = true대신 사용하십시오 .
GMA

@emersonthis 동일! JS는 완벽하게로드되지만 일부 css 파일은 404. 이 문제를 해결 했습니까?
IvRRimUm

자산 파이프 라인 구성에는 거의 항상 문제가 있습니다. 기본 위치가 아닌 위치에 파일이있는 경우 거의 확실히 문제이며 첫 번째 답변과 같은 것을 사용하여 자산 파이프 라인에이를 알려야합니다.
emersonthis

3

Production.rb 파일 라인 변경

config.assets.compile = false

으로

config.assets.compile = true

또한 추가

config.assets.precompile =  ['*.js', '*.css', '*.css.erb']

왜 컴파일합니까? 우리는 그것이 실행되는 동안 프로덕션에서 컴파일한다고 생각하지 않습니다
James Tan

1
절대로하지 마십시오! 프로덕션에서 config.assets.compile을 true로 설정하는 사람은 누구나 촬영해야합니다.
bkunzi01

2

Ubuntu Server 14.04 , Ruby 2.2.1Rails 4.2.4를 실행 중 입니다. DigitalOcean 의 배포 과정을 따랐고 모든 것이 잘 진행되었지만 브라우저로 이동하여 VPS의 IP 주소를 입력하면 내 앱이로드되지만 스타일과 자바 스크립트.

앱은 UnicornNginx 와 함께 실행됩니다 . 이 문제를 해결하기 위해 내 사용자 'deployer' 와 함께 SSH를 사용하여 내 서버를 입력하고 '/ home / deployer / apps / blog'인 내 앱 경로로 이동 하여 다음 명령을 실행합니다.

RAILS_ENV=production bin/rake assets:precompile

그런 다음 VPS를 다시 시작하면됩니다! 그것은 나를 위해 작동합니다!

다른 사람에게 유용 할 수 있기를 바랍니다!


2

사전 컴파일이 설정되어 있으면 필요하지 않습니다.

config.assets.compile = true

이것은 자산을 라이브로 제공하는 것입니다.

문제는 개발 비밀 키베이스 만 config/secrets.yml

development:
    secret_key_base: '83d141eeb181032f4070ae7b1b27d9ff'

프로덕션 환경에 대한 진입 필요


1
당신이 필요 config.assets.precompile = ['*.js', '*.css', '*.css.erb'] 하고 실행하는 다른 답변에서 언급했듯이RAILS_ENV=production bundle exec rake assets:precompile
xxjjnn

1
이를 잘 작성하지 못했습니다 반면, 생산에 라이브, 아주 느린 자산의 편집을 가능하게
제임스 탄

2

하지 말아야 할 것 :

위의 동료 중 일부는 다음과 같이 권장합니다.

config.serve_static_assets = true  ## DON”T DO THIS!! 
config.public_file_server.enabled = true ## DON”T DO THIS!!

Rails 자산 파이프 라인은 위의 접근 방식에 대해 말합니다.

이 모드는 더 많은 메모리를 사용하고 기본값보다 성능이 떨어지며 권장되지 않습니다. 여기를 참조하십시오 : ( http://edgeguides.rubyonrails.org/asset_pipeline.html#live-compilation )

해야 할 일 :

자산을 미리 컴파일하십시오.

RAILS_ENV=production rake assets:precompile

갈퀴 작업으로 할 수 있습니다.


그래도 빌드 아티팩트를 git에 추가하는 이유는 무엇입니까? 당신은 당신의 빌드 프로세스에 레이크 작업을 추가하고 (당신이 uglifier과가 Gzip으로 압축이있는 당신이해야 특히 경우) 대규모 gitspam를 방지 할 수 있습니다
Dr.Strangelove

@ Dr.Strangelove 귀하의 의견을 보내 주셔서 감사합니다-나는 그것에 대해 충분히 알지 못합니다-: 원본 게시물을 정교하게 / 편집 할 수 있습니까?
BKSpurgeon

1

파일 컴파일을위한 기본 매처에는 gem을 포함한 app / assets 폴더의 application.js, application.css 및 모든 비 JS / CSS 파일 (모든 이미지 자산이 자동으로 포함됨)이 포함됩니다.

포함 할 다른 매니페스트 또는 개별 스타일 시트 및 JavaScript 파일이있는 경우 config / initializers / assets.rb의 사전 컴파일 배열에 추가 할 수 있습니다.

Rails.application.config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js']

http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets


1

먼저 자산을 확인하십시오. 자산 사전 컴파일에 오류가있을 수 있습니다.

프로덕션 ENV에서 자산을 사전 컴파일하려면 다음 명령을 실행하십시오.

RAILS_ENV=production rake assets:precompile

오류가 표시되면 먼저 제거하고

"정의되지 않은 변수"오류가 발생하는 경우 다른 파일에서 사용하기 전에 해당 변수 파일을로드하십시오.

예:

@import "variables";
@import "style";

application.rb 파일 세트에서 자산의 사전 컴파일 순서

예:

config.assets.precompile += [ 'application.js', 'admin.js', 'admin/events.js', 'admin/gallery.js', 'frontendgallery.js']

config.assets.precompile += [ 'application.css', 'admin.css','admin/events.css', 'admin/gallery.css', 'frontendgallery.css']

1

발견 :

역할을 명확히하기 위해 구성 옵션의 config.serve_static_assets이름이로 변경되었습니다 config.serve_static_files.

에서 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?

따라서 env RAILS_SERVE_STATIC_FILES또는 using Nginx을 설정 하여 정적 파일을 제공하십시오. 추가 config.serve_static_assets = true는 계속 작동하지만 나중에 제거됩니다.


1

시간이 오래 걸리고 종종 시간 초과 될 수 있으므로 capistrano가 자산을 미리 컴파일하도록하는 것은 권장되지 않습니다. 로컬 자산을 미리 컴파일하십시오.

첫째, config / application.rb에 설정 config.assets.initialize_on_precompile = false 한 다음 로컬을 수행하십시오. RAILS_ENV=production bin/rake assets:precompile 하고 해당 공용 / 자산을 git에 추가합니다.

및 config / environments / development.rb, 사전 컴파일 된 자산을 사용하지 않도록 자산 경로를 변경하십시오.

config.assets.prefix = '/dev-assets'

db 연결 문제가 있으면 db를 사용하는 초기화 프로그램이 있음을 의미합니다. 한 가지 방법은 production.rb를 production2 .rb 로 복제하여 새 환경을 설정하고 database.yml에서 개발 db 설정으로 production2 환경을 추가 하는 것입니다. 그런 다음

RAILS_ENV=production2 bin/rake assets:precompile

예를 들어 ckeditor와 같은 자산에 여전히 문제가있는 경우 js 파일을 config / initializers / assets.rb에 추가하십시오.

Rails.application.config.assets.precompile += %w( ckeditor.js )


0

내가 틀렸을 지 모르지만 변화를 권하는 사람들

config.assets.compile = true

이 줄의 주석은 다음과 같습니다. # 사전 컴파일 된 자산이 누락 된 경우 자산 파이프 라인으로 대체하지 마십시오.

이것은 이것을 true로 설정하면 문제를 수정하는 것이 아니라 문제를 우회하고 매번 파이프 라인을 실행한다는 것을 의미합니다. 이것은 확실히 당신의 성능을 죽이고 파이프 라인의 목적을 무너 뜨려야합니까?

나는 이와 동일한 오류가 있었고 그것은 레일스가 알지 못하는 하위 폴더에서 실행되는 응용 프로그램 때문이었습니다.

그래서 내 CSS 파일은 home / subfolder / app / public / ....하지만 rails는 home / app / public / ...

앱을 하위 폴더 밖으로 이동하거나 레일에 하위 폴더에 있다고 알려주세요.


0
location ~ ^/assets/ {
  expires 1y;
  add_header Cache-Control public;
  add_header ETag "";
}

이것은 프로덕션에서 문제를 해결했습니다. nginx 구성에 넣으십시오.


0

RAILS_ENV=production bundle exec rake assets:precompile성공한 곳에서도 같은 문제에 직면 했지만 예상대로 작동하지 않았습니다.
여기서 유니콘이 주범이라는 것을 알았습니다.

귀하의 경우와 마찬가지로 자산을 컴파일 한 후 유니콘을 다시 시작했습니다. 유니콘이 다시 시작되면 마스터 프로세스가 아닌 작업자 프로세스 만 다시 시작되는 것으로 나타났습니다.
이것이 올바른 자산이 제공되지 않는 주된 이유입니다.

나중에 자산을 컴파일 한 후 unicorn을 중지하고 시작하여 unicorn 마스터 프로세스도 다시 시작되고 올바른 자산이 제공됩니다.
유니콘을 중지하고 시작하면 유니콘을 다시 시작할 때와 비교할 때 약 10 초의 다운 타임이 발생합니다. 이것은 장기 솔루션이 유니콘에서 퓨마로 이동하는 경우 사용할 수있는 해결 방법입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.