2015-12-10 9 views
5

Desidero distribuire l'applicazione Ruby on Rails sul mio computer locale tramite i server Web Nginx e RoR (come Unicorn, Thin o WEBrick).Perché non riesco ad accedere al sottodominio tramite il passaggio proxy nginx?

Come mostrato di seguito, voglio accedere nel mio spazio web-app per post sottodominio:

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

tutto funziona bene e quando digito post.subdomain.me posso vedere il mio RoR app.

Problema: Quando uso post.subdomain.me url non posso accedere al mio sottodominio (request.subdomain ritorna vuoto e request.host rendimenti subdomain instaed di subdomain.me). Ma quando uso lo post.subdomain.me:3000 tutte le cose funzionano perfettamente (ho perso metà dei miei capelli per rendermene conto). Perché e come posso risolverlo?

+0

Che cosa stai utilizzando per il server HTTP? Hai citato Unicorn, Thin e Webrick ma non hai detto quale hai provato. –

+0

@TomL: Con tutti loro ho lo stesso problema. –

+0

Tutte le direttive 'proxy_xxx' sono nel blocco' location' sbagliato. Devi tenerli con la direttiva 'proxy_pass' nel blocco' location @ ruby', altrimenti saranno ignorati. –

risposta

3

Quando si accede all'app con porta - si accede direttamente al server di rails, non con proxy di nginx, questo va bene per il debug, ma di solito non va bene per la produzione.

Probabilmente intestazione host non è passato sopra dal cliente, $host default ospite nginx

Prova

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

E un 'vie hardcode': proxy_set_header Host post.subdomain.me;

+0

No, non è così. grazie per la risposta. –

+0

Modificato per sostituire '$ http_host' con' $ host' o dominio hardcode – Vasfed

+0

Non funziona ancora, ho provato entrambi. –

2

Le direttive proxy_set_header e proxy_redirect configurare la direttiva proxy_pass e deve trovarsi nello stesso blocco di posizione o essere ereditata dal blocco server. È necessario formattare il file di configurazione in questo modo:

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: Supponendo che nginx non passa le informazioni per RoR correttamente, come suggerito @Vasfed, provare altri valori per proxy_set_header Host. Ci sono altri tre candidati, tutti con significati leggermente diversi.

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

L'ho provato, non funziona ancora. –

+0

@ AliSepehri.Kh EDIT: esplicitamente dichiarato il suggerimento di Vasfed. –

+0

Sì, hai completamente ragione. Colpa mia. –

Problemi correlati