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

我可以在Prefork MPM下使用Apache mod_代理作为连接池吗?,apache,connection-pooling,reverse-proxy,mod-proxy,Apache,Connection Pooling,Reverse Proxy,Mod Proxy,摘要/问题: 我让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

摘要/问题:

我让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握手

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


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

Prefork不一定为每个前端请求创建一个新的进程,服务器进程本身是“池化”的,其行为取决于例如MinPareServers/MaxSpareServers和friends

为了最大限度地提高预工作进程拥有后端连接的频率,请避免使用非常高或非常低的MaxSpareserver或非常高的MinsPareServer,因为这将导致新连接中出现“新”进程


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

首先,您的测试方法无法演示连接池,因为对于每个调用,都会生成一个curl客户机,然后它就会消失。就像死人不常说话一样,一个死的过程也不能维持一个联系

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

Client ====== (A) =====> ProxyServer
让我们将此连接称为A。您的代理服务器什么都不做,它只是一种炫耀。这位英俊勤劳的侍者如此谦逊,以至于躲在后面

Client ====== (A) =====> ProxyServer ====== (B) =====> WebServer
这里,如果我没有错的话,安全连接是A,不是B,对吗

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

好吧,现在让我们忘掉卷曲,一起看看我们真正想做什么

我们希望在一个服务器上使用SSL,我们希望一方的通信速度尽可能快。为了达到这个目的,我们已经分离了B面,所以它不会使A变得更慢,对吗

连接池?在A中没有连接池这样的东西。每个客户端来来去去都会发出很大的噪音。唯一能帮助您减少这种干扰的是“保持活动”,这意味着在一段短时间内保持来自客户机的连接活动,以便同一客户机可以请求此请求所需的其他文件。当我们完成时,我们就完成了

对于B上的连接,将合并连接;但这不会给您带来任何性能,因为在一个服务器设置中,您并没有这部分噪声产生

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

如果这两台服务器在同一台机器上,我们应该摆脱炫耀的服务器,继续努力工作的Web服务器。这给系统增加了许多不必要的工作

若这些是独立的机器,那个么您至少可以从这个可怜的家伙那个里获取Encyption(用于ssl)负载,从而对web服务器很好。然而,你可以做得更好

如果要继续在Apache上运行,请从mpm_prefork切换到mpm_worker。在300多个并发请求的情况下,这将工作得更好。我真的不知道你们硬件的容量;但是如果处理300个请求很困难,我相信这个小小的改变会对你的系统有很大帮助

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

除了事物的前端,还考虑检查数据库服务器。连接池在这里将产生真正的不同。确保您的PHP安装配置为重用到数据库的连接

此外,如果您在同一个系统上托管静态文件,那么可以将它们移出另一个web服务器,或者将静态文件移至具有CDN(如AWS+或)的云系统,这样做会更好。即使没有CloudFront,S3也会让你开心。Rackspace的解决方案随Akamai提供

取出静态文件将使您的web服务器“哦,发生了什么事,这是什么沉默?哦,天堂!”因为您提到这是一个网站,大多数情况下,每个动态生成的html页面都有许多静态文件


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

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

后端Apache服务器之所以这样做,是因为
httpd.conf
中存在以下指令:

SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
当后端服务器通过反向代理连接并且可以从后端服务器c中删除时,此指令没有意义