我试图实现一个Catalyst应用程序使用nginx作为静态文件的前端Web代理,并使用Starman作为我的后端Web服务器。 (我可以使用Apache和FastCGI,它工作得很好,但我真的希望得到整个PSGI / Plack和Starman的东西)
Starman启动好了,可以在http://localhost:5000
上处理我的请求。 当我启动nginx作为我的前端代理时,无论何时何地使用$c->uri_for
方法,我的url都会变得丑陋,并随着端口号(5000)而$c->uri_for
。
例如:
$ C-> uri_for( “/login”) 变 http://myapp.example.com:5000/login 而不是 http://myapp.example.com/login
我有一些日志正在创build,所以我可以看到什么X-Forwarded-Host
和X-Forwarded-For
被设置为。 对于普通的请求,有一些值(来自nginx),但是每当使用$c->uri_for
方法时,这些值都不存在。
有没有其他人有这个问题?
我是否在configurationnginx或Catalystconfiguration文件时丢失了其他的东西?
谢谢!
nginxconfiguration:
服务器{ 听80; server_name myapp.example.com; 位置/静态{ root / data / users / MyApp / root; 到期30天; } 位置 / { proxy_set_header主机$主机; 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 /; } }
事件虽然这将运行在相同的物理服务器上,在MyAppconfiguration我已经设置:
MyApp-> config(using_frontend_proxy => 1)
版本:
催化剂:5.80024 nginx:0.7.67 Plack:0.9942 Starman:0.2006
我的问题是在我的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; };
在我的情况下,前端是在一个不同的主机,并添加
MyApp->config(using_frontend_proxy => 1)
确实有所作为并解决了这个问题。