2015-12-10 9 views
5

Chcę wdrożyć aplikację Ruby on Rails na moim komputerze lokalnym przez Nginx i serwery internetowe RoR (takie jak Unicorn, Thin lub WEBrick).Dlaczego nie mogę uzyskać dostępu do poddomeny za pośrednictwem proxy nginx?

Jak pokazano poniżej, chcę dostęp do mojej aplikacji internetowej przez post subdomeny:

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; 
    } 
} 

Wszystko działa bez zarzutu, a kiedy wpisuję post.subdomain.me widzę mojej aplikacji ROR.

Problem: Gdy używam post.subdomain.me url Nie mogę uzyskać dostępu do mojego subdomenie (request.subdomain wraca pusty i request.host powraca subdomain instaed z subdomain.me). Ale gdy używam post.subdomain.me:3000 co wszystko działa idealnie (I stracił połowę moich włosków sobie sprawę, że). Dlaczego i jak mogę to rozwiązać?

+0

Czego używasz do serwera HTTP? Wspomniałeś Unicorn, Thin i Webrick, ale nie powiedziałeś, który próbowałeś. –

+0

@TomL: Z nimi wszystkimi mam ten sam problem. –

+0

Wszystkie twoje dyrektywy 'proxy_xxx' znajdują się w niewłaściwym bloku' location'. Musisz zachować je za pomocą dyrektywy 'proxy_pass' w bloku' location @ ruby', w przeciwnym razie zostaną one zignorowane. –

Odpowiedz

3

Po uzyskaniu dostępu do aplikacji z portu - masz dostęp do serwera szyn bezpośrednio, a nie przez proxy nginx, to jest dobre dla debugowania, ale zwykle nie jest dobrze do produkcji.

Prawdopodobnie nagłówek hosta nie przeszło przez klienta, $host domyślne gościć nginx

Spróbuj

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

i A „hardcode' drogi: proxy_set_header Host post.subdomain.me;

+0

Nie, nie ma. Dziękuję za odpowiedź. –

+0

Zmieniano zastąpić '$ http_host' z' $ host' lub hardcode domenie – Vasfed

+0

jeszcze nie działa, próbowałem obu z nich. –

2

W proxy_set_header i proxy_redirect dyrektyw konfiguracji dyrektywa proxy_pass i muszą być w tym samym bloku lokalizacji lub dziedziczone z otaczającą server bloku. Trzeba sformatować plik konfiguracyjny tak:

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; 
} 

EDIT: Zakładając, że nginx nie przekazując informacje do RoR prawidłowo, zgodnie z sugestią @Vasfed, spróbuj inne wartości dla proxy_set_header Host. Jest jeszcze trzech innych kandydatów, wszyscy mają nieco inne znaczenie.

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

Próbowałem, jeszcze nie działa. –

+0

@ AliSepehri.Kh EDYCJA: Jawnie podana sugestia Vasfeda. –

+0

Tak, masz całkowitą rację. Mój błąd. –

Powiązane problemy