2011-06-04 39 views
8

我在Ubuntu 8.04上運行帶有Nginx 1.0.0和Passenger 3.0.7的Rails 3站點。Nginx錯誤日誌中的消息「X-Accel-Mapping header missing」

在我的Nginx error.log中,我開始看到消息X-Accel-Mapping header missing相當多。谷歌搜索導致我的文檔Rack::SendfileNginx docs

現在,我的應用程序可以通過多個域名來訪問,我在我的應用程序中使用send_file提供一些特定於他們是從,例如要求域文件,如果你來domain1.com/favicon.ico我仰望的圖標在public/websites/domain1/favicon.ico 。 這工作正常,我不認爲我需要/希望得到Nginx參與並創建一些私人區域,我在那裏存儲這些文件,如Rack::Sendfile docs中的示例所示。

我該如何擺脫錯誤信息?

+1

嗨@zoopzoop - 你有沒有想過這個?我在我的託管在heroku上的rails 3應用程序(使用ngnix)時遇到了同樣的問題。 – 2011-06-30 11:50:19

+0

同樣的問題也在這裏。 Passenger 3.0.7,nginx 1.0.0,Ubuntu。 – randomguy 2011-07-12 09:41:58

+0

不,我還沒有找到解決方案。 – 2011-09-20 12:03:11

回答

14

此消息意味着Rack::Sendfile禁用X-Accel-Redirect你,因爲你已經失蹤nginx.conf它的配置...

我使用Nginx的+客運 + 的Rails 3.1

從這個網頁我已經想通了

收集到的信息:

http://wiki.nginx.org/X-accel

http://greenlegos.wordpress.com/2011/09/12/sending-files-with-nginx-x-accel-redirect

http://code.google.com/p/substruct/source/browse/trunk/gems/rack-1.1.0/lib/rack/sendfile.rb?r=355

Serving Large Files Through Nginx via Rails 2.3 Using x-sendfile

我有控制器,它映射/download/1請求存儲文件哪些有他們的o目錄結構如下:storage/00/00/1,storage/01/0f/15等。所以我需要通過這個Rails,但是我需要使用send_file方法,它將使用X-Accel-Redirect通過nginx直接發送最終文件到瀏覽器

中的代碼我有這樣的:

send_file(
    '/var/www/shared/storage/00/00/01', 
    :disposition => :inline, 
    :filename => @file.name # an absolute path to the file which you want to send 
) 

我取代了這個例子的目的

名現在我必須將這些行添加到我的nginx.conf

server { 
    # ... 

    passenger_set_cgi_param HTTP_X_ACCEL_MAPPING /var/www/shared/storage/=/storage/; 
    passenger_pass_header X-Accel-Redirect; 

    location /storage { 
     root /var/www/shared; 
     internal; 
    } 

    # ... 
} 

從外界看不到路徑/storage,它只是內部的。

Rack::Sendfile獲取標頭X-Accel-Mapping,從中提取路徑並用/storage...替換/var/www/shared/storage。然後,它吐出修改的報頭:

X-Accel-Redirect: /storage/00/00/01 

然後由nginx的處理。

我可以看到這個工作正常,因爲文件下載速度比以前快100倍,並且日誌中沒有顯示錯誤。

希望這會有所幫助。

+0

這聽起來不錯,但並沒有真正幫助我,因爲,正如我在我的問題中提到的,我既沒有也不想擁有一個包含所有文件的文件夾......有些存儲在我的Rails應用程序中的一個目錄中,部署,一些從其他地方被動態下載並存儲在tmp文件夾等。我只想使用send_file而不必設置包含所有文件的單獨文件夾。可能? – 2011-09-20 12:02:49

+0

是的,在這種情況下,您必須爲每個人創建一個內部位置......但我不知道X-Accel-Mapping的格式是什麼...或者,您可以添加該內部位置像「/ = /」... – 2011-09-20 12:14:10

1

我們使用了類似的技術如在降噪說明,但我取代包含所有與描述包含含有文件的文件夾的文件夾的正則表達式的文件的「硬編碼」目錄中。

聽起來很難,是嗎?只要看看這些(/etc/nginx/sites-available/my.web.site)一看:

location /assets/(.+-[a-z0-9]+\.\w+) { 
    root /home/user/my.web.site/public/assets/$1; 
    internal; 
} 

location /images/(.+)(\?.*)? { 
    root /home/user/my.web.site/public/images/$1; 
    internal; 
} 

這應該與此檢查使用:

location/{ 
    # ... 

    if (-f $request_filename) { 
     expires max; 
     break; 
    } 

    # ... 
} 

防止導軌加工靜力學。