Summary/Quesiton:
我让Apache运行Pre叉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'它似乎没有重复使用连接。
经过进一步的阅读,听起来我没有获得连接池的功能,因为我使用的是Pre叉MPM,而不是Worker MPM。因此,每次我向代理发出请求时,它都会使用自己的连接池(大小为1)来派生一个新进程,而不是使用维护自己池的单个工作人员。这解释对吗?
背景信息:
对于我运行的站点上的每一个页面,我都会通过https向一个外部服务器发出请求。
协商SSL握手的成本越来越高,因为我使用php,而且它似乎不支持连接池--如果我将300页请求发送到我的站点,它们必须对外部服务器执行300次SSL握手,因为每个脚本运行后连接就会关闭。
因此,我试图使用Apache下的反向代理作为连接池,在php进程中持久化连接,这样我就不必经常进行SSL握手了。
给我这个想法的消息来源:
发布于 2012-07-05 02:55:55
首先,您的测试方法无法演示连接池,因为每次调用时,一个curl客户端就会出现,然后它就会死掉。就像死去的人不会说太多话一样,一个死气沉沉的过程也无法维持一种联系。
您的客户端会困扰您的代理服务器。
Client ====== (A) =====> ProxyServer让我们调用这个连接A。您的代理服务器什么也不做,这只是一个炫耀。这位英俊而勤劳的服务生是如此谦逊,以至于躲在后面。
Client ====== (A) =====> ProxyServer ====== (B) =====> WebServer在这里,如果我没有错,安全连接是A,而不是B,对吗?
重复我的第一点,在您的测试中,您将为每个请求创建一个单独的客户端。每个客户都需要一个单独的连接。连接是至少在双方之间发生的事情。一边离开,连接就失去了。
好吧,让我们现在忘掉卷发,一起看看我们真正想做的事情。
我们希望在A上有SSL,我们希望流量的一方尽可能快。为了这个目的,我们已经分开了B方,这样就不会使A更慢,对吧?
连接池?在A.没有连接池这样的东西,每个客户端都会发出大量的噪音。唯一能帮助您减少这种噪音的是“保持-活动”,这意味着在短时间内使连接从(一个客户端)保持活动,这样这个客户端就可以请求该请求所需的其他文件。当我们完成时,我们就完成了。
对于B上的连接,连接将被池化;但是这不会给您带来任何性能,因为在一个服务器设置中,您没有产生噪声的这一部分。
我们如何帮助这个系统运行得更快?
如果这两台服务器在同一台机器上,我们应该摆脱显示服务器,继续努力工作的we服务器。它为系统增加了许多不必要的工作。
如果这些是单独的机器,那么您至少可以从这个可怜的家伙那里获得额外的( ssl)负载,从而对web服务器很好。然而,你可以做得更好。
如果您想继续使用Apache,请从mpm_worker切换到mpm_prefork。在300+并发请求的情况下,这将更好地工作。我真的不知道你的硬件的容量,但如果处理300个请求是困难的,我相信这个小小的改变将对你的系统有很大的帮助。
如果您想拥有一个更轻量级的系统,请考虑使用nginx作为Apache的替代方案。使用PHP是非常易于安装的,它将具有更好的性能。
除了前端之外,还可以考虑检查数据库服务器。在这里,连接池将产生真正的不同。确保您的PHP安装配置为重用到数据库的连接。
此外,如果您在同一个系统上承载静态文件,那么可以在另一个web服务器上将它们移出,或者通过将静态文件移动到一个具有CDN的云系统,比如AWS的S3+CloudFront或Rackspace的CloudFiles。即使没有CloudFront,S3也会让你开心。Rackspace的解决方案是随Akamai而来的!
取出静态文件会让你的网络服务器“哦,发生了什么,这是什么沉默?哦,天啊!”由于您提到,这是一个网站和网页有许多静态文件,为每个动态生成的html页面大多数时间。
我希望你能把这可怜的家伙从杀手的工作中救出来。
发布于 2012-07-03 17:07:50
每个进程每个后端服务器仍然可以池一个连接。
Pre叉不一定为每个前端请求创建一个新进程,服务器进程本身是“池”的,其行为取决于例如MinSpareServers/MaxSpareServers和朋友。
为了最大限度地提高前置进程对您的后端连接的频率,请避免使用很高或很低的maxspareservers或非常高的最小存储区,因为这将导致“新”进程接受新的连接。
您可以在LogFormat指令中记录%P,以帮助了解进程被重用的频率。
发布于 2012-07-06 09:21:31
在我的例子中,问题是反向代理和后端服务器之间的连接池没有发生,因为后端服务器Apache在每个HTTPS请求的末尾关闭了SSL连接。
后端Apache之所以这样做,是因为httpd.conf中存在以下指令
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown当后端服务器通过反向代理连接时,此指令没有意义,并且可以从后端服务器配置中删除该指令。
https://stackoverflow.com/questions/9221640
复制相似问题