聊聊mod_proxy配置过程(被apache文档误导了一把)

背景

最近一直在做公司的应用软件服务架构的升级工作,里面涉及使用mod_proxy替换先前的mod_ajp,因为我们要用jetty7。

 

同时万恶的jetty 7对ajp协议支持不是很好, 具体可见我的另一篇博文: 纠结的mod_jk与jetty的组合。 在线下测试少量的请求没啥问题,一到线上跑个几分钟就开始抛异常了,查了jetty的mail list,也有人报类似的bug。

 

所以后续的工作重心还是回到mod_proxy_http上来,今天在调试mod_proxy配置时,出了一些小插曲,记录分享一下给大家,免得大家再走歧路。

 

配置需求

大致url类型介绍:

     目前公司的url基本是按模块进行划分,比如 http://域名/module/xxxx.html, 域名后多了一个module路径,用于区分不通的业务,比如home , admin , product等。

 

对mod_proxy的使用需求: 

  1. 启用长连接。不能每次proxy转发一下,就新建一个socket,性能吃不消
  2. 连接池只有一个。尽量公用连接池,目前各module之间的压力分布不均,需要合并所有module的proxy连接池,避免出现多个ProxyPass的worker连接池

 

Apache mod_proxy模块介绍

主要的资料还是来自于官方文档:http://httpd.apache.org/docs/2.2/mod/mod_proxy.html

 

涉及的主要配置原语:

  • ProxyPass 
  • ProxyPassMatch 区别于ProxyPass就只是匹配方式是通过regex,其他类似
  • ProxyRequests 正向代理开关
  • ProxyPassReverse 反向代理,修改返回的http header信息
  • ProxyPreserveHost 反向代理,是否修改请求的header信息

其他具体配置含义不多做介绍,大家可以看官方文档。

 

实施过程 

1.  考虑mod_proxy需求1,保持长链接

 

这个mod_proxy本身就支持worker池的概念,不过需要配置一下几个参数: 

 

名称 默认值 描述 官网文档描述
min 0 最小保持的连接数 Minimum number of connections that will always be open to the backend server.
max 1...n
所谓的硬性最大值    

最大可保持的连接数,如果是prefork模式则值为1,如果是走worker模式,值等价于ThreadsPerChild配置                                                   

 

 


Hard Maximum number of connections that will be allowed to the backend server.
The default for a Hard Maximum for the number of connections is the number of threads per process in the active MPM.
In the Prefork MPM, this is always 1, while with the Worker MPM it is controlled by the ThreadsPerChild.

Apache will never create more than the Hard Maximum connections to the backend server.

smax max 所谓的软性最大值,如果连接数超过smax后,大于smax的链接就会进行ttl空闲连接管理 Upto the Soft Maximum number of connections will be created on demand.
Any connections above smax are subject to a time to live or ttl.
connectiontimeout timeout 创建链接的超时时间,单位毫秒 Connect timeout in seconds.
The number of seconds Apache waits for the creation of a connection to the backend to complete.
By adding a postfix of ms the timeout can be also set in milliseconds.
timeout ProxyTimeout 等待后端的应用返回数据的超时时间,不可太长,也不可太短 Connection timeout in seconds. The number of seconds Apache waits for data sent by / to the backend.
ttl - 空闲连接的管理时间 Time To Live for the inactive connections above the smax connections in seconds.
Apache will close all connections that has not been used inside that time period.         

 

最后的配置:

1.min=5 smax=16 ttl=600 timeout=20  

说明:

  • 不指定max,保持和ThreadPerChild一致
  • timeout,不用设置太大,保持和原先mod_jk一致,使用20秒。如果是下载服务,可适当调大该值
  • ttl空闲连接,可适当设置大一些,tomcat默认的是20秒。切忌: 需要保证 ttl <= 后端应用空闲连接的管理时间,不然会出现半开链接。

 

2. 共享连接池配置

思路一: 坏人匹配策略

  • 先整理出应用中不需要应用进行处理的url列表,比如原先的Url Rewrite,apache下的静态资源文件
  • 对不需要处理的url,逐一配置过滤 
    1.ProxyPass /image/ ! ProxyPass /ok.html !  
  • 后对应用根目录进行proxy配置(只有这么一个公用连接池)
    1.ProxyPass / http://localhost:7001/  

 mod_proxy进行proxy匹配时,是按照配置文件的顺序进行查找匹配,具体可见官方文档描述,直接贴英文。

1.The configured ProxyPass and ProxyPassMatch rules are checked in the order of configuration. The first rule that matches wins.
2.So usually you should sort conflicting ProxyPass rules starting with the longest URLs first.
3.Otherwise later rules for longer URLS will be hidden by any earlier rule which uses a leading substring of the URL.
4.Note that there is some relation with worker sharing.
5.
6.For the same reasons exclusions must come before the general ProxyPass directives

说明:

  • 因为考虑直接放开所有/目录的请求,风险比较大。特别是在应用有变化时,过滤url列表比如有遗漏,可能就会引发系统安全问题,比如一些jmx,web-console的后台url就会被打开。
  • 原先应用使用mod_jk,采取的都是配置需要转发的请求列表,所以在列出所有过滤列表时,可能会存在遗漏的,所以最终放弃了该方案

