我应该将我的WebBroker项目迁移到Indy吗?

4
很久以前,我开始使用Delphi 2007和WebBroker(TWebModule)创建一些“Web应用程序”。当时我认为你需要像Apache或Microsoft IIS这样的Web服务器才能创建任何类型的网站。此外,除了虚拟服务器(使我可以在单个IP地址上拥有多个域名和SSL)之外,我不使用大多数Apache功能。因此对我来说,Apache只是一个额外的层,并且使调试变得困难。
现在进入Indy(TIdHTTPServer)。如果我理解正确,Indy是一个Web服务器。因此,通过使用Indy,我不再受限于使用Apache或其他Web服务器。这正确吗?
在Indy环境中支持虚拟服务器是否会有任何问题?那么SSL呢?我已经搜索了文献,从我所看到的内容来看,它完全支持SSL证书。
我现在正在将我的一些应用程序从WebBroker移植到Indy。这主要涉及用ARequestInfo:TIdHTTPRequestInfo替换代码中的Request:TWebRequest引用,以及用AResponseInfo:TIdHTTPResponseInfo替换Response:TWebResponse引用。
有没有办法在Indy中使用TWebModule架构,以便我不需要重写所有内容呢?
最后,还有什么其他需要注意的事项吗?我的目标是将Apache从循环中去除。

哪个版本的Delphi? - Ondrej Kelle
@TOndrej Indy 支持 Delphi 5(或6)及更高版本... - mjn
@mjn 我问的是 Delphi 的版本,因为 XE 已经默认支持使用 Indy 创建独立的 WebBroker 应用程序。 - Ondrej Kelle
@TOndrej 抱歉,我不知道(仍在使用2009),删除Apache依赖的简单选项 - mjn
3个回答

3
是的,你可以使用Indy的TidHTTPServer作为Web服务器,但它比IIS或Apache低级得多。没有虚拟服务器的概念 - 这是需要自己实现的。
Indy也支持SSL,通过OpenSSL dll's。
我想你最大的担忧将与安全有关......有数百万个站点运行着Apache或IIS,有一堆人致力于发现这些平台中的缺陷,并有一群人在修复其中的一些缺陷。而Indy并非如此......只有一两个人会在新闻组上回应你发现的错误。(特别是一个人,他很可能也会在这里回答你的问题。)
现在,我使用Indy HTTP服务器(以及SecureBlackBox SSL支持),我发现它非常适合我的目的。

另外,Web应用程序调试器在内部使用Indy HTTP服务器来运行Web Broker数据模块...因此,您可以按照Delphi中WAD实用程序的模型构建自己的服务器。 - Darian Miller
1
当然,这使得Apache和IIS成为更大的目标,因此你也有更多的坏人在寻找和开发漏洞!使服务器绝对安全的唯一方法是关闭它;-) - HMcG
就Indy的可扩展性与Apache相比而言,这是一个棘手的比较。Indy是一个通用库,其上添加了HTTP服务器。Apache已经定制为HTTP服务多年,因此可以假设有许多在Indy中没有的优化。 - Darian Miller
实数:最近我在我的Indy服务器上使用JMeter进行了真实交易处理测试,每分钟获得了1,000个SSL请求(每个请求大小为25KB),因此它可以处理相当大的负载。 - Darian Miller
带宽并不是一切,因为你实际上必须对接收到的数据进行处理。在事务处理过程中会有明显的等待时间——SQL查找、更新、插入等。使用20个客户端线程进行JMeter负载测试。对于我的目的来说,它非常稳定且速度足够快。 - Darian Miller
显示剩余4条评论

2
Indy HTTP服务器调用WinSock API,并能够实现以下功能:
- 完整的HTTP/1.1服务器; - 完整的HTTPS服务器(使用OpenSSL库或其他第三方库,如SecureBlackBox)。
据我所知,您可以使用Indy来发布Web模块。请参见http://www.2p.cz/files/2p.cz/downloads/howto/indy_soap_web_services_in_delphi.pdf 您还可以使用其他服务器,例如直接使用内核模式http.sys服务器,该服务器由ISS和.Net WCF等应用程序使用,被认为非常稳定和高效(它越过了WinSock API)。当然,如果需要,它也可以提供HTTPS内容。它自Windows XP SP2以来就已经是标准组件,因此在Vista和Seven上也可用。使用此组件将让Microsoft为您完成所有调试工作,并且它会随着主机操作系统更新。例如,在我们的客户端-服务器ORM中,我直接使用它来替换废弃的DCOM连接,在客户端具有很好的速度和稳定性。

2

关于虚拟服务器 - HTTP 1.1 规范要求客户端发送一个 Host 请求头,以便虚拟服务器知道正在使用的域名,特别是在多个域名具有相同 IP 的情况下进行处理。 TIdHTTPRequestInfo 有一个 Host 属性来获取该值。实际上,TIdHTTPServer 在触发任何 OnCommand... 事件之前会内部验证 HTTP 1.1 请求是否具有 Host 头。


啊 - 那么我可以使用 if..then 语句来处理虚拟主机,具体取决于主机。 - M Schenkel

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