Estamos atualizando para o Fedora 18. Nós implantamos nosso aplicativo Rails, e ele funciona como esperado, exceto para baixar arquivos zip de relatórios. Funciona no nosso servidor de produção existente (Fedora 15).
Estamos usando XSendFile
para enviar os arquivos zip. Não funciona quando os arquivos estão localizados em /tmp
, mas funciona em outras circunstâncias.
Os arquivos zip são gerados usando Tempfile.open
em Ruby, que cria um arquivo em /tmp
por padrão. No entanto, o Apache nos dá um erro 404 e um erro como este em error_log
:
[Thu May 02 11:33:18.010388 2013] [:error] [pid ...] (2)No such file or directory: [client ...] xsendfile: cannot open file: /tmp/..., referer: https://...
A primeira coisa que verificamos é a nossa configuração. É isso que temos:
XSendFile on
XSendFilePath /tmp
Isso parece estar correto dado os documentos - /tmp
é usado até mesmo no exemplo.
Começamos a tentar diminuir o problema. Nós começamos a forçar o aplicativo Rails a servir outros arquivos, codificando o caminho. Cada vez, nós mudávamos o diretório para XSendFilePath
na configuração do Apache e o caminho do arquivo usado no aplicativo Rails.
Resultados:
fails: /tmp/hello.zip
works: /var/www/html/rails_production/current/public/hello.zip
works: /home/capistrano/hello2.zip
fails: /tmp/test-xsendfile/hello3.zip
works: /tmp2/hello4.zip
Nos casos de falha, as permissões foram definidas para 777 apache: apache, o que pareceria bastante liberal. Os casos de trabalho não exigiam essas permissões, no entanto.
Como suspeitamos que o caminho /tmp
seja o problema, fizemos /tmp2
com as mesmas permissões e propriedade ( drwxrwxrwt.
e root:root
). O contexto do SELinux para /tmp2
foi alterado para ser idêntico usando chcon
.
Mesmo com essas alterações, XSendFile
funciona com /tmp2
. Isso faz com que o problema pareça ser um problema de configuração do Apache. Podemos resolver isso, mas preferimos não fazer isso.
O que estamos perdendo deixa /tmp2
funcionar, mas não /tmp
?
mod_xsendfile
0.12 (RPM do Fedora 18, não é algo que compilamos) OBSERVAÇÃO: estamos usando mod_security
, mas não está no modo de imposição.
Tags apache-2.2 httpd