2015-12-10 44 views
5

我想通過Nginx和RoR網絡服務器(如UnicornThinWEBrick)在本地計算機上部署我的Ruby on Rails應用程序。爲什麼我無法通過nginx代理傳遞訪問子域?

如下圖所示,我想訪問我的web應用程序通過post子域:

upstream sub { 
    server unix:/tmp/unicorn.subdomain.sock fail_timeout=0; 
# server 127.0.0.1:3000; 
} 

server { 
    listen 80; 
    server_name post.subdomain.me; 

    access_log /var/www/subdomain/log/access.log; 
    error_log /var/www/subdomain/log/error.log; 
    root  /var/www/subdomain; 
    index index.html; 

    location/{ 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 
    try_files /system/maintenance.html $uri $uri/index.html $uri.html @ruby; 
    } 

    location @ruby { 
    proxy_pass http://sub; 
    } 
} 

一切工作正常,當我鍵入post.subdomain.me我可以看到我的RoR應用程序。

問題:當我使用post.subdomain.me網址我無法訪問我的子域(request.subdomain返回空和request.host回報subdomainsubdomain.me instaed)。但是當我使用post.subdomain.me:3000時,每件事情都很完美(我失去了一半的頭髮來實現這一點)。爲什麼以及如何解決它?

+0

你對HTTP服務器有什麼用?你提到過Unicorn,Thin和Webrick,但沒有說你嘗試過哪一個。 –

+0

@TomL:所有人都有同樣的問題。 –

+0

所有'proxy_xxx'指令都位於錯誤的'location'塊中。你需要在'location @ ruby​​'塊中用'proxy_pass'指令保留它們,否則它們將被忽略。 –

回答

3

當您使用端口訪問應用程序時 - 您直接訪問rails服務器,而不是由nginx代理,這對調試很好,但通常不適合生產。

大概是主機頭不是由客戶端經過,$host默認nginx的主機

嘗試

location @ruby { 
    proxy_set_header Host $host; 
    proxy_pass http://sub; 
} 

和「hardcode'路:proxy_set_header Host post.subdomain.me;

+0

不,它沒有。謝謝你的回答。 –

+0

編輯用'$ host'或硬編碼域替換'$ http_host' – Vasfed

+0

不行,我試了兩個。 –

2

proxy_set_headerproxy_redirect指令配置proxy_pass指令,並且需要位於相同的位置塊中或從包含的server塊繼承。您需要格式化您的配置文件是這樣的:

location/{ 
    try_files /system/maintenance.html $uri $uri/index.html $uri.html @ruby; 
} 

location @ruby { 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 
    proxy_pass http://sub; 
} 

編輯:假設nginx不正確地傳遞信息,以回報率,爲@Vasfed建議,嘗試proxy_set_header Host其他值。還有三個候選人,所有的意思都略有不同。

proxy_set_header Host post.subdomain.me; 
    proxy_set_header Host $server_name; 
    proxy_set_header Host $host; 
+0

我試過了,還不行。 –

+0

@ AliSepehri.Kh編輯:明確表示Vasfed的建議。 –

+0

是的,你完全正確。我的錯。 –