2011-01-04 3 views
4

ich eine Rails-Anwendung, die auf Port läuft 8080, die ich brauche es läuft auf Port zu denken, zu betrügen 80.eine Rails-App Tricking zu denken, es auf einem anderen Port ist

I Varnish leite auf Port 80 und Weiterleiten von Anfragen an nginx an Port 8080, aber wenn der Benutzer versucht, sich mit OmniAuth anzumelden, und das Devise-Juwel eine URL erzeugt, um zurück zum Server zu leiten, denkt es an Port 8080, was dann der Benutzer sieht.

Gibt es eine Möglichkeit, die Rails-App zu tricksen, um den Port als 80 hart zu programmieren (ich würde es für eine schlechte Übung halten), oder nginx die Anfrage weiterleiten, als ob sie auf Port 80 läuft?

Da ich keinen Nginx-Proxy für die Rails-App ausführen, kann ich mir keinen Weg vorstellen, den Port auszutricksen.

Hat jemand schon einmal auf dieses Problem gestoßen, wenn ja, welche Art von Konfiguration wird benötigt, um es zu beheben?

Vielen Dank im Voraus!

EDIT: Beide nginx und Varnish laufen auf dem gleichen Server.

Antwort

7

Ich habe das gleiche Setup mit Varnish auf Port 80 und nginx auf Port 8080 und OmniAuth (no Devise) tat genau das Gleiche. Ich habe versucht, X-Forwarded-Port etc in Varnish und fastcgi_param SERVER_PORT 80; in nginx, beide ohne Erfolg. Das andere Stück in meinem Setup ist Passagier (die Sie nicht erwähnt), aber wenn Sie in der Tat Passagier verwenden, dann können Sie verwenden:

passenger_set_cgi_param SERVER_PORT 80; 

(Die docs sagen Sie dies in einem http Block einstellen können, aber dass didn ‚t Arbeit für mich und ich musste es dem server Block hinzuzufügen.)

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

+0

November 2012, 18 Monate später, und das ist immer noch ein guter Rat. FWIW, ich musste es auch in den Server stellen, nicht in den http-Block von nginx config. –

+0

2014-05-03 - mein Geburtstagsgeschenk;) thx ein Haufen –

0

Sie können einen Proxy und Server es wie jeder Port Sie wollen.

Vielleicht mit Apache auf und Beifahrer alleine stehen ...

<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 Schale:

passenger start -e staging -p 3003 -d 
+0

ich bin mit nginx und ich bin nicht diese als eigenständige Instanz läuft. – Garrett

+0

Halten Sie nicht an diesem Ideal fest, wenn Sie etwas außerhalb des Standardbereitstellungsmodells planen. – ablemike

0

Ihr Problem scheint sind Redirects Port 8080. Die beste Lösung wäre immer sein Rails (oder das OmniAuth/Devise-Juwel) zu konfigurieren, um die Anfragen so zu behandeln, als wären sie auf Port 80 gefeuert worden (aber ich habe keine Ahnung, wie oder ob es möglich ist).

Wie abelmike sagte; Apache hat ein großartiges Modul dafür (mod_proxy), mit ProxyPassReverse schreibt es die Weiterleitungen zurück zu Port-80 Weiterleitungen. Besser noch, mit mod_proxy_html wird Port-8080-Links in HTML-Seiten mit Port-80-Links ersetzt.

Wenn Sie nur Umleitungen neu schreiben müssen, können Sie Umleitungen in Lack VCL umschreiben mit so etwas wie:

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

(Ich glaube, Sie obj mit beresp zu ersetzen, wenn Sie Lack verwenden> = 2.1)

Wenn Sie HTML-Seiten neu schreiben müssen, wird es viel schwieriger sein, vollständig mit Lack zu korrigieren.

2

In Varnish X-Forwarded-Port einrichten. Siehe this example und die anderen Ergebnisse einer Google-Suche nach "varnish x-forwarded-port".

Sie müssen natürlich auch X-Forwarded-For und X-Forwarded-Proto einrichten.


Die Header X-Forwarded-For, X-Forwarded-Proto und X-Forwarded-Port sind eine Möglichkeit für HTTP-Reverse-Proxys wie Nginx, Tintenfisch oder Lack auf den "Back-End" HTTP-Anwendungsserver, Ihre Rails-Anwendung in Thin laufen zu kommunizieren oder Einhorn, wer der Benutzer tatsächlich ist und wie der Benutzer tatsächlich verbunden ist.

Angenommen, Sie haben Nginx vor Ihrer Rails-Anwendung. Ihre Rails-Anwendung wurde mit Thin gestartet und wartet auf 127.0.0.1:8080, während Nginx auf 0.0.0.0:80 für HTTP und 0.0.0.0:443 für HTTPS wartet. Nginx ist so konfiguriert, dass alle Verbindungen zur Rails-App als Proxy verwendet werden. Dann denkt Ihre Rails-App, dass die IP-Adresse jedes Benutzers 127.0.0.1 ist, der Port ist 8080, und das Schema ist http, auch wenn der tatsächliche Benutzer von 1.2.3.4 verbunden ist und die Seite über https am Port 443 angefordert hat. Die Lösung ist Nginx zu konfigurieren, dass die Header zu setzen:

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

und die Rails-Anwendung sollten diese Parameter statt die Standardeinstellungen verwenden.

Das Gleiche gilt für den von Ihnen verwendeten Reverse Proxy, wie z. B. Varnish in Ihrem Fall.

+0

Dies ist keine sehr beschreibende Antwort. Muss ich X-Forwarded-For und X-Forwarded-Proto in nginx oder Varnish einrichten? Habe ich noch Varnish auf Port 80 hören? – Garrett

+0

Ich habe meine Antwort mit mehr Beschreibung aktualisiert und hoffentlich das 'X-Forwarded-For' System klar gemacht. – yfeldblum

+0

Diese Antwort ist bang on. Dies half mir, das Geheimnis der fehlgeschlagenen OAuth2 Callbacks in einer ELB -> Nginx -> Unicorn (Rails) Konfiguration zu lösen – Litmus

Verwandte Themen