Назад | Перейти на главную страницу

Почему мы получаем сообщение «Невозможно открыть файл» при использовании XSendFile с / tmp?

Мы обновляемся до 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_security, но он не в принудительном режиме.