2011-03-03 108 views
4

與所在地塊掙扎我得到了一個新的片斷slicehost,爲玩耍和學習有關部署nginx的和更普遍的目的。我在那裏安裝了一個使用乘客的紅寶石應用程序(我將調用app1)。我把它的默認應用該服務器具有下列服務器塊在我的nginx的配置使用:在nginx的配置

server { 
    listen 80; 
    server_name <my server ip>; 
    root <path to app1 public folder>; 
    passenger_enabled on; 
} 

這工作得很好。但是,我想嘗試一些不同的應用程序上出這片,所以以爲我會設置它就像這樣:

的http:/// APP1

的http:/// APP 2

等我想我能做到,它通過添加位置塊,並且APP1具體的東西移到了,像這樣:

server { 
    listen 80; 
    server_name <my server ip>; 

    location ^~ /app1 { 
     root <path to app1 public folder>; 
     passenger_enabled on; 
    } 
} 

但是,這樣做(和重新啓動,當然nginx的),去純IP地址給出了「歡迎nginx的」消息(我期望)。但是,去/ APP1給出錯誤信息:

404 Not Found 
The requested URL /app1 was not found on this server. 

這是錯誤消息我得到不同的,當我去到另一條路徑上的IP,如/富:

404 Not Found 
nginx/0.8.53 

所以,這就像nginx知道那個位置,但我沒有正確設置它。任何人都可以設置我嗎?我應該設置不同的服務器塊而不是使用位置嗎?我相信這很簡單,但無法解決。

乾杯,最大

+0

作爲旁註,不鼓勵將[root在一個位置塊](https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#root-inside-location-block ) – Daan 2016-02-27 11:02:04

回答

2

我認爲它只是一個輕微的語法問題:

location ~ ^/app1 { ... 

應該工作,或稍微更高效:

location = /app1 { ... 
+0

感謝martin。我嘗試了這兩個,但仍然得到相同的'在此服務器上找不到請求的URL/app1。 '錯誤。 – 2011-03-04 09:35:03

2

一個問題是,您的Rails應用程序可能不是爲了從子目錄運行而設計的。乘客有一個指令,將解決這個問題:

passenger_base_uri /app1; 

然而,在子目錄運行Rails應用是有點不標準。如果可以的話,一個更好的選擇可能是設置使用nginx的的虛擬主機子域。

3

什麼你後名稱的虛擬主機。其思想是每個結構域上的相同的IP承載和nginx的選擇的虛擬主機基於HTTP請求,這是由瀏覽器發送的Host:頭服務。

要使用名稱的虛擬主機,使用你想,而不是爲你的服務器的IP爲server_name指令域。

server { 
    listen 80; 
    server_name app1.com; 

    location/{ 
    root /srv/http/app1/public; 
    passenger_enabled on; 
    } 
} 

然後,主機在同一機器中更多的應用程序,只是聲明爲每一個單獨的server { }塊。

server { 
    listen 80; 
    server_name app2.com; 

    location/{ 
    root /srv/http/app2/public; 
    passenger_enabled on; 
    } 
} 

我使用的是麒麟,而不是乘客,而是結構的虛擬主機部分爲任何後端相同。

全球nginx的配置(其自身的主機沒有):https://github.com/benhoskings/babushka-deps/blob/master/nginx/nginx.conf.erb

每個虛擬主機模板包裝:https://github.com/benhoskings/babushka-deps/blob/master/nginx/vhost.conf.erb

麒麟虛擬主機的細節:https://github.com/benhoskings/babushka-deps/blob/master/nginx/unicorn_vhost.common.erb

2

看來你想要在基本uri的同一臺服務器上託管更多的應用程序。試試這個:

root /srv/http/; 
passenger_base_uri /app_1; 
passenger_base_uri /app_2 
下的/ srv/HTTP

此外,創建符號鏈接2:http://domain.com/app_1

ln -s /srv/http/app_1 /srv/http/app1/public 
ln -s /srv/http/app_2 /srv/http/app2/public 

的APP1下就可以進行訪問。

下面是更多閱讀:http://www.modrails.com/documentation/Users%20guide%20Nginx.html#deploying_rack_to_sub_uri

3

我在這裏未能壽看到真正的問題,
爲了讓你明白這一點 你需要查看大多數系統上的nginx的日誌文件:
/var/log/nginx/
並在此處打開相關訪問文件(可能是error.log) 您可以在其中看到nginx準確訪問的網址以及爲什麼會失敗。
我真的以爲發生了,你得到的根路徑錯了, 也許它應該是別名,而不是因爲 如果你正在代理到另一個應用程序的連接,它可能會在url中取得 「app1」字,而不是直接的。

所以請嘗試:

server { 
    listen 80; 
    server_name <my server ip>; 

    location /app1 { 
     alias <path to app1 public folder>; 
     passenger_enabled on; 
    } 
} 

,看看天氣它的工作原理,並儘量先查看日誌真正確定什麼問題。