4

我正在嘗試使X-Sendfile適用於與Capistrano一起提供重磅附件。我發現X-Sendfile不符合符號鏈接。我如何處理由Capistrano符號鏈接的文件夾內的文件?Capistrano&X-Sendfile

我的Web服務器的Apache2 +乘客

在我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 

文件系統結構(其中「 - >」代表「符號鏈接」和壓痕意味着子文件夾):

/var/www/myproject 
    releases/ 
    .... 
    current/ -> /var/www/myproject/releases/xxxxxxxxxxxx 
    app/ 
    public/ 
    private/ 
     videos/ -> /home/ftp_user/videos 

Apache配置 XSendFile上 XSendFilePath/#also試圖/家庭/ FTP_USER /視頻

我的應用程序能夠服務於小文件,但大的它給出了一個NoMemoryError(未能分配內存)

我認爲它不使用x-sendfile,因爲如果我不使用它,行爲是相同的。

下面是該文件的響應頭我試圖以服務

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的問題,或者如果我想做一些不可能的符號鏈接問題

編輯: 繼在接受一個建議的答案,它「神奇」開始工作!

我創建了一個Capistrano的任務是這樣的:

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後運行它,所以我在重新啓動後運行,由專人。

而且我糾正我的Apache配置是這樣的:

XSendFilePath /var/www/my_application 

在我的響應頭(我指着X-的sendfile到FTP文件夾之前)現在也X-SENDFILE沒有出現,並且我得到了206個部分內容,但一切似乎都奏效,而且apache以正確的方式提供文件(也是非常繁重的文件)。

我知道這可能是一個安全問題,但我會嘗試將它指向我的應用程序的最後一個版本,因爲它指向當前符號鏈接不工作。

+1

好奇鏈接爲您的Rails的,客運,Apache和X版本目錄-發送文件。此外,您的操作系統的類型和版本。我不得不遷移到一個自定義的Apache服務器二進制文件,並且從來沒有得到過X-Sendfile的工作,與你的問題相同(不是內存部分,儘管它總是小文件),儘管我總是責備二進制文件。 – Adam21e

+0

我在Ubuntu 13.10(64bit)上使用Rails 4.0.0,Passenger 4.0.37,Apache 2.4.6。希望它可以幫助你。 – sissy

回答

1

也許我找到了解決方案。你是如何製作符號鏈接的?

也許你沒有ln -s,這是不夠的

Here,他們建議用ln -nFs,所以他承認這是你在

+0

哇這是現在的工作!我會編輯我的問題來解釋我做了什麼改變!非常感謝!你救了我的一天! – sissy

+0

對我來說,它不會改變任何東西。 Apache 2.2 xsendfile 0.12在debian 7上。除非指向'PassengerAppRoot'來指示當前部署版本的應用程序的位置,而沒有路徑上的符號鏈接,否則XSendFile仍然不起作用。顯然這與Capistrano的想法不一致。有任何想法嗎? – wrzasa

+0

我終於做到了。看到這裏:http://stackoverflow.com/questions/28859649/capistrano-and-xsendfile-configuration – wrzasa