uri_for包含重定向上的端口号

时间:2010-07-28 15:03:23

标签: perl nginx catalyst starman

我正在尝试使用nginx作为静态文件的前端Web代理实现Catalyst应用程序,并使用Starman作为后端Web服务器。 (我可以使用Apache& FastCGI,它运行得很好,但我真的很想让整个PSGI / Plack和Starman的东西得到解决)

Starman启动正常,可以在http://localhost:5000处理我的请求。当我启动nginx以用作我的前端代理时,无论何时何地使用$c->uri_for方法,我的网址都会变得难看并且使用端口号(5000)进行修改。

示例:

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

我创建了一些日志,因此我可以看到X-Forwarded-HostX-Forwarded-For被设置为。对于普通请求,设置了值(来自nginx),但每当使用$c->uri_for方法时,这些值都不存在。

还有其他人有这个问题吗? 我在配置nginx或Catalyst conf时错过了其他的东西吗?

谢谢!

nginx config:

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

事件虽然这将在同一台物理服务器上运行,但在我设置的MyApp配置中:

MyApp->config(using_frontend_proxy => 1)

版本:

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

2 个答案:

答案 0 :(得分:4)

我的问题出在我的myapp.psgi文件中。

来自Catalyst::Engine::PSGI并查看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 :(得分:1)

在我的情况下,前端是在另一个主机并添加

MyApp->config(using_frontend_proxy => 1)

确实有所作为并解决了问题。