问题描述
我试图做的X SENDFILE工作与Capistrano的服务我沉重的附件。我发现X SENDFILE不与符号链接工作。我怎么能处理由Capistrano的符号链接的文件夹里面的文件呢?
I'm trying to make X-Sendfile work for serving my heavy attachments with capistrano. I found that X-Sendfile is not working with symlinks. How could I handle the files inside a folder symlinked by Capistrano so?
我的Web服务器的Apache2 +乘客
my web server is apache2 + passenger
在我的 production.rb 的:
config.action_dispatch.x_sendfile_header = "X-Sendfile"
在我的控制器动作的:
filename = File.join([Rails.root, "private/videos", @lesson.link_video1 + ".mp4"])
response.headers["X-Sendfile"]= filename
send_file filename, :disposition => :inline, :stream => true, :x_sendfile => true
render nothing: true
我的文件系统结构的(其中一个 - >代表符号链接和缩进意味着子文件夹):
my filesystem structure (where a "->" stands for "symlink" and indentation means subfolder):
/var/www/myproject
releases/
....
current/ -> /var/www/myproject/releases/xxxxxxxxxxxx
app/
public/
private/
videos/ -> /home/ftp_user/videos
我的 Apache的配置的
XSendFile上
XSendFilePath / #also试图/家庭/ FTP_USER /视频
my apache config XSendFile on XSendFilePath / #also tried /home/ftp_user/videos
我的应用程序能够为小文件,但大的,它提供了NoMemoryError(无法分配内存)
My application is able to serve small files, but with big ones it gives a NoMemoryError(failed to allocate memory)
我觉得它不使用X发送文件,因为该行为是相同的,如果我不使用它。
I think it's not using x-sendfile, because the behavior is the same if I don't use it.
下面是我试图服务于文件的响应头
Here are the response headers of the file i'm trying to serve
Accept-Ranges:bytes
Cache-Control:private
Connection:Keep-Alive
Content-Disposition:inline
Content-Range:bytes 0-1265/980720989
Content-Transfer-Encoding:binary
Content-Type:video/mp4
Date:Sat, 01 Mar 2014 13:24:19 GMT
ETag:"70b7da582d090774f6e42d4e44ae3ba5"
Keep-Alive:timeout=5, max=97
Server:Apache/2.4.6 (Ubuntu)
Status:200 OK
Transfer-Encoding:chunked
X-Content-Type-Options:nosniff
X-Frame-Options:SAMEORIGIN
X-Powered-By:Phusion Passenger 4.0.37
X-Request-Id:22ff0a30-c2fa-43fe-87c6-b9a5e7da12f2
X-Runtime:0.008150
X-UA-Compatible:chrome=1
X-XSS-Protection:1; mode=block
我真的不知道该如何调试它,如果它是一个的X sendfile的问题,或者如果我试图做的符号链接问题的东西是不可能的。
I really don't know how to debug it, if it's a x-sendfile issue or if I'm trying to do something impossible for the symlinks problem
编辑:
继在接受一个建议的答案,它的神奇开始工作!
我创建了一个Capistrano的任务是这样的:
I created a capistrano task this way:
task :storage_links do
on roles(:web), in: :sequence, wait: 2 do
#creo i link simbolici alle risorse
within "/var/www/my_application/current/private" do
execute :ln, "-nFs", "/home/ftp_user/videos"
end
end
end
我没finalize_update后运行它,所以我在重新启动后运行,由专人。
I didn't manage to run it after finalize_update, so i run it after the restart, by hand.
和我纠正这样我的Apache配置:
And i corrected my apache configuration in this way:
XSendFilePath /var/www/my_application
(我是指的x发送文件到FTP文件夹之前)
(before i was pointing x-sendfile to the ftp folder)
在我的响应头也现在的X SENDFILE没有出现,我得到了一个206 - 部分内容,但一切似乎工作和apache在正确的方式(也很沉重文件)送达文件
In my response headers also now X-Sendfile is not appearing, and i got a 206 - partial content, but everything seems to work and apache is serving files in the right way (also very heavy files).
我知道这可能是一个安全问题,但我会尽量把它指向我的应用程序的原因,而是指向当前符号链接的最后一个版本是行不通的。
I know this can be a security issue, but i will try to point it to the last release of my application cause pointing it to the current symlink is not working.
推荐答案
也许我找到了解决办法。你是如何让你的符号链接?
Maybe I found a solution. How did you make your symlinks?
也许你做了 LN -S
,这是不够的。
maybe you did ln -s
, and it's not enough
他们建议使用 LN -nFs
,所以他承认它是你在链接的目录
Here they suggest using ln -nFs
, so he recognizes it's a directory that you are linking in
这篇关于Capistrano酒店&安培;的X SENDFILE的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!