- 浏览: 1595478 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
jsrgzhangzhiyong:
关于null值的转换还是感觉不太友好,就像 mapstruct ...
我也造了个轮子:BeanMapping(属性拷贝) -
he037:
a417930422 写道引用使用EPHEMERAL会引出一个 ...
基于zookeeper的分布式lock实现 -
seancheer:
qianshangding 写道首先节点启动后,尝试读取本地的 ...
zookeeper学习记录三(session,watcher,persit机制) -
雪夜归人:
您好,我想咨询一下,开源的canal都能支持mysql的哪些版 ...
Canal BinlogChange(mysql5.6) -
zhoudengyun:
copy 一份做记录,后续学习,请知悉
阿里巴巴开源项目: 基于mysql数据库binlog的增量订阅&消费
背景
最近一直在做公司的应用软件服务架构的升级工作,里面涉及使用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的使用需求:
- 启用长连接。不能每次proxy转发一下,就新建一个socket,性能吃不消
- 连接池只有一个。尽量公用连接池,目前各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. 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. |
最后的配置:
min=5 smax=16 ttl=600 timeout=20
说明:
- 不指定max,保持和ThreadPerChild一致
- timeout,不用设置太大,保持和原先mod_jk一致,使用20秒。如果是下载服务,可适当调大该值
- ttl空闲连接,可适当设置大一些,tomcat默认的是20秒。切忌: 需要保证 ttl <= 后端应用空闲连接的管理时间,不然会出现半开链接。
2. 共享连接池配置
思路一: 坏人匹配策略
- 先整理出应用中不需要应用进行处理的url列表,比如原先的Url Rewrite,apache下的静态资源文件
- 对不需要处理的url,逐一配置过滤
ProxyPass /image/ ! ProxyPass /ok.html !
- 最后对应用根目录进行proxy配置(只有这么一个公用连接池)
ProxyPass / http://localhost:7001/
mod_proxy进行proxy匹配时,是按照配置文件的顺序进行查找匹配,具体可见官方文档描述,直接贴英文。
The configured ProxyPass and ProxyPassMatch rules are checked in the order of configuration. The first rule that matches wins. So usually you should sort conflicting ProxyPass rules starting with the longest URLs first. Otherwise later rules for longer URLS will be hidden by any earlier rule which uses a leading substring of the URL. Note that there is some relation with worker sharing. For the same reasons exclusions must come before the general ProxyPass directives
说明:
- 因为考虑直接放开所有/目录的请求,风险比较大。特别是在应用有变化时,过滤url列表比如有遗漏,可能就会引发系统安全问题,比如一些jmx,web-console的后台url就会被打开。
- 原先应用使用mod_jk,采取的都是配置需要转发的请求列表,所以在列出所有过滤列表时,可能会存在遗漏的,所以最终放弃了该方案
思路二:好人匹配策略
- 先整理所有的好人列表,这个挺好整理,把公司的几个module列一下即可,同时加上一些监控的url
- 通过ProxyPassMatch原语,整理出正则匹配url,只有这里一个公用连接池
ProxyPassMatch ^/(home|admin|product|monitor)/(.*)$ http://localhost:7001
- 最后可以加上拦截/目录请求,也可以不做(因为mod_proxy如果找不到匹配的ProxyPass,自然就不会处理该请求了)
ProxyPass / !
小插曲:在实施ProxyPassMatch配置时,真正的被apache官方文档误导了一把,万恶的主啊。花费了我近一天的时间排查问题。希望大家可以引起重视
官方文档针对ProxyPassMatch有这么一个例子:
ProxyPassMatch ^(home|admin|product|monitor)/(.*)$ http://localhost:7001/$1/$2
./ab -k -c 15 -n 50000 http://10.20.156.49:2100/member/signin.htm -k 指定保持keepalive -c 并发数 -n 请求数
再通过netstat -nat命令看了下tcp状态,发现近2000左右的TIME_WAIT,在停止ab施压后,发现TIME_WAIT连接很快会得到释放
tcpdump -s 0 -i lo port 2200 -nn 说明:port 2200为后端应用服务端口,-i 必须指定为loopback网络接口,因为apache和后端应用之间走的是loopback网络接口
ProxyPassMatch creates a worker like ProxyPass does,but it uses regex URI for a worker name. For example, your httpd.conf: ProxyPassMatch ^/test/(\d+)/foo.jpg http://backend.example.com/$1/foo.jpg 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池
[Tue Nov 09 22:12:06 2010] [debug] proxy_util.c(1818): proxy: grabbed scoreboard slot 0 in child 7897 for worker http://localhost:2200/$1/$2 [Tue Nov 09 22:12:06 2010] [debug] proxy_util.c(1837): proxy: worker http://localhost:2200/$1/$2 already initialized
ProxyPassMatch ^/(home|admin|product|monitor)/(.*)$ http://localhost:7001
评论
几个问题:
1 mod_proxy本身就支持worker池:这个连接池是存储“apache服务器”到“目标服务器”(localhost:7001)的连接吗?如果用了正着表达试,就要重复建立多个worker池用于连接目标服务器吗?
2 代理的使用经常存在安全的问题,除了通过设置合理的url来保护代理能访问的服务外,还有其他常用机制吗?比如在代理模块之前增加认证模块。
多谢,死链接问题已经修改,可以查看:http://agapple.iteye.com/blog/806518
问题:
1. 连接池是指apache进行proxy的代理时,与后端的应用建立的tcp连接。从提交的bug描述来看(也可能不算bug),如果使用了http://localhost:7001/$1/$2,apache建立的worker名字即为http://localhost:7001/$1/$2(你可以看下apache debug日志),而每次渲染$1,$2后拿到的url是一个完成的url,去找匹配的worker池就找不到了,名字不同了,无法使用原先的worker池,因此每次都是新建tcp socket链接,从我抓包看到的现象就是这样。
2. 至于安全管理,我个人认为mod_proxy只是做为一个代理服务管理,不应该关注太多,管理后资源分发即可。至于这个资源是否允许被用户访问,应该是后端应用自己去保证,比如应用的权限控制体系。这样以后应用重构,拆分才能更加easy。
apache mod_proxy倒是有些安全管理的功能,比如端口限制,访问次数控制,这个也是更多在系统层面做的控制
几个问题:
1 mod_proxy本身就支持worker池:这个连接池是存储“apache服务器”到“目标服务器”(localhost:7001)的连接吗?如果用了正着表达试,就要重复建立多个worker池用于连接目标服务器吗?
2 代理的使用经常存在安全的问题,除了通过设置合理的url来保护代理能访问的服务外,还有其他常用机制吗?比如在代理模块之前增加认证模块。
发表评论
-
yugong QuickStart
2016-03-05 01:52 0几点说明 a. 数据迁移的方案可参见设计文档,oracl ... -
阿里巴巴开源项目: 阿里巴巴去Oracle数据迁移同步工具
2016-03-05 18:29 6509背景 08年左右,阿里巴巴开始尝试MySQL的相关 ... -
愚公performance
2016-03-02 17:29 0性能测试 全量测试 场景1 (单主键, ... -
yugong AdminGuide
2016-03-02 16:40 0环境要求 操作系统 数据库 迁移方案 部署 ... -
Tddl_hint
2014-01-27 13:52 0背景 工作原理 Hint格式 direct模 ... -
tddl5分库规则
2014-01-26 14:41 0背景 工作原理 构建语法树 元数据 基于 ... -
tddl5优化器
2014-01-22 15:12 0背景 工作原理 构建语法树 元数据 抽象语 ... -
Canal BinlogChange(mariadb5/10)
2014-01-20 17:25 4587背景 先前开源了一个 ... -
asynload quickstart
2013-10-08 22:49 0几点说明: 1. asyncload是做为一个j ... -
网友文档贡献
2013-09-18 15:50 01. Otter源代码解析系列 链接:http://e ... -
Manager配置介绍
2013-09-16 13:00 0通道配置说明 多种同步方式配置 a. 单向同步 ... -
canal&otter FAQ
2013-09-05 17:30 0常见问题 1. canal和 ... -
阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房)
2013-08-22 16:48 40433项目背景 阿里巴巴B2B公司,因为业务的特性 ... -
Otter AdminGuide
2013-08-19 11:06 0几点说明 otter系统自带了manager,所以简化了一 ... -
Otter高可用性
2013-08-17 23:41 0基本需求 网络不可靠,异地机房尤为明显. man ... -
Otter数据一致性
2013-08-17 23:39 0技术选型分析 需要处理一致性的业务场景: 多地修改 ( ... -
Otter扩展性
2013-08-17 22:20 0扩展性定义 按照实现不同,可分为两类: 数据处理自定 ... -
Otter双向回环控制
2013-08-17 21:37 0基本需求 支持mysql/oracle的异构数据库的双 ... -
Otter调度模型
2013-08-17 20:13 0背景 在介绍调度模型之前,首先了解一下otter系统要解 ... -
Otter Manager介绍
2013-08-16 11:16 0背景 otter4.0发布至 ...
相关推荐
该软件包是apache的httpd中mod_proxy.so、mod_proxy_http.so代理模块,分别对应包含linux、windows的版本。
列表包含 mod_proxy.so mod_proxy_http.so mod_proxy_ajp.so mod_proxy_ftp.so mod_proxy_connect.so mod_proxy_balancer.so
window下完整的apache+mod_jk或mod_proxy+tomcat配置方案,用于负载均衡及动静态页面分离。里面包含有相对应版本的apache、tomcat、mod_jk,已经多个参考文档
本文档详细介绍了使用mod_proxy模块与Apache和Tomcat结合来实现负载均衡与集群配置的过程。配置前需要准备相应的环境,包括安装JDK、Apache HTTP Server和Tomcat服务器。本文档使用了Tomcat 7.0.2作为应用服务器,并...
在这个配置中,Nginx监听8080端口,当接收到CONNECT请求时,会尝试连接到配置的`$proxy_host:$proxy_port`。 使用该模块需要注意一些安全问题,因为透明代理可能被滥用为攻击跳板或绕过防火墙策略。为了安全起见,...
基于mod_proxy+Apache_2.2.16+Tomcat_7的负载均衡与集群配置
apache服务器和tomcat服务器之间实现URL代理的module.so工具类文件
Apache 2.4 中文文档 - Apache 模块 mod_proxy_balancer | Docs4dev.mht
在本案例中,"OPC COM ProxyStub MergeModule (x86)_foundation_proxy_usvfs_proxy" 提供的是一个针对x86架构的OPC组件,专门用于COM(Component Object Model)代理和存根的合并模块。以下是关于这个主题的详细解释...
`mod_proxy`模块提供了基础的代理功能,`mod_proxy_balancer`模块负责负载均衡策略,而`mod_proxy_http`则使得Apache能够支持HTTP协议的代理。 接下来,配置负载均衡器: 1. 关闭直接的代理请求,以防外部直接访问...
LoadModule proxy_connect_module modules/mod_proxy_connect.so LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_ajp_module ...
nginx_tcp_proxy_module-master.zip
"test_proxy_server.zip"这个压缩包就包含了解决跨域问题的代理服务器配置和实现。 首先,让我们深入理解跨域请求和Vue.js框架的相关性。Vue.js是一个流行的前端JavaScript框架,用于构建用户界面。在开发阶段,Vue...
chrome_proxy.exe
chrome_proxychrome_proxychrome_proxychrome_proxychrome_proxychrome_proxy
这将把mod_rpaf模块编译并安装到Apache的模块目录中。 **配置mod_rpaf** 在Apache的配置文件(通常是`httpd.conf`或`virtualhost`配置段)中,添加以下行来启用mod_rpaf: ```apacheconf LoadModule rpaf_module ...
ngx_http_proxy_connect_module, 用于CONNECT请求处理的前向代理模块 名称 此模块为"连接"http方法提供支持,此方法主要用于... 目录 姓名 例子 安装 指令 proxy_connect proxy_connect_allow proxy_connect_connect_t
本文档详细介绍了在 WebLogic Server 中设置 Proxy Server 的步骤,并提供了一些实际的配置案例和注意事项。 ### 创建Domain与服务器实例 #### 创建Managed Server与Proxy Server 首先,启动 Admin Server,并...
本文介绍了使用Apache反向代理配置集群,基于mod_proxy+Apache 2.2.16+Tomcat 7实现负载均衡与集群配置。 一、 背景简介 大多数企业应用都希望能做到7*24小时不间断运行。要保持如此高的可用性并非易事,比较常见...