问题标签 [plack]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
perl - 为什么将 nginx 与 Catalyst/Plack/Starman 一起使用?
我正在尝试使用 Plack/Starman 部署我的小型 Catalyst Web 应用程序。所有文档似乎都建议我想将它与 nginx 结合使用。这样做有什么好处?为什么不在端口 80 上直接使用 Starman?
perl - nginx 和 Perl:FastCGI 与反向代理(PSGI/Starman)
如今,运行 Perl Web 应用程序的一个非常流行的选择似乎是在 nginx 网络服务器后面,该服务器将请求代理到 FastCGI 守护程序或启用 PSGI 的网络服务器(例如 Starman)。
有很多关于为什么通常会这样做的问题(例如,为什么将 nginx 与 Catalyst/Plack/Starman 一起使用?),答案似乎适用于两种情况(例如,允许 nginx 提供静态内容,轻松重启应用程序服务器,负载平衡等)
但是,我对使用 FastCGI 与反向代理方法的优缺点特别感兴趣。似乎 Starman 被广泛认为是最快和最好的 Perl PSGI 应用程序/Web 服务器,我很难看到使用 FastCGI 的任何优势。这两种方法似乎都支持:
- UNIX 域套接字以及 TCP 套接字
- fork/流程管理器样式的服务器以及基于事件的非阻塞(例如 AnyEvent)服务器。
- 信号处理/优雅重启
- PSGI
同样,任一选项的 nginx 配置都非常相似。
那么为什么你会选择其中之一呢?
perl - 如何堆叠 Plack 身份验证处理程序?
我想让我的 Plack 应用尝试几种不同的方式来授权用户。具体来说,检查用户是否已通过会话 cookie 获得授权,然后检查 Digest 身份验证,然后回退到 Basic。
我想我可以按照我希望检查它们的顺序(会话、摘要、基本)启用一堆 Auth 处理程序。不幸的是,如果摘要或基本身份验证不存在,则Plack::Middleware::Auth::Digest和Plack::Middleware::Auth::Basic的编写方式分别返回 401。
这在 Plack 通常是如何处理的?
perl - 以单独用户身份运行应用程序的最佳初始化脚本
我有一个在用户帐户(基于 Plack)中运行的应用程序,并且需要一个 init 脚本。
它看起来就像“sudo $user start_server ...”一样简单。我刚刚使用 start-stop-daemon 编写了一个 LSB 脚本,它真的很笨拙和冗长。感觉不是正确的方法。
经过一番搜索并查看示例日志后,我仍然不确定执行此操作的最佳方法是什么,并且我没有找到一个有凝聚力的指南。
现在我正在使用它:
使用 DAEMON 和 DAEMON_OPTS 作为:
这需要我调整如何检测运行,因为它是一个 perl 脚本,所以 perl 显示为命令而不是“start_server”。
(我在该用户帐户上使用 perlbrew 运行它,因此它与系统 perl 完全分离,这就是路径指向用户目录中的 perl 的原因)
这真的是最好的方法吗?这对我来说似乎很笨重,但我不是管理员类型。
perl - 如何使 Mason2 UTF-8 干净?
重新提出问题,因为
- @optional问我
- 不清楚并链接了一个基于HTML::Mason的解决方案使用 Apache、mod_perl 和 DBI 使 Mason UTF-8 Unicode 干净的四个简单步骤,导致混淆的原因
- 原作4岁,同时(2012年)创作了“诗人”
评论:这个问题已经获得了“热门问题徽章”,所以可能我不是唯一一个绝望的人。:)
不幸的是,展示完整的问题堆栈会导致一个很长的问题,而且它是非常特定于Mason的。
首先,只有意见的部分:)
我使用 HTML::Mason 已经很久了,现在尝试使用 Mason2。Poet和Mason 是 CPAN 中最先进的框架。没有发现任何可比的东西,开箱即用的东西可以写得如此干净/但非常容易破解:)/网络应用程序,包括许多电池(日志记录、缓存、配置管理、基于原生 PGSI 等...)
不幸的是,作者并不关心单词的其余部分,例如默认情况下,它仅基于 ascii, 没有任何手册、常见问题解答或建议:如何将其与 unicode 一起使用
现在事实。演示。创建一个诗人应用程序:
并添加到dhandler.mc
以下内容(将演示这两个基本问题)
并运行应用程序
去http://0:5000/xls/hello.xlsx你会得到:
单击下载 hello.xlsx,您将进入hello.xlsx
下载。
上面演示了第一个问题,例如组件的源代码不是“在”下use utf8;
,所以lc
不理解字符。
第二个问题如下,尝试 [ http://0:5000/xls/hélló.xlsx]或 http://0:5000/xls/h%C3%A9ll%C3%B3.xlsx 你会看:
当然,输入 (the path_info
) 没有被解码,脚本使用 utf8 编码的八位字节而不是 perl 字符。
所以,告诉 perl -“源代码在 utf8 中”,通过use utf8;
将<%class%>
添加use feature 'unicode_strings'
(或use 5.014;
)更糟:
当然,源现在包含宽字符,它需要Encode::encode_utf8
在输出处。
可以尝试使用这样的过滤器:
并过滤整个输出:
但这只是部分帮助,因为需要关心<%init%>
or<%perl%>
块中的编码。在许多地方的 perl 代码中进行编码/解码(阅读:不在边界处)会导致代码冗长。
编码/解码应该清楚地在 Poet / Mason边界的某个地方完成- 当然,Plack 在字节级别上运行。
部分解决。
令人高兴的是,诗人巧妙地允许修改它(和梅森)的部分,因此, $poet_root/lib/My/Mason
您可以将其修改Compilation.pm
为:
什么会将所需的序言插入到每个Mason 组件中。(不要忘记触摸每个组件,或者只是从 中删除已编译的对象$poet_root/data/obj
)。
您也可以尝试在边界处理请求/响应,方法是编辑$poet_root/lib/My/Mason/Request.pm
:
对所有内容进行编码是一个错误的策略,它会破坏例如 XLS。
因此,4 年后(我在 2011 年问了原始问题)仍然不知道:(如何在Mason2应用程序中正确使用 unicode,并且仍然不存在任何关于它的文档或帮助者。:(
主要问题是: - 在哪里(Moose 的方法修饰符应该修改哪些方法)以及如何正确解码输入以及输出在哪里(在 Poet/Mason 应用程序中。)
- 但只有文本的,例如
text/plain
ortext/html
等等…… - a 做上述“无惊喜” - 例如,什么会简单有效。;)
有人可以帮忙提供真正的代码吗 - 我应该在上面修改什么?
perl - PSGI 回应:哪些类型的文件句柄可以与 PSGI 和 Plack 一起使用?
PSGI规范将 HTTP 响应定义为由三部分组成,其中第三部分可以是数组引用或文件句柄。文件句柄可能是:
一个 IO::Handle 类对象或内置文件句柄。
规范继续说:
服务器可以使用 fileno 和 Scalar::Util::reftype 检查主体是否是真实的文件句柄,如果它是具有文件描述符的真实文件句柄,它可以使用 sendfile(2) 等技术优化文件服务。
现在,我使用plackup
(Plack 版本 0.9978)拼凑了一个命令行示例,似乎检查正文是否是真正的文件句柄会导致致命错误:
Can't locate object method "FILENO" via package "IO::Scalar" at /usr/lib/perl5/5.10/i686-cygwin/IO/Handle.pm line 390
这是命令行示例:
当然我不能使用文件句柄:
但我对什么有效,什么无效感兴趣。那么,Plack 在调用句柄时是否应该更加小心,FILENO
以免遇到异常?
并添加另一个:
看起来文件句柄没有被识别为这样。错误信息是:
body should be an array ref or filehandle at /usr/lib/perl5/site_perl/5.10/Plack/Middleware/StackTrace.pm line 35
更新:
正如 ysth 在他的回答中所说,以下将起作用(至少在 Cygwin 上的 5.10.1 上):
但很明显,从失败的示例中可以看出某个地方存在问题,一旦我确定它实际上是什么,就会报告它。
perl - 多语言 PSGI-web 部署
我计划用 PSGI/Plack 开发一个 Web 应用程序。(可能与舞者,但尚未决定)。
应用程序应该是 utf8,多语言(使用 Locale::Maketext)和(ofc)将包含给定语言的一些静态页面。我的想法是将其部署在不同的语言域中en.example.com
,例如de.example.com
等。应用程序本身很简单,大多数情况下只会用本地化文本和其他一些(轻量级)功能填充模板。
在一台物理机上为多种基于语言的子域部署一个应用程序的最佳解决方案是什么?
我目前的研究以这个解决方案结束:需要为每个语言子域使用 Apache 及其基于名称的虚拟服务器。
问题:
- 什么是最好的解决方案?
- Starman 或其他纯 perl 服务器是否存在任何解决方案?如果是,如何?反向代理?
- 纯 perl 解决方案会更好(更快)吗?
- 我应该考虑其他解决方案吗?(fcgi、nginx 等...)
还有什么其他想法/事情会对发展本身产生影响吗?
perl - 如何使用 Starman 设置类似 Apache 的基于名称的虚拟主机
在我之前的问题中,我询问了多域解决方案,但问题太复杂了。
现在简而言之:
是否可以像使用 Apache 的指令一样使用 Starman(或任何其他纯 perl PSGI 服务器)设置基于名称的虚拟主机?<VirtualHost ...>
还是我需要使用 Apache 来获得这种功能?
任何的想法?
perl - 一个 Plack 应用程序如何影响另一个?
我有这个:
将$config_app
配置值保存到文件app.cfg
中并将其$app
加载为配置文件。不需要在每个请求中读取配置文件。需要在应用程序开始时阅读它,并在更改时重新阅读。
实现这一目标的最佳方法是什么?
我唯一的想法是:应用程序会记住最后的 config_read_time,并且在每个请求中都会检查app.cfg
. 如果文件被修改,将重新读取它。
这里有更好的解决方案吗?(意味着 $config_app 和 $app 之间的一些消息传递,例如当 $config_app 保存新配置时will send some message to $app: re-read the config
。