标签: psgi

如何使用Test :: WWW :: Mechanize :: PSGI测试Dancer应用程序?

我不确定以正确的方式为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)

testing perl www-mechanize dancer psgi

8
推荐指数
1
解决办法
1122
查看次数

PSGI日志记录(Perl)

尽管文档相当少且不清楚,并且对于初学者来说是有效的方法,但我已经逐渐喜欢PSGI,并且我目前正在其中一个应用程序中使用它.我想知道的是如何在多节点应用程序中管理日志记录?有关登录PSGI的"最佳实践"是什么?

perl logging psgi

8
推荐指数
1
解决办法
1560
查看次数

是否可以在不读取请求的整个主体的情况下在Plack :: Middleware中强制执行最大上载大小?

我刚刚将一个PageKit(mod_perl)应用程序转换为Plack.这意味着我现在需要一些方法来强制执行Apache2 :: Reques 先前已经处理过的POST_MAX/MAX_BODY .最简单的方法可能只是将nginx放在应用程序前面,但是应用程序已经位于HAProxy后面,我不知道如何使用HAProxy执行此操作.

那么,我的问题是我如何在不首先阅读整个请求的情况下在Plack :: Middleware中强制执行最大体型

具体来说,我关注文件上传.通过检查大小普拉克::支持::上传为时已晚,因为整个身体会一直在这一点上阅读.该应用程序将通过Starman部署,所以psgix.streaming应该是true.

perl plack http-request psgi

8
推荐指数
1
解决办法
403
查看次数

多语言PSGI-web部署

我计划用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)

问题:

  • 什么是最好的解决方案?
  • 使用Starman或其他纯perl服务器存在任何解决方案?如果有,怎么样?反向代理?
  • 纯粹的perl解决方案会更好(更快)吗?
  • 我应该考虑其他解决方案吗?(fcgi,nginx等...)

什么其他的想法/事物会对开发本身产生什么影响?

perl plack dancer psgi

7
推荐指数
1
解决办法
787
查看次数

谁对http:// 0:port错了?

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是"错误的"
  • 或者它无效,PSGI仅将其用作"随机有效"的快捷方式?

perl lwp psgi

7
推荐指数
1
解决办法
320
查看次数

使用Apache反向代理处理plack/PSGI应用程序的身份验证

这是我的情景:

Apache的反向代理接龙

所以,

  1. 通过加密HTTPS的请求转到Apache,如: https://server1/MyPerlApp
  2. 如果用户未登录,则会重定向到某个登录页面(在server1中),并且Apache不会将请求代理到Server2
  3. 当登录的用户-被验证-再阿帕奇转发所有的请求被即将https://server1/MyPerlApphttp://server2:5000

问题1:这可能吗?(问,因为我不太了解Apache,这不是一个简单的:

ProxyPass /MyPerlApp http://server2:5000/
Run Code Online (Sandbox Code Playgroud)

因为我需要在server1上验证用户身份,并ProxyPass在验证时设置Only.由于Apache非常灵活,我认为上面的答案是肯定的(但确认和细节非常受欢迎) - 所以这是我的主要具体问题:

  • 我的Plack应用程序将如何知道Apache级别(第一台服务器)上的用户身份验证?
  • 什么是将一些用户信息提供给perl服务器2上的应用程序的简单方法?例如,使用Apache 为每个查询mod_rewrite附加一个user=username参数,
  • Apache可以设置我的perl应用应该读取的一些HTTP标头吗?
  • 有一种简单而又重新开始的方式吗?

我正在寻找如何避免我的starman/perl应用程序中的身份验证例程,因为:

  • 用户无论如何都需要登录到server1(对于他工作流程中的其他任务)
  • 如果他已经登录,则不需要在我的应用程序中进行身份验证(避免不必要的双重登录)
  • 但是我仍然需要知道哪些用户已登录(通过server1上的Apache)

已经有类似的问题,但是:

apache perl reverse-proxy plack psgi

6
推荐指数
1
解决办法
4352
查看次数

Catalyst事件循环一次只到达一个客户端

我正在开发一个Catalyst/psgi应用程序,它可以很好地利用异步流,但不仅仅是一个简单的计时器(比如这里:http://www.catalystframework.org/calendar/2013/13),我有点儿难以理解如何实施更多"全球"事件.

通过全球事件,我的意思是:

  1. 定期计时器,对所有客户端都是相同的
  2. 单个客户端访问给定页面(但更新所有客户端)
  3. 文件统计观察程序,它将在文件更改时更新所有客户端.

如果我错了,请纠正我,但对我来说,这些似乎与上面链接的示例非常不同,这将给每个客户一个不同的计数器.我想让事件"全面发生".

我尝试过的一个例子(使用上面列表中的#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没用.

但是,如果每个客户的请求都在其自己的包含气泡中,我如何从其他请求访问其流?

或者我完全走错了轨道......?

perl catalyst psgi

6
推荐指数
1
解决办法
153
查看次数

为什么Dance应用程序在uWSGI + Apache下失败?

我的Dancer应用程序在uWSGI(2.0.7)+ Apache(2.4.10)组合下失败,而它在其他环境(uWSGI + nginx,Starman + Apache,Dancer自己的开发服务器)中自由运行.我没有在日志中找到任何有意义的信息.所以我做了简单的测试应用程序

$ dancer -a tset
Run Code Online (Sandbox Code Playgroud)

然后将默认复制production.ymluwsgi.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)

apache perl uwsgi dancer psgi

6
推荐指数
1
解决办法
411
查看次数

为什么要提高plackup(或starman)的内存使用率?

我有这个简单的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,但速度较慢

问题是:

  • 为什么提高内存使用率?泄漏在哪里,以及如何实现恒定的内存使用(特别是在starman上),因为我不想长期耗尽内存.(好的,可以定义例如--max-requests 100),但它不是内存使用的答案.
  • 或者 - 我的例子有什么问题?

如果有人想测试这个 - 这是我的获取脚本:

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)

perl plack psgi

5
推荐指数
1
解决办法
1625
查看次数

非事件驱动的HTTP服务器环境中的服务器端Websocket实现

我试图理解服务器端Websocket端点的实现/选项 - 特别是在使用PSGI/Plack的Perl中我有一个问题:为什么所有服务器端websocket实现都基于事件驱动的PSGI服务器(Twiggy,Tatsumaki等). )?

我认为websocket通信是异步的,但非事件驱动的PSGI服务器(比如Starman)可以产生一个异步监听器来处理websocket方面的事情.我已经看过(但不了解)Websocket服务器的PHP实现,为什么不用PSGI就可以完成同样的操作而不必将服务器更改为事件驱动的服务器?

perl websocket psgi

5
推荐指数
1
解决办法
388
查看次数