Eu tenho um servidor de produção com nginx -> unicorn -> rails. Eu pré-compilo ativos, o que coloca os ativos em público/ativos com uma impressão digital (hash) anexada ao nome do arquivo. No entanto, quando uma página da web é solicitada, as referências aos ativos application.css e application.js terão a impressão digital errada. Por exemplo, o auxiliar rails stylesheet_link_tag irá gerar um nome de arquivo que não existe em public/assets no servidor, porque a impressão digital solicitada não corresponde à pré-compilada. Os recursos de imagem funcionam bem (as impressões digitais correspondem).
Para solucionar isso, pré-compilei os ativos em minha máquina local e a impressão digital corresponde à impressão digital pré-compilada em meu servidor. Além disso, ao executar localmente com o webrick em modo de produção, tudo funciona. Tentei então executar o webrick no meu servidor, que funcionou, me fazendo pensar que o unicórnio é a origem do problema.
Resolvi esse problema iniciando o unicórnio com a opção --no-default-middleware (ou -N), e isso faz com que o unicórnio se comporte conforme o esperado em relação aos ativos pré-compilados. Meu entendimento é que isso diz ao unicórnio para não carregar um conjunto padrão de middleware Rack que, de outra forma, carregaria. No entanto, eu realmente não entendo por que isso resolve o problema ou o que está errado em primeiro lugar. O que está acontecendo?
Alguns detalhes: Ubuntu 12.04, Rails 4.0.1, Ruby 2.1.0, bootstrap 3.0 com tema de terceiros
Atualizar:
A razão pela qual não acredito que isso seja um problema do nginx é que quando solicito a página de um navegador e, em seguida, visualizo a fonte, o nome do arquivo application.css tem uma impressão digital, então na verdade se parece com application-3855b1928b94aa5bff5e1dac1aa56882. css. Isso não corresponde à impressão digital real do arquivo no meu servidor. Estou convencido de que a impressão digital no servidor está correta porque recebo a mesma impressão digital na minha máquina de desenvolvimento local. Portanto, o cliente está carregando a página da web e solicitando ao servidor o arquivo .css ... o nginx recebe essa solicitação, mas não consegue encontrar o arquivo .css, porque na verdade ele não está lá, então o nginx está se comportando conforme o esperado .
A impressão digital é gerada duas vezes: uma vez, quando eu pré-compilo os ativos, que está funcionando corretamente (com certeza) e sem o envolvimento do unicórnio. E uma segunda vez, quando Rails no contexto de um trabalhador unicórnio vê o auxiliar stylesheet_link_tag e calcula instantaneamente a impressão digital (acho que é isso que ele está fazendo), o que por algum motivo está gerando uma impressão digital incorreta. Esse mesmo processo acontece se eu substituir unicórnio por webrick exatamente no mesmo servidor, mas neste caso as impressões digitais coincidem. Se eu começar unicórnio com o sinalizador -N, as impressões digitais corresponderão, mas não sei por que isso faz diferença e não sei por que ninguém mais parece ter que fazer isso.
Responder1
No Rails 4 você precisa fazer as alterações abaixo
config.assets.compile = true
config.assets.precompile = ['*.js', '*.css', '*.css.erb']
Isso funciona comigo. use o seguinte comando para pré-compilar ativos
RAILS_ENV=production bundle exec rake assets:precompile
dehttps://stackoverflow.com/questions/18700219/rails-4-assets-not-loading-in-production