유니콘이 제공하는 레일은 사전 컴파일된 자산에 대해 잘못된 지문을 생성합니다.

유니콘이 제공하는 레일은 사전 컴파일된 자산에 대해 잘못된 지문을 생성합니다.

nginx -> 유니콘 -> 레일이 있는 프로덕션 서버가 있습니다. 파일 이름에 지문(해시)이 추가된 자산을 public/assets에 넣는 자산을 사전 컴파일합니다. 그러나 웹페이지가 요청되면 application.css 및 application.js 자산에 대한 참조에 잘못된 지문이 표시됩니다. 예를 들어, 레일즈 도우미 stylesheet_link_tag는 요청된 지문이 미리 컴파일된 지문과 일치하지 않기 때문에 서버의 public/assets에 존재하지 않는 파일 이름을 생성합니다. 이미지 자산이 제대로 작동합니다(지문이 일치함).

이 문제를 해결하면서 로컬 컴퓨터에 자산을 미리 컴파일했는데 지문이 서버에 미리 컴파일된 지문과 일치합니다. 또한 프로덕션 모드에서 webrick을 사용하여 로컬로 실행하면 모든 것이 작동합니다. 그런 다음 내 서버에서 webrick을 실행해 보았는데 작동이 되었고 유니콘이 문제의 원인이라고 생각하게 되었습니다.

--no-default-middleware(또는 -N) 옵션을 사용하여 unicorn을 시작하여 이 문제를 해결했습니다. 이렇게 하면 unicorn이 미리 컴파일된 자산과 관련하여 예상대로 작동하게 됩니다. 제가 이해한 바에 따르면 이는 유니콘이 로드할 기본 Rack 미들웨어 세트를 로드하지 않도록 지시하는 것입니다. 그러나 이것이 왜 문제를 해결하는지, 애초에 무엇이 잘못되고 있는지 이해하지 못합니다. 무슨 일이야?

세부 사항: Ubuntu 12.04, Rails 4.0.1, Ruby 2.1.0, 타사 테마가 있는 부트스트랩 3.0

업데이트:

이것이 nginx 문제라고 생각하지 않는 이유는 브라우저에서 페이지를 요청한 다음 소스를 볼 때 application.css 파일의 파일 이름에 지문이 있어서 실제로 application-3855b1928b94aa5bff5e1dac1aa56882처럼 보이기 때문입니다. CSS. 이는 내 서버에 있는 파일의 실제 지문과 일치하지 않습니다. 내 로컬 개발 컴퓨터에서 동일한 지문을 얻었기 때문에 서버의 지문이 정확하다고 확신합니다. 따라서 클라이언트는 웹 페이지를 로드한 다음 서버에 .css 파일을 요청합니다. nginx는 해당 요청을 받았지만 .css 파일이 실제로 없기 때문에 찾을 수 없습니다. 따라서 nginx는 예상대로 작동합니다. .

지문은 두 번 생성됩니다. 한 번은 자산을 사전 컴파일할 때 올바르게 작동하고(확실히) 유니콘의 개입 없이 발생합니다. 두 번째로, 유니콘 작업자의 맥락에서 레일이 stylesheet_link_tag 도우미를 보고 즉석에서 지문을 계산할 때(이것이 하는 일이라고 생각합니다) 어떤 이유로 잘못된 지문이 생성됩니다. 동일한 서버에서 유니콘을 webrick으로 교체하는 경우에도 동일한 프로세스가 발생하지만 이 경우 지문이 일치합니다. -N 플래그를 사용하여 유니콘을 시작하면 지문이 일치하지만 이것이 왜 차이를 만드는지 모르겠고 왜 다른 누구도 이 작업을 수행하지 않아도 되는 것 같은지 모르겠습니다.

답변1

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

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

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

RAILS_ENV=production bundle exec rake assets:precompile

~에서https://stackoverflow.com/questions/18700219/rails-4-assets-not-loading-in-production

관련 정보