我可以在Prefork MPM下使用Apache mod_代理作为连接池吗?
摘要/问题: 我让Apache运行Prefork MPM,运行php。我正在尝试使用Apache mod_proxy创建一个反向代理,我可以重新路由我的请求,这样我就可以使用Apache进行连接池。示例impl: 在httpd.conf中:我可以在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
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握手 给我这个想法的消息来源:
您可以在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中删除时,此指令没有意义