2014-02-05 64 views
0

我掙扎了一下用適當nginx聲明。
我想要做的是相當簡單:到*.public.domain.com任何要求,我想尋找一個緩存文件,如果一個不可用,將請求發送給乘客/ Rails的處理。nginx的try_files:404嘗試添加擴展名並回落到乘客時/ Rails的

緩存文件,如果存在的話,有.html追加到防止目錄/文件衝突,所以/test應該尋找/test.html/test/2應該尋找/test/2.html
緩存文件特定於子域​​名,因此abc.public.domain.com應顯示在/sites/abc文件夾中。

下面是相關的nginx代碼:

server { 
     # listen/SSL stuff removed for brevity 

     server_name *.public.domain.com; 

     location ~ "^(.*)\.public\.domain\.com" { 
     root /var/applications/app/current/sites/$1; 
     try_files $request_uri.html $request_uri/index.html @passenger; 
     } 

     location @passenger { 
      root /var/applications/app/current/public; 
      passenger_enabled on; 
      passenger_user www-data; 
     } 
    } 

在我的日誌文件中,我看到的nginx試圖加載文件而不.html擴展名。例如,我看到:/var/applications/app/current/sites/abc/test" failed (2: No such file or directory),但沒有嘗試加載test.html。所以看來,子域正則表達式和根聲明工作正常;添加擴展名不是。

所以這就是問題1.

問題2是,在無法找到該文件,nginx的不回落到@passenger;它拋出一個404而不是讓Rails的處理請求和提供服務的文件本身。

有關我在做什麼錯的任何想法?我讀了很多關於nginx的配置,不知道錯誤在哪裏。

回答

0

好吧,它看起來像很多擺弄我設法得到這個工作。下面是更新後的代碼:

server { 
    # listen/SSL stuff removed for brevity 

    server_name *.public.domain.com; 

    #location ~ "^(.*)\.public\.domain\.com" { 
    # root /var/applications/app/current/sites/$1; 
    # try_files $request_uri.html $request_uri/index.html @passenger; 
    #} 

    if ($host ~ "^(.*)\.public\.domain\.com") { set $subdomain $1; } 
    root /var/applications/app/current/sites/$subdomain/; 
    try_files $request_uri.html $request_uri/index.html @passenger; 

    location @passenger { 
     root /var/applications/app/current/public; 
     passenger_enabled on; 
     passenger_user www-data; 
    } 
} 

我註釋掉,以供參考舊代碼的情況下,這是對別人有用。兩個變化似乎已經做到了:

  1. 我在root後加了一個斜槓。我沒有看到在我讀過的(很多)例子中的任何一個都完成了,但在這裏似乎是必要的。 (這也是奇怪,因爲之前nginx的是找對了地方,減去擴展,所以我不知道爲什麼它會有所作爲,但我不打算有所思在嘴裏。)
  2. 我刪除了位置塊。我不能肯定發生了什麼事情,但它似乎像nginx的將嘗試在一個位置塊處理try_files之前加載一個文件匹配$ REQUEST_URI,但該塊之外時它試圖加載不存在的文件之前處理try_files

爲了記錄,我反向代理服務器,這可能與我的問題有關。有一個nginx bug早期版本與request_uritry_files之後進行模仿(檢查更改日誌是否與您有關),但它們應該在我正在運行的最新版本中修復。

這是可能的,我做了一些非常基本的錯誤,在這裏,我只是幸運地工作版本,但我想我會記錄在這種情況下,它是給其他人永遠有用。