我正在尝试使用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-Host
和X-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
答案 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)
确实有所作为并解决了问题。