标签: psgi

Plack :: App :: CGIBin通过Apache和mod_fastcgi - 找不到CGI脚本

我正试图Plack::App::CGIBin在FreeBSD 8.2上使用Apache2和FastCGI.最终的目标是能够使用这个设置通过Plack服务一大堆遗留的CGI脚本,以便利用其中间件功能,但我甚至无法得到一个简单的例子.

我已经按照关于Plack :: Handler :: FCGIPlack :: 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)

apache perl fastcgi plack psgi

34
推荐指数
1
解决办法
905
查看次数

PSGI:它是什么,有什么大惊小怪的?

我一直试图决定我的Web项目是否是使用PSGI实现的候选者,但我真的没有看到它在这个阶段对我的应用程序有什么好处.

我真的不明白所有的大惊小怪.对我来说,PSGI似乎是一个框架,它提供了不同Apache模块之间的通用接口,允许您在它们之间移动应用程序.例如,轻松地将您的应用程序从mod_perl上运行到fastcgi,并提供运行这两个选项的应用程序支持.

是的,还是我错过了什么?

因为我和团队不仅是开发应用程序的一部分,而且几乎都是服务器的维护和设置,我没有看到能够在fastcgi,cgi和mod_perl上运行的价值,我们做只需mod_perl即可.

我误解了PSGI功能,还是不适合我的项目?

perl fastcgi mod-perl2 psgi

18
推荐指数
3
解决办法
3594
查看次数

如何使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 multithreading psgi

18
推荐指数
1
解决办法
398
查看次数

部署Perl应用程序

部署Perl应用程序的最佳实践是什么?假设您正在部署到安装了少量CPAN模块的香草盒上.什么是理想的构建,部署方法?Module :: Build,ExtUtils :: MakeMaker,其他?我正在寻找那些为大规模应用反复做过的人的一些最佳实践想法.

应用程序正在部署到服务器上.它不是CPAN或脚本.它实际上是一个PSGI Web应用程序.也就是说,一吨Perl包.

我目前有一个部署脚本,它使用Net :: SSH :: Expect来SSH到新服务器,安装一些工具并配置服务器,然后从源代码控制中下拉所需的应用程序分支.这感觉很对,但这是最好的做法吗?

下一步是构建应用程序.跟踪和管理依赖项,从CPAN安装这些依赖项以及确保应用程序已准备好运行的最佳实践是什么?

谢谢

deployment perl psgi

14
推荐指数
2
解决办法
3302
查看次数

Plack&taint模式

是否建议使用perl的污点模式开发Plack应用程序(中间件)?

如果是,如何在受污染的模式下启动plackup和/或Starman?在简单的CGI脚本中,很容易用shebang线完成.

perl -T /path/to/{plackup|starman}做这个工作吗?或者这是推荐的方式吗?或者不推荐?

关于组合Plack + Taint模式的任何想法,指针,文章?

perl plack psgi

11
推荐指数
1
解决办法
465
查看次数

多站点感知PSGI应用程序开发

普拉克::生成器允许挂接多个主机,例如一些如下面的代码片段:

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. …

perl plack psgi

10
推荐指数
1
解决办法
392
查看次数

是否有除Catalyst之外的任何现代(Moose/PSGI)Web框架?

是否有除Catalyst之外的任何Perl Web开发框架:

  • 写的 Moose
  • 本地为PSGI编写(不是一些PSGI仿真)
  • Unicode就绪/安全 - 所以Perl 5.10+
  • 小巧,可扩展,美观

或者是Catalyst在镇的家伙?:)

据我所知,Dancer,Mojolicious,Jifty不是麋核心

perl web-frameworks moose psgi

9
推荐指数
2
解决办法
502
查看次数

使用Plack/PSGI/Poet应用程序进行身份验证和/或HTTPS

我需要构建一个简单的Web应用程序.我决定用Poet(Mason2)来做,它使用Plack.

应该允许应用程序仅由经过身份验证的用户使用,因此我需要构建一些登录/密码功能.

已经有一个Plack模块Plack :: Middleware :: Auth :: Basic允许使用Basic用户auth,可以设置检查.htpasswd或类似.但基本身份验证不是很安全; 任何人都可以通过数据包捕获等方式获取登录密码.

以下是两种可能的解决方案

  • 通过HTTPS运行我的app.psgi(443) - 链接级加密
  • 或者是否有一些更好的auth方法允许在没有https的情况下进行安全身份验证?

问题:

  • 关于HTTPS - 我不知道如何运行我的app.psgiHTTPS.我需要稍微修改一下我的应用程序吗?什么链接显示我如何运行plackuphttps?
  • 或者第二种:是否有一些方法(中间件/或perl模块)允许我在标准的未加密端口上构建 安全认证?(80)

那么,使用Plack应用程序实现安全身份验证的相对简单方法是什么?

PS:我不关心其余的沟通.我只需要不允许获取密码的安全身份验证.

PPS:https很容易使用apache(和自签名)证书.但我不知道如何使用它plackup(以及任何其他基于Plack的服务器)

perl plack psgi poet

9
推荐指数
1
解决办法
1533
查看次数

为什么Test :: WWW :: Mechanize :: PSGI使用端口?

我有一些看起来像这样的代码:

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(它们在浏览器中工作正常).我错过了什么?

  • 测试:: WWW :: Mechanize :: PSGI版本0.35
  • Plack版本1.0030
  • Catalyst版本5.90051

更改MyApp->runMyApp->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 catalyst plack psgi

9
推荐指数
1
解决办法
503
查看次数

在Plack中发送无缓冲的响应

我正在使用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响应来刷新每行的内容,因此用户在收集数据时实时开始接收内容,而不必将所有数据累积到可靠的第一个?

提前感谢您的任何意见!

perl plack uwsgi psgi

9
推荐指数
1
解决办法
387
查看次数