Perl Web服务(服务器)最佳实践

5

我目前使用经过修改的HTTP::Daemon::Threaded服务器,结合SOAP::WSDL和Pod::WSDL提供由各种客户端类型和角色使用的Web服务。

---- 这不是问题,以下才是 -----

我希望在以下主题方面达到最佳解决方案(尽可能):

  • 请求/分发/响应速度
  • 协议安全性(正确使用客户端身份验证的SSLv3/TLS)
  • 资源安全性(基于每个资源和每个方法的安全角色/特性)
  • 声明性规范类型、方法签名和所需的安全角色和特性。

问题:

  1. 我想使用基于IO::SelectIO::Async::Loop::IO_Ppoll的服务器,但我了解到这与服务器内部的客户端身份验证SSL不兼容。 我的理解正确吗?

  2. 我想摆脱在每个请求上验证客户端证书的方式,转而使用CA SiteMinder之类的东西,在成功验证客户端证书后,我会发放一个有时限的会话cookie,可以在后续请求中使用以避免这种时间惩罚(并减轻服务器负载)。 这样安全吗?(或者足够好吗?)

  3. 是否有一些模块/框架可以构建到所提供的Trait和Role-based授权中,以公开对象和方法。Pod::WSDL只处理类型(甚至不是复杂类型)。我想使用/实现某些声明性注释(或外部YAML)-based方案来处理复杂的WSDL类型以及Trait & Role授权。 有人做过吗?(即使是分开的?)是否有其他模块可能是一个很好的起点?

  4. 最后 - 我用Perl5做这件事是不是疯了? ;)


你为什么要自己编写服务器?有什么特殊的需求是像Apache或Lighttpd这样的其他服务器无法满足的吗? - brian d foy
1
服务器部分是比较容易的。也许我应该在我的帖子中更加强调安全和授权主题。我试用了一堆服务器配置,包括Apache、lighthttpd、NginX、HTTP::Daemon和HTTP::Daemon::Threaded。 - David-SkyMesh
继续上文...使用我现有的(一些公寓式,一些actorish)代码库,考虑到“另一个服务器”情况下的启动/调度,我发现HTTP::Daemon::Threaded是速度方面最优的解决方案。但实际上,这是次要的。我只包含了这些信息,以便限制讨论我所询问的主题:安全性、声明性WSDL类型和授权,最后(但不排除)请求/调度/响应速度。 - David-SkyMesh
@David:对我来说,这并没有真正澄清任何事情。仅凭您在帖子和评论中所说的内容,似乎Apache或Lighthttpd都可以轻松处理这些内容。我已经为它们编写了许多奇怪的身份验证方案。是线程化的Perl驱动了大部分的决策吗? - brian d foy
也许您可以举些例子。我不明白Apache或Lighthttpd在“声明性WSDL类型和授权”方面给我的优势是什么。它们是否具有一些预构建的面向SOAP的基础设施,可以用于像Perl这样的弱类型语言?我非常清楚任何服务器都可以处理SSL部分。我关于安全性的问题是关于使用Cookie来避免不断重新验证SSL客户端证书。 - David-SkyMesh
我认为如果我将这些问题分成单独的Stack Overflow问题,也许就会有更好的运气,也许不提及服务器问题会更好,因为这并不重要。我之所以提到服务器,只是为了防止它限制我的选择,但是没有人开始解决那些真正的问题。 - David-SkyMesh
3个回答

1

好的,大家都回答了一切,但是真正的问题还没有解决。

我会将这些问题分成不同的帖子,并且不会提到服务器构成这个话题 - 这是本帖中似乎每个人都想讨论的话题,但完全无关紧要。


0

我知道这是一个老问题,但是FYI IO::Async 与SSL一起使用没有问题,自从有了IO::Async::SSL模块。


啊,是的。谢谢你的回答。我后来发现确实是这样的。然而,回答这类问题还是有一些困难的,因为在当时没有人看到以可组合的方式有效地实施服务器基础架构的价值(现在由 Plack、Starman 等角色填充)。你问这个问题,就会被淹没在无关的“你在重复造轮子”的答案/评论中。 - David-SkyMesh

-5

你用Perl做这个真是太疯狂了 :-)

开玩笑的,不过还是要佩服你。我的问题是,假设你有某些原因要重新发明轮子,为什么不考虑Python呢?Perl依然活跃,但现在很多这种低级脚本都是用Python完成的。

最后,假设你没有实际理由去做这件事(除了好玩),你应该真正考虑一个Web框架(当然是Django)和像nginx这样的东西来处理HTTP交互。


这不是为了好玩。这是对现有基础设施进行现代化尝试,同时重用数千个以前编写的 Perl 模块。无论如何,Django 自动给我提供了我所要求的授权基础设施吗?我确实使用 NginX 来处理静态 HTTP 内容。我发现(线程化的)纯 Perl 服务器的速度与灵活性都很高。最接近的替代方案是带有线程调度程序的 NginX + FastCGI... 实际上最终也是一样的,只是现在我必须处理一个外部系统来进行客户端证书验证。 - David-SkyMesh
在查看了Django文档之后,也许我漏掉了什么,但我没有看到任何声明性WSDL类型和角色+特征授权的可能性,更不用说可用性了。是否有贡献库可以做到这一点,或者至少提供一个起点?我并不排除在另一种语言(比如Python)中完成这部分工作,毕竟我可以将最终请求代理到现有服务器上——只要不太费钱。 - David-SkyMesh
1
在这种情况下,我认为Perl和Python是等效的工具。也许Perl在CPAN方面更有优势,但Python无法做到Perl(甚至Ruby)做不到的事情。 - brian d foy
David,Django将为您提供访问HTTP信息以进行HTTP身份验证的权限,然后您将不得不将其插入某种身份验证机制中(http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.META)。或者,您可以使用他们内置的身份验证(http://docs.djangoproject.com/en/dev/topics/auth/)。然后,使用FLUP作为cgi服务连接到nginx。如果要使用nginx,则无法使用wsgi。 - Adam Nelson
请记住,使用Django时,您仍然可以使用整个Python(2.6)堆栈进行底层操作。 Django只是为执行所有常见Web操作提供最佳实践方法。 - Adam Nelson
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接