我正试图Plack::App::CGIBin在FreeBSD 8.2上使用Apache2和FastCGI.最终的目标是能够使用这个设置通过Plack服务一大堆遗留的CGI脚本,以便利用其中间件功能,但我甚至无法得到一个简单的例子.
我已经按照关于Plack :: Handler :: FCGI和Plack :: App :: CGIBin本身的CPAN文档,但我不确定我是否遗漏了某些内容或做错了哪些文档没有涵盖.
这是我添加的Apache配置:
# Set up external server
FastCgiExternalServer /tmp/placktest.fcgi -socket /tmp/fcgi.socket
# URL to be handled by FastCGI
Alias /plack/ /tmp/placktest.fcgi/
Run Code Online (Sandbox Code Playgroud)
运行外部服务器的命令:
plackup -s FCGI --listen /tmp/fcgi.socket /data/www/psgi/app.psgi
Run Code Online (Sandbox Code Playgroud)
服务器成功启动,返回以下内容:
FastCGI: manager (pid <pid>): initialized
FastCGI: manager (pid <pid>): server (pid <pid>) started
FastCGI: server (pid <pid>): initialized
Run Code Online (Sandbox Code Playgroud)
这是app.psgi:
#!/usr/bin/env plackup -s FCGI
use Plack::App::CGIBin;
use Plack::Builder;
my $app = Plack::App::CGIBin->new(
root => '/data/www/plack',
)->to_app; …Run Code Online (Sandbox Code Playgroud) 我一直试图决定我的Web项目是否是使用PSGI实现的候选者,但我真的没有看到它在这个阶段对我的应用程序有什么好处.
我真的不明白所有的大惊小怪.对我来说,PSGI似乎是一个框架,它提供了不同Apache模块之间的通用接口,允许您在它们之间移动应用程序.例如,轻松地将您的应用程序从mod_perl上运行到fastcgi,并提供运行这两个选项的应用程序支持.
是的,还是我错过了什么?
因为我和团队不仅是开发应用程序的一部分,而且几乎都是服务器的维护和设置,我没有看到能够在fastcgi,cgi和mod_perl上运行的价值,我们做只需mod_perl即可.
我误解了PSGI功能,还是不适合我的项目?
交叉发布:http://perlmonks.org/?node_id = 1191821
考虑app.psgi:
#!perl
use 5.024;
use strictures;
use Time::HiRes qw(sleep);
sub mock_connect {
my $how_long_it_takes = 3 + rand;
sleep $how_long_it_takes;
return $how_long_it_takes;
}
sub main {
state $db_handle = mock_connect($dsn);
return sub { [200, [], ["connect took $db_handle seconds\n"]] };
}
my $dsn = 'dbi:blahblah'; # from config file
my $app = main($dsn);
Run Code Online (Sandbox Code Playgroud)
测量plackup(HTTP::Server::PSGI: Accepting connections at http://0:5000/):
› perl -MBenchmark=timeit,timestr,:hireswallclock -E"say timestr timeit 10, sub { system …Run Code Online (Sandbox Code Playgroud) 部署Perl应用程序的最佳实践是什么?假设您正在部署到安装了少量CPAN模块的香草盒上.什么是理想的构建,部署方法?Module :: Build,ExtUtils :: MakeMaker,其他?我正在寻找那些为大规模应用反复做过的人的一些最佳实践想法.
应用程序正在部署到服务器上.它不是CPAN或脚本.它实际上是一个PSGI Web应用程序.也就是说,一吨Perl包.
我目前有一个部署脚本,它使用Net :: SSH :: Expect来SSH到新服务器,安装一些工具并配置服务器,然后从源代码控制中下拉所需的应用程序分支.这感觉很对,但这是最好的做法吗?
下一步是构建应用程序.跟踪和管理依赖项,从CPAN安装这些依赖项以及确保应用程序已准备好运行的最佳实践是什么?
谢谢
是否建议使用perl的污点模式开发Plack应用程序(中间件)?
如果是,如何在受污染的模式下启动plackup和/或Starman?在简单的CGI脚本中,很容易用shebang线完成.
会perl -T /path/to/{plackup|starman}做这个工作吗?或者这是推荐的方式吗?或者不推荐?
关于组合Plack + Taint模式的任何想法,指针,文章?
该普拉克::生成器允许挂接多个主机,例如一些如下面的代码片段:
my @sites = load_site_names();
my $apps;
for my $site (@sites) {
$apps->{$site} = Some::PsgiFramework::MyApp->new( config => get_config($site) );
}
use Plack::Builder;
builder {
for my $site (@sites) {
mount "$site" => $apps->{$site};
}
mount '/' => sub { ... };
}
Run Code Online (Sandbox Code Playgroud)
例如
load_site_names返回站点的列表一样http://example.com,http://some.other.site.com...Some::PsgiFramework::MyApp我完全需要以上内容 - 需要开发一个简单的网络应用程序,该应用程序应该部署在不同(低流量)站点的数据库中,并且不希望为每个站点设置不同的PSGI服务器.
然而,Plack本身的作者说(在Plack :: Request中)
请注意,此模块旨在供Plack中间件开发人员和Web应用程序框架开发人员而非应用程序开发人员(最终用户)使用.
使用Plack :: Request直接编写Web应用程序当然是可行的,但不推荐:它就像使用mod_perl的Apache :: Request那样:但是程度太低.
如果您正在编写Web应用程序而不是框架,那么建议您使用一个支持PSGI的Web应用程序框架(http://plackperl.org/#frameworks),或者查看HTTP :: Engine等模块在PSGI之上提供更高级别的请求和响应API.
这就是问题所在.
我在MetaCPAN中检查了许多不同的基于PSGI的框架.并且AFAIK每个都是基于单一的,例如,不允许写入应用程序可以多次共享(安装)同一个不同的站点app.psgi. …
是否有除Catalyst之外的任何Perl Web开发框架:
Moose或者是Catalyst在仅在镇的家伙?:)
据我所知,Dancer,Mojolicious,Jifty不是麋核心
我需要构建一个简单的Web应用程序.我决定用Poet(Mason2)来做,它使用Plack.
应该允许应用程序仅由经过身份验证的用户使用,因此我需要构建一些登录/密码功能.
已经有一个Plack模块Plack :: Middleware :: Auth :: Basic允许使用Basic用户auth,可以设置检查.htpasswd或类似.但基本身份验证不是很安全; 任何人都可以通过数据包捕获等方式获取登录密码.
以下是两种可能的解决方案
问题:
app.psgiHTTPS.我需要稍微修改一下我的应用程序吗?什么链接显示我如何运行plackuphttps?那么,使用Plack应用程序实现安全身份验证的相对简单方法是什么?
PS:我不关心其余的沟通.我只需要不允许获取密码的安全身份验证.
PPS:https很容易使用apache(和自签名)证书.但我不知道如何使用它plackup(以及任何其他基于Plack的服务器)
我有一些看起来像这样的代码:
use SomeApp;
use Test::WWW::Mechanize::PSGI;
my $mech = Test::WWW::Mechanize::PSGI->new(
app => sub { SomeApp->run(@_) },
);
$mech->get_ok('/');
Run Code Online (Sandbox Code Playgroud)
但是,一旦get_ok()调用,我收到以下警告:
PSGI error: failed to listen to port 8080: Address already in use at .../5.18.1/HTTP/Server/PSGI.pm line 94.
HTTP::Server::PSGI::setup_listener('HTTP::Server::PSGI=HASH(0x7fe6622fad60)') called at .../5.18.1/HTTP/Server/PSGI.pm line 54
Run Code Online (Sandbox Code Playgroud)
是的,我正在使用那个端口做其他事情.来自Test :: WWW :: Mechanize :: PSGI的文档:
此模块允许您测试PSGI Web应用程序,但不需要服务器或发出HTTP请求.相反,它将HTTP请求对象直接传递给PSGI.
所以从理论上讲,我不需要指定一个端口,但是我得到了上面的警告,并且获取的页面返回了500(它们在浏览器中工作正常).我错过了什么?
更改MyApp->run为MyApp->psgi_app结果:
Can't call method "request" on an undefined value at .../5.18.1/Test/WWW/Mechanize/PSGI.pm line 47.
Run Code Online (Sandbox Code Playgroud)
可以使用以下命令复制此错误: …
我正在使用Perl模块的一部分创建一个大型CSV响应.服务器运行在Plack上,我远非专家.
目前我正在使用这样的东西发送回复:
$res->content_type('text/csv');
my $body = '';
query_data (
parameters => \%query_parameters,
callback => sub {
my $row_object = shift;
$body .= $row_object->to_csv;
},
);
$res->body($body);
return $res->finalize;
Run Code Online (Sandbox Code Playgroud)
但是,该query_data函数不是一个快速的函数,并检索大量的记录.在那里,我只是将每一行连接进去,$body并且在处理完所有行之后,发送整个响应.
我不喜欢这两个原因:首先,它需要大量的RAM才能$body被破坏.其次,在该方法完成工作并实际发送响应之前,用户看不到任何响应活动$res->body($body).
我试图在文档中找到答案,但没有找到我需要的东西.
我也试过调用$res->body($row_object->to_csv)我的回调部分,但似乎最终只发送了我做的最后一次调用$res->body,覆盖了所有以前的调用.
有没有办法发送Plack响应来刷新每行的内容,因此用户在收集数据时实时开始接收内容,而不必将所有数据累积到可靠的第一个?
提前感谢您的任何意见!