一开始,我很抱歉我不擅长英语。
我在做一个有趣的应用程序。
我的控制器使用Mojo::UserAgent做了一些工作,并在输出时使用结果。
my $ua = Mojo::UserAgent->new();
my $tx = $ua->head( $location );
my $result;
if ( $tx->res->code eq '200' ) {
$result = 'good';
}
else {
$result = 'bad';
}
# pass the result to the renderer's stash
$self->render( result => $result );这个代码很好用。--它同时工作在我的本地机器和服务器上。
接下来,我尝试使这种$ua->head()非阻塞方式,因为它可能需要很长的时间来完成。(我是个新手,这是我第一次尝试使用Mojo的非blokcing代码,供您参考)
my $ua = Mojo::UserAgent->new();
my $result;
$self->render_later;
$ua->head( $location => sub {
my ($ua, $tx) = @_;
if ( $tx->res->code eq '200' ) {
$result = 'good';
}
else {
$result = 'bad';
}
$self->render( result => $result );
});
Mojo::IOLoop->start unless Mojo::IOLoop->is_running;这种方法在我的本地机器中也能很好地工作(MacBook OSX 10.9.4,Perl5.18,独立使用morbo)。
但是,当我在服务器中启动这段代码时,服务器会响应“404Notfind”.。
此服务器使用Nginx代理,它将请求转发到工作节点。
browser -- Nginx -- Mojolicious App
因此,我想这个代理与我的问题有关,但我不知道如何解决它。我甚至不知道我要从哪里开始找出确切的原因。
如有任何建议,将不胜感激。
我应该说“阻塞方法”在我的本地机器和服务器上都很好。只有“非阻塞方法”显示了这个问题。
更新(2014-08-21):我的一个朋友是一位熟练的Perl工程师,他对我说,这似乎是Mojo事件循环和PSGI事件循环之间的问题,也就是说,类似于兼容性问题。我不明白他现在说了些什么,但我正在努力学习。
发布于 2014-08-07 10:08:22
来自莫灼烹饪书
upstream myapp {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://myapp;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto "http";
}
}发布于 2014-08-08 08:07:04
我认为该代理运行良好,因为您有http 404 (而不是http 502或其他什么)。
你也必须在你的服务器上运行变化莫测的应用程序,并使用“打印”调试你的应用程序。
我认为您的控制器操作找不到或找不到模板。
顺便问一下,什么是$self->render(result = $result)?也许你想写它$self->render(result => $result)
因此,如果这是您的问题,那么要检测这个错误,您应该查看log/development.conf ment.conf或log/production.conf,或者在运行app的控制台中。
UPD。
我不知道,哪里有问题,但这段代码会运行良好。
my $result;
$self->render_later;
$self->ua->head('http://ya.ru' => sub {
my ($ua, $tx) = @_;
print $self->dumper($ua);
if ( $tx->res->code eq '200' ) {
$result = 'good';
}
else {
$result = 'bad';
}
sleep 2;
$self->render( data => $result );
});
Mojo::IOLoop->start unless Mojo::IOLoop->is_running;因此,$ua变量来自于控制器$self。因此,当垃圾收集器调用回调时,它可能会破坏。当您使用$self->ua->...时,ua对象保存在共享变量中,因此垃圾收集器不会销毁它。非常有趣的例子。谢谢。
https://stackoverflow.com/questions/25179652
复制相似问题