为什么我们使用 XSendFile 与 /tmp 时会出现“无法打开文件”的情况?

为什么我们使用 XSendFile 与 /tmp 时会出现“无法打开文件”的情况?

我们正在升级到 Fedora 18。我们已经部署了 Rails 应用程序,并且它按预期运行,除了用于下载报告的 zip 文件。它适用于我们现有的生产服务器 (Fedora 15)。

我们用XSendFile它来发送 zip 文件。当文件位于 时,它不起作用/tmp,但在其他情况下它可以工作。

细节

zip 文件是使用Tempfile.openRuby 生成的,默认情况下会在中创建一个文件/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 应用提供其他文件。每次,我们都会更改XSendFilePathApache 配置中的目录和 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

版本

  • Apache 2.4.4
  • mod_xsendfile0.12(Fedora 18 的 RPM,不是我们编译的)

注意:我们正在使用mod_security,但它并非处于强制模式。

相关内容