Мы обновляемся до Fedora 18. Мы развернули наше приложение Rails, и оно работает, как ожидалось. Кроме для скачивания zip-файлов отчетов. Он работает на нашем существующем производственном сервере (Fedora 15).
Мы используем XSendFile
для отправки zip-файлов. Не работает, если файлы находятся в /tmp
, но это работает в других обстоятельствах.
ZIP-файлы создаются с использованием Tempfile.open
в Ruby, который создает файл в /tmp
по умолчанию. Однако Apache выдает нам ошибку 404 и такую ошибку в 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://...
Первое, что мы проверили, это нашу конфигурацию. Вот что у нас есть:
XSendFile on
XSendFilePath /tmp
Это кажется правильным учитывая документы - /tmp
даже используется в примере.
Мы начали пытаться сузить проблему. Мы начали заставлять приложение Rails обслуживать другие файлы, жестко запрограммировав путь. Каждый раз мы меняли каталог для XSendFilePath
в конфигурации Apache и путь к файлу, используемый в приложении Rails.
Полученные результаты:
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
В неудачных случаях разрешения были установлены на 777 apache: apache, что казалось бы достаточно либеральным. Однако для рабочих случаев эти разрешения не требовались.
Потому что мы подозреваем /tmp
путь к проблеме, мы сделали /tmp2
с такими же разрешениями и владением (drwxrwxrwt.
и root:root
). Контекст SELinux для /tmp2
был изменен на идентичный с использованием chcon
.
Даже с этими изменениями, XSendFile
работает с участием /tmp2
. Это делает проблему проблемой конфигурации Apache. Мы можем обойти это, но мы бы предпочли этого не делать.
Что нам не хватает того, что позволяет /tmp2
работать, но не /tmp
?
mod_xsendfile
0.12 (RPM из Fedora 18, не то, что мы скомпилировали)ПРИМЕЧАНИЕ: мы используем mod_security
, но он не в принудительном режиме.