2010-07-28 6 views
3

J'essaye d'implémenter une application Catalyst en utilisant nginx comme proxy Web pour les fichiers statiques, et en utilisant Starman pour mon serveur web principal. (Je pourrais utiliser Apache & FastCGI et il fonctionne très bien, mais je voudrais vraiment obtenir toute PSGI/Plack chose et Starman aplanies)uri_for inclut le numéro de port sur les redirections

Starman démarre bien et peut gérer mes demandes très bien sur http://localhost:5000. Quand je lance nginx pour l'utiliser comme proxy, mes URL deviennent moche et mangle avec le numéro de port (5000) quand et où j'utilise la méthode $c->uri_for.

Exemple:

 
$c->uri_for("/login") 
becomes 
http://myapp.example.com:5000/login 
rather than 
http://myapp.example.com/login 

J'ai quelques journaux créés je peux voir ce que X-Forwarded-Host et X-Forwarded-For sont définis comme. Pour les requêtes normales, des valeurs sont définies (provenant de nginx), mais chaque fois que la méthode $c->uri_for est utilisée, ces valeurs n'existent pas.

Est-ce que quelqu'un d'autre a eu ce problème?
Ai-je oublié quelque chose d'autre dans ma configuration de nginx ou de ma conf de Catalyst?

Merci!

config nginx:

 
server { 
     listen  80; 
     server_name myapp.example.com; 

     location /static { 
      root /data/users/MyApp/root; 
      expires 30d; 
     } 

     location/{ 
      proxy_set_header Host $host; 
      proxy_set_header X-Forwarded-Host $host; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

      proxy_pass http://localhost:5000/; 
     } 
    } 

événement si ce sera couru sur le même serveur physique, dans la configuration MyApp j'ai mis:

 
MyApp->config(using_frontend_proxy => 1) 

Versions:

 
Catalyst : 5.80024 
nginx : 0.7.67 
Plack : 0.9942 
Starman : 0.2006 

Répondre

4

Mon problème était dans mon fichier myapp.psgi.

de Catalyst::Engine::PSGI et de regarder Plack::Middleware::ReverseProxy:

... 
use Plack::Builder; 
use MyApp; 

MyApp->setup_engine('PSGI'); 
my $app = sub { MyApp->run(@_) }; 

builder { 
enable_if { $_[0]->{REMOTE_ADDR} eq '127.0.0.1' } 
     "Plack::Middleware::ReverseProxy"; 
$app; 
}; 
1

Dans mon cas, le frontend était dans un autre hôte et en ajoutant

MyApp->config(using_frontend_proxy => 1) 

a fait une différence et a résolu le problème.

+0

Ceci est documenté à https://metacpan.org/pod/Catalyst#PROXY-SUPPORT et devrait être la réponse acceptée car il est construit dans Catalyst, n'a pas besoin de modifier le fichier '.psgi' généré et peut être défini par la configuration locale. –

Questions connexes