我不确定以正确的方式为www mechanize设置脚本应用程序.我确实尝试过至少一个可行的备用,但是我试图通过测试传递配置,这样我就可以使测试套件更安静.
#!/usr/bin/perl
use strict;
use warnings;
use Dancer qw(:syntax);
use MyApp;
use Test::More;
use Test::WWW::Mechanize::PSGI;
set apphandler => 'PSGI';
set log => 'warning';
set logger => 'note';
my $mech = Test::WWW::Mechanize::PSGI->new(
app => dance, # app => do('bin/app.pl'), #
);
$mech->get_ok('/login') or diag $mech->content;
done_testing;
Run Code Online (Sandbox Code Playgroud)
do在脚本上运行似乎允许测试运行,但是日志变量没有正确设置,同时似乎有更好的方法来做到这一点.
更新
我想我可能会越来越接近一个解决方案......
#!/usr/bin/perl
use strict;
use warnings;
use FindBin;
use Cwd qw( realpath );
use Dancer qw(:syntax);
use MyApp;
use Test::More;
use Test::WWW::Mechanize::PSGI;
set apphandler => 'PSGI';
my $appdir = realpath( "$FindBin::Bin/.." …Run Code Online (Sandbox Code Playgroud) 尽管文档相当少且不清楚,并且对于初学者来说是有效的方法,但我已经逐渐喜欢PSGI,并且我目前正在其中一个应用程序中使用它.我想知道的是如何在多节点应用程序中管理日志记录?有关登录PSGI的"最佳实践"是什么?
我刚刚将一个PageKit(mod_perl)应用程序转换为Plack.这意味着我现在需要一些方法来强制执行Apache2 :: Reques 先前已经处理过的POST_MAX/MAX_BODY .最简单的方法可能只是将nginx放在应用程序前面,但是应用程序已经位于HAProxy后面,我不知道如何使用HAProxy执行此操作.
那么,我的问题是我如何在不首先阅读整个请求的情况下在Plack :: Middleware中强制执行最大体型?
具体来说,我关注文件上传.通过检查大小普拉克::支持::上传是为时已晚,因为整个身体会一直在这一点上阅读.该应用程序将通过Starman部署,所以psgix.streaming应该是true.
我计划用PSGI/Plack开发一个Web应用程序.(与舞者有关,但尚未决定).
应用程序应该是utf8,多语言(使用Locale :: Maketext)和(ofc)将包含给定语言的一些静态页面.我的想法是将它部署在不同的语言域中en.example.com,de.example.com等等.应用程序本身很简单,大多数只会填充带有本地化文本和其他(轻量级)功能的模板.
在一台物理计算机中为多个基于语言的子域部署一个应用程序的最佳解决方案是什么?
我目前的研究以此解决方案结束:需要为每个语言子域使用Apache及其基于名称的虚拟服务器.
<VirtualHost en.example.com>
ServerName en.example.com
DocumentRoot /path/to/site/en/files
<Location />
SetHandler perl-script
PerlResponseHandler Plack::Handler::Apache2
PerlSetVar psgi_app /path/to/site/en/en.psgi
</Location>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
问题:
什么其他的想法/事物会对开发本身产生什么影响?
Plack套件通常使用http://0:port.例如以下内容
plackup -MPlack::App::Directory -e 'Plack::App::Directory->new(root=>".");'
Run Code Online (Sandbox Code Playgroud)
版画
HTTP::Server::PSGI: Accepting connections at http://0:5000/
Run Code Online (Sandbox Code Playgroud)
但是,LWP::UserAgent(或一些更深层次的模块)不接受它,例如:
perl -MLWP::UserAgent -E '$u=LWP::UserAgent->new;$res=$u->get("http://0:5000/valid/path");print $res->status_line'
Run Code Online (Sandbox Code Playgroud)
打印:
500 No Host option provided
Run Code Online (Sandbox Code Playgroud)
但是
perl -MLWP::UserAgent -E '$u=LWP::UserAgent->new;$res=$u->get("http://localhost:5000/valid/path");print $res->status_line'
Run Code Online (Sandbox Code Playgroud)
版画
200 OK
Run Code Online (Sandbox Code Playgroud)
问题是:谁错了?
http://0:port有效的,例如LWP是"错误的"这是我的情景:

所以,
https://server1/MyPerlApphttps://server1/MyPerlApp到http://server2:5000问题1:这可能吗?(问,因为我不太了解Apache,这不是一个简单的:
ProxyPass /MyPerlApp http://server2:5000/
Run Code Online (Sandbox Code Playgroud)
因为我需要在server1上验证用户身份,并ProxyPass在验证时设置Only.由于Apache非常灵活,我认为上面的答案是肯定的(但确认和细节非常受欢迎) - 所以这是我的主要具体问题:
perl服务器2上的应用程序的简单方法?例如,使用Apache 为每个查询mod_rewrite附加一个user=username参数,perl应用应该读取的一些HTTP标头吗?我正在寻找如何避免我的starman/perl应用程序中的身份验证例程,因为:
已经有类似的问题,但是:
我正在开发一个Catalyst/psgi应用程序,它可以很好地利用异步流,但不仅仅是一个简单的计时器(比如这里:http://www.catalystframework.org/calendar/2013/13),我有点儿难以理解如何实施更多"全球"事件.
通过全球事件,我的意思是:
如果我错了,请纠正我,但对我来说,这些似乎与上面链接的示例非常不同,这将给每个客户一个不同的计数器.我想让事件"全面发生".
我尝试过的一个例子(使用上面列表中的#2):
has 'write_fh' => ( is => 'rw', predicate => 'has_write_fh' );
sub events : Path('/stream') Args(0) {
my ( $self, $c ) = @_;
$c->res->body("");
$c->res->content_type('text/event-stream');
$self->write_fh( $c->res->write_fh() );
}
sub trigger : Path('/trigger') : Args(0) {
my ( $self, $c ) = @_;
$self->write_fh->write( *the event string* );
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,它实际上比我预期的更进一步 - 事件确实被触发,但不可靠.打开两个浏览器,有时会将事件发送到一个,有时发送到另一个.
现在,我想我明白为什么这样做永远不会有效 - 遇到/触发的客户端,不知道正在观看/流的所有其他客户端,所以我尝试使用的write_fh没用.
但是,如果每个客户的请求都在其自己的包含气泡中,我如何从其他请求访问其流?
或者我完全走错了轨道......?
我的Dancer应用程序在uWSGI(2.0.7)+ Apache(2.4.10)组合下失败,而它在其他环境(uWSGI + nginx,Starman + Apache,Dancer自己的开发服务器)中自由运行.我没有在日志中找到任何有意义的信息.所以我做了简单的测试应用程序
$ dancer -a tset
Run Code Online (Sandbox Code Playgroud)
然后将默认复制production.yml到uwsgi.yml,链接bin/app.pl到这样bin/app.psgi创建tset.ini:
[uwsgi]
plugins = psgi
socket = 127.0.0.1:3033
uid = www
gid = www-data
chdir = /home/www/apps/tset/bin/
psgi = app.psgi
processes = 1
master = true
Run Code Online (Sandbox Code Playgroud)
使这个ini可用于uWsgi /etc/uwsgi/apps-available,将其链接到/etc/uwsgi/apps-enabled.
重启uwsgi服务.
然后对于Apache(2.4.10)模块,mod-proxy-uwsgi在我的虚拟主机conf中添加了几行:
ProxyPass /adm/y uwsgi://127.0.0.1:3033/
Run Code Online (Sandbox Code Playgroud)
这似乎是最脆弱的一点,因为我觉得我需要设置uWSGIModifier1 5在这里,但没有弄清楚在哪里以及如何?
重新启动Apache并获得"内部服务器错误".在uwsgi日志中我只看到:
Tue Jan 19 02:10:36 2016 - spawned uWSGI worker 1 (pid: 21712, cores: …Run Code Online (Sandbox Code Playgroud) 我有这个简单的PSGI应用程序(app.psgi).
use strict;
use warnings;
my $app = sub {
my $mem = `ps -o rss= -p $$`;
$mem =~ s/^\s*|\s*$//gs;
return [ 200, [ 'Content-Type' => 'text/text' ], [ $mem ]];
};
Run Code Online (Sandbox Code Playgroud)
我被要求上述1000次并增加了内存使用量.根据启动服务器的方式,得到:
plackup - 内存使用量在前3个请求中提高,并在接下来的997个请求中保持不变
plackup -r - 内存使用量随机增加(不是每次请求)4k.
starman - 如上所述,内存使用量随机增加4k,但速度较慢
问题是:
如果有人想测试这个 - 这是我的获取脚本:
use strict;
use warnings;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => 'http://localhost:5000');
my $old_mem = 0;
print "req#\tmem\n";
foreach my $i (1..1000) …Run Code Online (Sandbox Code Playgroud) 我试图理解服务器端Websocket端点的实现/选项 - 特别是在使用PSGI/Plack的Perl中我有一个问题:为什么所有服务器端websocket实现都基于事件驱动的PSGI服务器(Twiggy,Tatsumaki等). )?
我认为websocket通信是异步的,但非事件驱动的PSGI服务器(比如Starman)可以产生一个异步监听器来处理websocket方面的事情.我已经看过(但不了解)Websocket服务器的PHP实现,为什么不用PSGI就可以完成同样的操作而不必将服务器更改为事件驱动的服务器?