Capistrano 和 XSendFile 配置

Capistrano and XSendFile configuration

我正在尝试使用 Apache 2.2、Passenger 4.0.59 和 XSendFile 0.12 配置 Rails 生产服务器。应用程序通过 Capistrano 部署。

部署的应用程序生成(可能很大)PDF 到 #{Rails.root}/tmp 并使用 send_file 提供此文件。

问题是 Capistrano 使用符号链接指向当前部署的应用程序版本。另一方面,如果文件的真实位置在文档根目录之外,XSendFile 会取消引用符号链接并拒绝提供文件,即使 XSendFilePath 允许也是如此。 Apache 的 error.log 声明:

(20023)The given path was above the root path: xsendfile: unable to find file: /resolved/path/to/file.pdf

当我将 PassengerAppRootXSendFilePath 设置为当前应用程序版本的真实位置时,一切正常,路径上没有符号链接。但在下一次部署之前没关系,这需要重新配置 apache。不是很有用。

我应该如何配置 Capistrano 部署和 XSendFile 参数以使其协同工作?

我尝试了 Capistrano & X-Sendfile and in mod_xsendfile with symbolic links 中描述的 ln -nFs 的解决方案,但 none 有效。

我终于成功了。给 XSendFile

遇到问题的人的一些提示
  1. 我将 XSendFilePath 设置为用户的 $HOME$HOME 的路径上没有符号链接,因此可以正常工作。从功能和安全的角度来看,我可以接受这一点,但这显然是一种解决方法。
  2. 请注意 XSendFilePath 对包含多个斜杠的路径敏感 /like//this。我正在使用 apache 宏,同时从几个宏参数中连接 XSendFilePath 参数时,我放置了一些过时的斜杠。这导致 XSendFile 拒绝发送文件。

祝你好运!