Eu tenho um servidor de produção com nginx - > unicórnio - > trilhos. Eu pré-compilo os 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 recursos application.css e application.js terão a impressão digital errada. Por exemplo, o auxiliar de trilhos stylesheet_link_tag 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 coincidem).
Solução de problemas, eu pré-compilou os recursos em minha máquina local e a impressão digital corresponde à impressão digital pré-compilada em meu servidor. Além disso, quando rodando localmente com o webrick no modo de produção, tudo funciona. Eu tentei rodar o webrick no meu servidor, o que funcionou, me fazendo pensar que o unicórnio é a fonte do problema.
Eu resolvi esse problema iniciando o unicorn com a opção --no-default-middleware (ou -N), e isso faz com que o unicórnio se comporte como esperado com relação aos recursos pré-compilados. Meu entendimento é que isso diz ao unicórnio para não carregar um conjunto padrão de middleware do Rack que, de outra forma, seria carregado. No entanto, eu realmente não entendo porque 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 um tema de terceiros
Atualização:
O motivo pelo qual eu não acredito que isso seja um problema do nginx é que quando eu solicito a página de um navegador e visualizo a origem, o nome do arquivo para o arquivo application.css tem uma impressão digital, -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, em seguida, solicita ao servidor o arquivo .css ... nginx recebe essa solicitação, mas não consegue encontrar o arquivo .css, porque na verdade ele não está lá, portanto o nginx está se comportando conforme o esperado .
A impressão digital é gerada duas vezes: uma vez quando eu pré-compilo os ativos, o que está funcionando corretamente (bem claro), e está acontecendo sem envolvimento de unicórnios. E uma segunda vez, quando o rails no contexto de um trabalhador unicórnio vê o helper stylesheet_link_tag e on-the-fly calcula a impressão digital (acho que isso é o que está fazendo), que por algum motivo está gerando uma impressão digital incorreta. Esse mesmo processo acontece se eu substituir o unicórnio pelo webrick exatamente no mesmo servidor, mas neste caso as impressões digitais coincidem. Se eu começar o unicórnio com a bandeira -N, as impressões digitais combinam, mas não sei por que isso faz diferença, e não sei por que ninguém mais parece ter que fazer isso.