Domanda

Ho un'applicazione Rails è in esecuzione sulla porta 8080 che ho bisogno di ingannare a pensare che è in esecuzione sulla porta 80.

Sono in esecuzione vernice sulla porta 80 e spedizioni richieste di nginx sulla porta 8080, ma quando l'utente tenta di effettuare il login con OmniAuth e la gemma Devise genera un URL per reindirizzare al server, si pensa che la sua sulla porta 8080 che poi l'utente vedrà.

C'è un modo per ingannare l'applicazione Rails codificare il porto come 80 (Vorrei pensare che sia una cattiva pratica), o hanno nginx inoltrare la richiesta come se è in esecuzione sulla porta 80?

Dal momento che non sono in esecuzione un proxy nginx alle applicazione Rails non riesco a pensare a un modo per ingannare il porto.

Qualcuno ha funzionato in questo problema prima, in caso affermativo quale tipo di configurazione è necessario per risolvere il problema?

Grazie in anticipo!

EDIT: Sia nginx e vernice sono in esecuzione sullo stesso server.

È stato utile?

Soluzione

Ho la stessa messa a punto con vernice sulla porta 80 e nginx sulla porta 8080 e OmniAuth (senza Devise) stavo facendo esattamente la stessa cosa. Ho provato a installare X-Forwarded-Port ecc in vernice e fastcgi_param SERVER_PORT 80; in nginx, entrambi senza successo. L'altro pezzo nel mio setup è Passenger (che lei non ha citato), ma se si sta effettivamente utilizzando passeggero allora si può usare:

passenger_set_cgi_param SERVER_PORT 80; 

(La documentazione dicono che si può impostare questo in un blocco http, ma che non ha funzionato per me e ho dovuto aggiungere al blocco server.)

http://modrails.com/documentation/Users%20guide%20Nginx .html # passenger_set_cgi_param

Altri suggerimenti

Imposta X-Forwarded-Port in vernice. Vedere questo esempio e gli altri risultati di una ricerca su Google per " vernice x-inoltrato-port ".

È necessario anche, naturalmente, istituito X-Forwarded-For e X-Forwarded-Proto.


L'header X-Forwarded-For, X-Forwarded-Proto, e X-Forwarded-Port sono un modo per HTTP proxy inversi, come Nginx, calamari, o vernice per comunicare al "back-end" HTTP server di applicazione, l'applicazione Rails in esecuzione in sottile o Unicorno, che il utente è in realtà e come l'utente effettivamente collegato.

Ad esempio, si supponga di avere Nginx di fronte alla vostra applicazione Rails. L'applicazione Rails è stato avviato con sottile ed è in ascolto 127.0.0.1:8080, mentre Nginx è in ascolto su 0.0.0.0:80 per HTTP e 0.0.0.0:443 per HTTPS. Nginx è configurato per le connessioni tutti procura per l'applicazione Rails. Allora la vostra applicazione Rails penserà che l'indirizzo IP di qualsiasi utente è 127.0.0.1, il porto è 8080, e lo schema è http, anche se l'utente attuale collegato da 1.2.3.4 e ha richiesto la pagina tramite https sulla porta 443. La soluzione è quella di configurare Nginx per impostare le intestazioni:

X-Forwarded-For: 1.2.3.4
X-Forwarded-Scheme: https
X-Forwarded-Port: 443

e l'applicazione Rails dovrebbe utilizzare questi parametri al posto di quelli di default.

Lo stesso vale per qualsiasi proxy inverso si utilizza, come ad esempio per unghie nel vostro caso.

È possibile effettuare una proxy e server di come tutto ciò porta che si desidera.

Forse con Apache sulla parte superiore e passeggero stare da solo ...

<VirtualHost *:80>
 ServerName <name>
 DocumentRoot /home/deploy/<name>

 PassengerEnabled off
 ProxyPass / http://127.0.0.1:<port>/
 ProxyPassReverse / http://127.0.0.1:<port>/

</VirtualHost>

In shell:

passenger start -e staging -p 3003 -d

Il tuo problema sembra che stai ricevendo reindirizza alla porta 8080. La soluzione migliore sarebbe quella di configurare Rails (o la gemma OmniAuth / Devise) per trattare le richieste come se fossero stati sparati sulla porta 80 (ma non ho idea di come o se è possibile).

Come ablemike detto; Apache ha un modulo grande per questo (mod_proxy), con ProxyPassReverse riscrive i reindirizzamenti in porto-80 reindirizzamenti. Meglio ancora, con mod_proxy_html sostituirà porta-8080 link a pagine HTML con porta-80 collegamenti.

Se avete solo bisogno di riscrivere redirect, è possibile riscrivere redirect a Vernice VCL con qualcosa di simile:

sub vcl_fetch {

  ...

  #Rewrite redirect from port 8080 to port 80
  if ( obj.http.Location ~ "^http://[^:]+:8080/.*" ) {
    set obj.http.Location = regsub(obj.http.Location, ""^(http://[^:]+):8080(/.*)","\1\2");
  }
}

(credo che bisogna sostituire obj con beresp se si utilizza vernice> = 2.1)

Se si dispone di riscrivere pagine HTML, questo sarà molto più difficile da fare completamente a correggere con vernice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top