Question

J'ai une application Rails qui est en cours d'exécution sur le port 8080 que je dois tromper de penser qu'il est en cours d'exécution sur le port 80.

Je courais Varnish sur le port 80 et la transmission des demandes de nginx sur le port 8080, mais quand les essais des utilisateurs de se connecter avec OmniAuth et la pierre précieuse Devise génère une URL pour rediriger vers le serveur, il pense son sur le port 8080 qui a ensuite l'utilisateur verra.

Y at-il moyen de tromper l'application Rails coder en dur le port 80 (je pense que c'est une mauvaise pratique), ou ont nginx transmettre la demande comme si elle est en cours d'exécution sur le port 80?

Depuis que je ne suis pas en cours d'exécution d'un proxy nginx aux Rails app Je ne peux pas penser à un moyen de tromper le port.

Quelqu'un at-il rencontré ce problème avant, si oui, quel type de configuration est nécessaire pour résoudre ce problème?

Merci à l'avance!

EDIT: Les deux nginx et Varnish fonctionnent sur le même serveur.

Était-ce utile?

La solution

J'ai la même configuration avec Varnish sur le port 80 et nginx sur le port 8080 et OmniAuth (pas Devise) faisait exactement la même chose. J'ai essayé la mise en X-Forwarded-Port etc Varnish et fastcgi_param SERVER_PORT 80; à nginx, à la fois sans succès. L'autre pièce dans ma configuration est passager (que vous n'avez pas mentionné) mais si vous utilisez en effet passager, vous pouvez utiliser:

passenger_set_cgi_param SERVER_PORT 80; 

(Les docs disent que vous pouvez configurer dans un bloc http mais qui n'a pas fonctionné pour moi et je devais ajouter au bloc server.)

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

Autres conseils

Configurer X-Forwarded-Port en Varnish. Voir cet exemple et les autres résultats d'une recherche Google pour « vernis x ports transmis ».

Vous devez aussi, bien sûr, mis en place X-Forwarded-For et X-Forwarded-Proto.


Les en-têtes X-Forwarded-For, X-Forwarded-Proto et X-Forwarded-Port sont un moyen pour HTTP proxy inverse tels que Nginx, Squid ou Varnish de communiquer au « back-end » du serveur d'applications HTTP, votre application Rails en cours d'exécution en fin ou Unicorn, qui est le l'utilisateur est en fait et comment l'utilisateur effectivement connecté.

Par exemple, supposons que vous avez Nginx devant votre application Rails. Votre application Rails a été démarré avec Thin et écoute sur 127.0.0.1:8080, tandis que Nginx écoute sur 0.0.0.0:80 pour HTTP et HTTPS pour 0.0.0.0:443. Nginx est configurée pour des connexions proxy tous à l'application Rails. Ensuite, votre application Rails pensera que l'adresse IP d'un utilisateur est 127.0.0.1, le port est 8080, et le régime est http, même si l'utilisateur réel connecté de 1.2.3.4 et a demandé à la page via https sur le port 443. La solution consiste à configurer Nginx pour définir les en-têtes:

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

et l'application Rails devraient utiliser ces paramètres au lieu de ceux par défaut.

Le même pour tout proxy inverse vous utilisez, comme vernis dans votre cas.

Vous pouvez faire un proxy et le serveur comme tout port que vous voulez.

Peut-être avec apache sur le dessus et le passager autonome ...

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

shell:

passenger start -e staging -p 3003 -d

Votre problème vous semble vous obtenez une redirection vers le port 8080. La meilleure solution serait de configurer Rails (ou la pierre précieuse OmniAuth / Devise) pour traiter les demandes comme si elles ont été tirées sur le port 80 (mais je ne sais pas comment ou s'il est possible).

Comme ablemike dit; Apache a un grand module pour ce (mod_proxy), avec ProxyPassReverse il réécrit les réoriente vers le port-80 réoriente. Mieux encore, avec mod_proxy_html il remplacera les liens port-8080 dans les pages HTML avec des liens port-80.

Si vous avez seulement besoin de réécrire réoriente, vous pouvez réécrire dans réoriente Varnish VCL avec quelque chose comme:

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

(je pense que vous devez remplacer obj avec beresp si vous utilisez vernis> = 2.1)

Si vous devez réécrire les pages HTML, ce sera beaucoup plus difficile à faire tout à fait correct avec vernis.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top