我可以在Prefork MPM下使用Apache mod_proxy作为连接池吗?

时间:2012-02-10 01:46:51

标签: apache connection-pooling reverse-proxy mod-proxy

概要/ Quesiton:

我让Apache运行Prefork MPM,运行php。我正在尝试使用Apache mod_proxy创建一个反向代理,我可以通过它重新路由我的请求,以便我可以使用Apache来进行连接池。示例impl:

在httpd.conf中:

SSLProxyEngine On
ProxyPass /test_proxy/ https://destination.server.com/ min=1 keepalive=On ttl=120

但是当我运行我的测试时,这是循环中的以下命令:

curl -G 'http://localhost:80/test_proxy/testpage'

它似乎没有重新使用连接。

在进一步阅读后,听起来我没有获得连接池功能,因为我使用的是Prefork MPM而不是Worker MPM。因此,每次我向代理发出请求时,它都会使用自己的连接池(大小为1)来旋转新进程,而不是使用维护自己的池的单个工作进程。这种解释是对的吗?


背景信息:

我通过https向我运行的网站上的每个网页发出请求的外部服务器。

协商SSL握手的成本很高,因为我使用php并且它似乎不支持连接池 - 如果我向我的网站收到300个页面请求,他们必须向外部服务器进行300次SSL握手,因为每个脚本运行完毕后,连接都会关闭。

所以我试图在Apache下使用反向代理作为连接池,在PHP进程中保持连接,所以我不必经常进行SSL握手。

给我这个想法的消息来源:

3 个答案:

答案 0 :(得分:2)

首先,您的测试方法无法演示连接池,因为对于每次调用,curl客户端都会生成然后它就会死掉。就像死去的人不会说太多话,死的过程无法保持联系。

您的客户端会困扰您的代理服务器。

Client ====== (A) =====> ProxyServer

让我们调用此连接A.您的代理服务器什么都不做,它只是一个炫耀。帅气而勤奋的服务器非常谦逊,他隐藏在后面。

Client ====== (A) =====> ProxyServer ====== (B) =====> WebServer

在这里,如果我没有错,安全连接是A,而不是B,对吧?

重复我的第一点,在测试中,您正在为每个请求创建一个单独的客户端。每个客户都需要单独的连接。连接是至少在两方之间发生的事情。一边离开,连接丢失。

好的,让我们现在忘记卷曲,一起看看我们真正想做的事情。

我们希望在A上使用SSL,我们希望流量的一方尽可能快。为了达到这个目的,我们已经分开了B面,所以它不会让A更慢,对吗?

连接汇集?在A处没有连接池这样的事情。每个客户端来来去去都会产生很多噪音。只有能够帮助你降低这种噪音的东西才是“Keep-Alive”,这意味着在短时间内保持与 a 客户端的连接,这样同一个客户端就可以请求其他文件。这个要求是必需的。当我们完成后,我们就完成了。

对于B上的连接,将汇集连接;但这不会给你带来任何性能,因为在单服务器设置中你没有这部分噪音产生。

我们如何帮助这个系统更快地运行?

如果这两台服务器在同一台机器上,我们应该摆脱炫耀服务器并继续使用我们勤奋的网络服务器。它为系统增加了许多不必要的工作。

如果这些是独立的机器,那么你通过至少从这个可怜的人那里获得加载(对于ssl)加载来对web服务器很好。但是,你可以更好。

如果您想继续使用Apache,请从mpm_prefork切换到mpm_worker。如果有300多个并发请求,这将更好。我真的不知道你的硬件容量;但如果处理300个请求很困难,我相信这个小小的改动将对你的系统有很大的帮助。

如果你想拥有一个更轻量级的系统,可以考虑将nginx作为Apache的替代品。使用PHP非常easy to setup,它会有更好的性能。

除了前端方面,还要考虑检查数据库服务器。连接池将在这里发挥真正的作用。确保您的PHP安装配置为重用与数据库的连接。

此外,如果您在同一系统上托管静态文件,则可以将其移出另一个Web服务器,或者通过将静态文件移动到具有AWS的S3 + {{CDN的云系统来做得更好3}}或CloudFront。即使没有CloudFront,S3也会让你开心。 Rackspace的解决方案附带Akamai!

取出静态文件会使你的网络服务器“哦发生了什么,这是什么沉默?哦天堂!”既然你提到这是一个网站,网页上大多数时候都会为每个动态生成的html页面提供很多静态文件。

我希望你能把这个可怜的家伙从杀手的工作中解救出来。

答案 1 :(得分:1)

Prefork仍然可以为每个进程的每个后端服务器池连接1个连接。

Prefork不一定为每个前端请求创建一个新进程,服务器进程自己“合并”,并且行为取决于例如: MinSpareServers / MaxSpareServers和朋友。

为了最大限度地提高prefork进程为您提供后端连接的频率,请避免使用极高或极低的maxspareservers或非常高的minspareservers,因为这会导致“新鲜”进程接受新连接。

您可以在LogFormat指令中记录%P,以帮助了解流程重用的频率。

答案 2 :(得分:0)

在我的案例中,问题是,反向代理和后端服务器之间的连接池没有发生,因为后端服务器Apache在每个HTTPS请求结束时关闭了SSL连接。

后端Apache Server正在这样做,因为httpd.conf中存在以下指令:

SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown

当后端服务器通过反向代理连接时,此指令没有意义,这可以从后端服务器配置中删除。