思路二:好人匹配策略

  • 先整理所有的好人列表,这个挺好整理,把公司的几个module列一下即可,同时加上一些监控的url
  • 通过ProxyPassMatch原语,整理出正则匹配url,只有这里一个公用连接池
1.ProxyPassMatch ^/(home|admin|product|monitor)/(.*)$  http://localhost:7001  

  • 最后可以加上拦截/目录请求,也可以不做(因为mod_proxy如果找不到匹配的ProxyPass,自然就不会处理该请求了)
1.ProxyPass /  !   

华丽的分割线


小插曲:在实施ProxyPassMatch配置时,真正的被apache官方文档误导了一把,万恶的主啊。花费了我近一天的时间排查问题。希望大家可以引起重视

 

官方文档针对ProxyPassMatch有这么一个例子:


 

大体意思是也很好理解,说ProxyPassMatch可以通过$1,$2提取正则匹配的内容,并且添加在worker url之后,组成最终的目标url。

 

所以参照这官方的例子,我最初的配置就为: 

1.ProxyPassMatch ^(home|admin|product|monitor)/(.*)$  http://localhost:7001/$1/$2   

通过apache ab进行系统压力测试时,发现一个很严重的问题

1../ab -k -c 15 -n 50000 http://10.20.156.49:2100/member/signin.htm
2.
3.-k 指定保持keepalive
4.-c 并发数
5.-n 请求数

再通过netstat -nat命令看了下tcp状态,发现近2000左右的TIME_WAIT,在停止ab施压后,发现TIME_WAIT连接很快会得到释放

最后通过tcpdump在服务器上,发现了问题,每个请求都是走了新的socket链接,tcp链接快速打开,快速关闭,因此出现了大量了TIME_WAIT状态。针对tcpdump的使用介绍,可以查看我的另一篇博文:tcp链接的几种状态&tcpdump抓包

1.tcpdump -s 0 -i lo port 2200 -nn
2.
3.说明:port 2200为后端应用服务端口,-i 必须指定为loopback网络接口,因为apache和后端应用之间走的是loopback网络接口

网上google了一把无果,也在stackoverflow论坛上逛了一圈,没发现有类似的question提问。最终很无奈,在查看apache maillist的时候,发现了这么一个bug。

Bug 43513 - Persistent backend connections for ProxyPassMatch

 

1.ProxyPassMatch creates a worker like ProxyPass does,but it uses regex URI for a worker name.
2.For example, your httpd.conf:
3.
4.ProxyPassMatch ^/test/(\d+)/foo.jpg <a href="http://backend.example.com/%241/foo.jpg">http://backend.example.com/$1/foo.jpg</a>
5.
6.then worker name is "http://backend.example.com/$1/foo.jpg", so URL never matches and the worker is no longer used.

打开了apache的LogLevel为debug,看到了的确建立了以$1/$2为url的worker池

的确,我在测试时

1.[Tue Nov 09 22:12:06 2010] [debug] proxy_util.c(1818): proxy: grabbed scoreboard slot 0 in child 7897 for worker <a href="http://localhost:2200/%241/%242">http://localhost:2200/$1/$2</a>
2.[Tue Nov 09 22:12:06 2010] [debug] proxy_util.c(1837): proxy: worker http://localhost:2200/$1/$2 already initialized

按照bug的描述,因为通过最终http://localhost:7001/$1/$2,经过$1,$2渲染后最终的url是一个真实的目标url,它与对应的worker url不匹配,所以无法使用该worker的pool池配置。



最后调整配置为:

1.ProxyPassMatch ^/(home|admin|product|monitor)/(.*)$  http://localhost:7001  

分析: 

  注意最后的worker url没有加$1/$2,而是直接使用了/目录,mod_proxy在匹配到ProxyPassMatch后,会将整个URI和worker url进行拼接,最终的url为: http://localhost:7001/admin/xxx.html,再根据mod_proxy针对worker sharing,子目录url可以重用父目录url的worker连接池。所以这里/admin/xxx.html可以重用/的连接池,这样就实现了公用。

 


 

在最后的测试中,抓了下包,基本没有出现TIME_WAIT的异常情况,问题得到圆满解决,希望本文对mod_proxy的使用对你能有所帮助。

时间: 2024-11-04 05:15:29

聊聊mod_proxy配置过程(被apache文档误导了一把)的相关文章

ERP项目实施过程中要如何做好文档工作

由于ERP项目涉及到相关双方或多方的人员.资金等资源,时间跨度相对比较长.实施难度比较大,涉及方方面面的信息流,并且所有与项目相关的需求.建议.解决方案与结论等都需要标准化.文档化,因此,做好项目文档工作成为ERP项目得以成功实施的一个重要支撑. 文档是在项目实施过程中进行信息沟通的一种规范方式,可作为项目实施过程的一个成果进行交流.查阅.引用和保存. 从文档的角度来看,ERP项目的实施过程就是一个文档制作与实施的过程.以http://www.aliyun.com/zixun/aggregati

