2009-07-24 91 views
3

我試圖從Apache遷移到nginx使用Passenger在兩個實例託管一個Rails應用程序。該應用程序接受一個請求,這是一個圖像 - 如果圖像存在於/ system/logos/$ requestedimage那麼它應該得到服務,或者應該允許它在Rails應用程序中生成它(如果需要的話)緩存到/ system/logos)。nginx與乘客重寫規則

在Apache中我使用了以下內容:

RewriteCond %{DOCUMENT_ROOT}/system/logos/%{REQUEST_FILENAME} -f 
RewriteRule ^/(.*)$ http://assets.clg.eve-metrics.com/system/logos/$1 

這工作得很好。資產。子域是另一個子域,但具有相同的根,只是禁用了Passenger,專門設置爲託管靜態文件(expires-wise)。

在nginx的,我使用了以下內容:

server { 
    listen 80; 
    passenger_enabled on; 
    server_name clg.eve-metrics.com www.clg.eve-metrics.com; 
    root /opt/www/clg/current/public; 
    gzip    on; 
    gzip_min_length 1000; 
    gzip_proxied  expired no-cache no-store private auth; 
    gzip_types  text/plain application/xml text/css application/javascript; 
    gzip_disable  msie6; 
    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
    } 
    if (-f $document_root/system/logos$request_filename) { 
    rewrite ^/(.*)$ http://assets.clg.eve-metrics.com/system/logos/$1 break; 
    } 
} 

這不工作這麼好。事實上,根本就是這樣。它永遠不會重定向到緩存路徑,它永遠不會碰到Rails應用程序。這就像nginx假設它是一個靜態資產,所以不會將它傳遞給Passenger。有沒有辦法阻止這種行爲,所以它擊中了應用程序?

回答

4

我的rails應用程序運行在nginx和passenger上。我已將我的rails緩存目錄從默認的/public移至/public/system/cache/。爲了使它工作,我不得不插入到我的虛擬主機配置文件這樣的:

if (-f $document_root/system/cache/$uri/index.html) { 
    rewrite (.*) /system/cache/$1/index.html break; 
} 

if (-f $document_root/system/cache/$uri.html) { 
    rewrite (.*) /system/cache/$1.html break; 
} 

我記得,我也試圖使它與$request_filename工作,但並沒有得到它的工作。與$uri,而不是嘗試,看看它是否工作:-)

+0

我有這個相同的問題,我是Nginx的新手,所以這工作完美。謝謝。 – jspooner 2012-02-16 22:30:54

+0

nginx.conf裏面有什麼指令? – Nick 2013-09-09 13:33:39

0

詹姆斯,請嘗試此配置文件 https://gist.github.com/711913 並在此位置配置注意:

location ~* \.(png|gif|jpg|jpeg|css|js|swf|ico)(\?[0-9]+)?$ { 
     access_log off; 
     expires max; 
     add_header Cache-Control public; 
    } 

乘客不會讓Rails的管理你的資產文件,如果你有正確的權限(用戶運行nginx應該有權限直接訪問文件)