我们正在升级到 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
?
版本
- Apache 2.4.4
mod_xsendfile
0.12(Fedora 18 的 RPM,不是我们编译的)
注意:我们正在使用mod_security
,但它并非处于强制模式。