10 个项目文档最佳实践

在软件开发和维护过程中,文档是必不可少的资料,它可以提高软件开发的效率,保证软件的质量,而且在软件的使用过程中有指导.帮助.解惑的作用.尤其在维护工作中,文档的重要性更是不言而喻.  本文整理了软件开发中10个最佳的文档编写实践,希望能对你的工作有所帮助.  1.  将编写文档作为开发工作中的一个重要环节(例如,占用总开发时间的10%).在软件开发中,不能没有文档,但如果编写文档占用了大部分的时间也不合适.可以根据需要制定代码文档.需求说明文档.设计文档.测试文档.用户手册等,在制定完成后,可以

写有价值的技术文档

背景 传统瀑布开发模式下非常重视文档,每个开发环节的衔接都通过文档实现.这种重视在CMMI达到了极致,软件开发的每一步从形式到内容都要求文档化,需要设计者花费大量的精力在文档的撰写和维护上.高度文档化需要投入巨大的成本,这种成本在相对固定,变化较少的问题域(如传统的制造.管理)可以从软件后期的维护收益上得到补偿,实践中也得到了较好的效果.但在变化较多的问题域(如互联网.创业企业),高度文档化会造成整个软件生产过程的反应迟滞,进而造成企业竞争力的下降.于是这些要求快速反应,快速迭代的行业逐步放弃了

Word文档添加个性印章的制作方法步骤

  经常使用Word文档来编辑一些公司的文件,为了防止泄密,可以在文档上添加个性印章.那么在Word文档上,如何添加个性印章?下面我们以制作"黄氏科技股份公司合同专用章"为例,说明图章图片的具体制作过程. 制作个性"印章" 通过软件的"选项"菜单选择图章的基本形状.如本例我们选择制作"椭圆章"(此外还支持圆章.方章.菱形章.三角章等外框效果). 图章制作 单击"外框"选项卡,设置图章的外框线.中间的五角星图

word文档个性印章怎么做

为自己公司的文件盖上公章或为自己的个性信函盖上一个个性的印章,只需键盘鼠标即可完成! 在传统意义上来讲,如果你希望在写好的公文上盖上公章,或者在一个电子文档上盖一个自己的个性印章,那么,拥有一枚公章或个性印章就是必需的事情了.而今天,有电脑的我们就可以省去刻印章的麻烦了.个性印章哪里找?不用上街找人刻!借助一个小免费软件"图章制作"就可以搞定了. 制作个性"印章" 下面我们以制作"黄氏科技股份公司合同专用章"为例,说明图章图片的具体制作过程. 通

Word 2003将文档中的内容复制粘贴为超链接

  动画演示: 文档中的内容复制粘贴为超链接-复制粘贴超链接"> ①在文档中选中你需要的作为超链接的文本,然后单击鼠标右键,选择"复制". ②将鼠标的光标置于你想放置超链接的位置. ③单击"编辑"→"粘贴为超链接".则复制的对象以超链接的方式粘贴到光标所在位置,被创建超链接的文本将变成有颜色的.加下划线的文字. 还有另外一种方法:按鼠标右键把选定的目标拖到需要链接到的位置,释放右键,在快捷菜单中选择"在此创建超级链接&q

Blog_mini完整部署文档

 为了使广大朋友能够使用上开源博客系统Blog_mini,作者撰写了非常详细的部署文档,涵盖在CentOS与Ubuntu上的详细部署方案,力求:只要看了部署文档,就一定可以把Blog_mini成功部署! 0.功能详解文档         功能详解:<开源分享:用Python开发的开源博客系统Blog_mini> 1.完整部署文档         在CentOS上部署Blog_mini:<在CentOS上部署开源博客系统Blog_mini>         在Ubuntu上部署Blo

c#编程实现word 文档如何导入SQL Server数据库表中

操作WORD配置说明 引入:Word的对象库文件"MSWORD.OLB"(word 2000为MSWORD9.OLB) 1.运行Dcomcnfg.exe 2.组件服务――计算机――我的电脑――DCOM配置――找到microsoft word 文档 3.点击属性 4.选择"安全性" 5.选定"使用自定义访问权限"和"使用自定义启动权限" 6.分别编辑权限,添加Everyone(ASPNET,VS Developers,Debug

吴锋:利用文档分享平台推广自己的网站

中介交易 SEO诊断 淘宝客 云主机 技术大厅 随着互联网的发展,上网的人群越来越多,面对五花八门的网络营销广告,混网络时间稍微长点的用户都能辨别.用户对广告辨识度不断提高,使得营销效果大打折扣,同时鞭策网络营销人员不断提升自己营销技巧能力,绞尽脑汁寻找新的推广模式,以保持营销效果最大化. 互联网分享理念的深入,文档分享平台如雨笋般崛起,通过文档分享平台推广自己的网站,不失为一个新的互联网推广模式. 下面就和大伙分享如何利用文档推广自己的网站,以及分享中国几大出名文档平台推广经验. 一:文档.文