1、httpd-vhosts.conf配置关键参数的解释
#虚拟机配置,负载均衡配置 注意空格
ServerAdmin sun@locahost
ServerName localhost
ServerAlias localhost
ProxyPass / balancer://cluster/ stickysession=JSESSIONID|jsessionid nofailover=On
ProxyPassReverse / balancer://cluster/
#The ProxyRequests directive should usually be set off when using ProxyPass.
ProxyRequests Off
BalancerMember ajp://localhost:8009 loadfactor=1 route=jvm1 smax=5 max=20 ttl=120 retry=300 timeout=15
BalancerMember ajp://localhost:8010 loadfactor=1 route=jvm2 smax=5 max=20 ttl=120 retry=300 timeout=15
ProxySet lbmethod=byrequests
#lbmethod=byrequests 按照请求次数均衡(默认)
#lbmethod=bytraffic 按照流量均衡
#lbmethod=bybusyness 按照繁忙程度均衡(总是分配给活跃请求数最少的服务器)
ServerAdmin配置的是邮箱地址,如果apache有什么错误,会通过此邮箱发送给你
ServerName 监控的服务器地址,我们配置的是apache所在的服务器ip,(正确的解释是域名,服务器的域名
,如果你有两个域名,一个http://www.taobao.com, 一个是http://www.baidu.com 那么这里就是但其他客户端访问这两个域名的时候,apache监听到会做什么处理)
ServerAlias 二级域名,也有的说,是当前主机的别名
以下的解释方法比较靠谱:
很多时候我们需要将一个网站进行多个域名绑定的时候,往往我们的做法是:
DocumentRoot "d:/wamp/www"
ServerName www.taobao.net
DocumentRoot "d:/wamp/www"
ServerName www.jd.net
上面是将 www.taobao.net 和 www.jd.net 同时绑定到一个网站上,这样是没有任何问题的,而在本文上引入了 ServerAlias 可以实现同样的功能,并且简单、有效:
DocumentRoot "d:/wamp/www"
ServerName www.taobao.net
ServerAlias www.taobao.net www.jd.net
ProxyPass 代理地址
以下解释的比较透彻,如
ProxyPass / http://192.168.100.22/
ProxyPassReverse / http://192.168.100.22/
ProxyPassReverse / balancer://cluster/ 这里的cluster可以自己修改名称,但是要和下面的一致
stickysession=JSESSIONID|jsessionid
ProxyPass 很好理解,就是把所有来自客户端对http://www.test.com的请求转发给http://192.168.100.22上进行处 理, ProxyPassReverse 的配置总是和ProxyPass 一致,
它的作用在于反向代理,如果响应中有302重定向,ProxyPassReverse就派上用场。
举例说明,假设用户访问http://www.test.com/exam.php,通过转发交给http://192.168.100.22 /exam.php处理,
假定exam.php处理的结果是实现redirect到login.php(使用相对路径,即省略了域名信息),
如果没有配置反向代理,
客户端收到的请求响应是重定向操作,
并且重定向目的url为http://192.168.100.22/login.php ,而这个地址只是代理服务器能访问到的,
可想而知,客户端肯定是打不开的,反之如果配置了反向代理,
则会在转交HTTP重定向应答到客户端之前调整它为 http://www.test.com/login.php,
即是在原请求之后追加上了redirect的路径。
当客户端再次请求http: //www.test.com/login.php,
代理服务器再次工作把其转发到http://192.168.100.22/login.php。
客户端到服务器称之为正向代理,那服务器到客户端就叫反向代理
1.1 开启Apache代理模块并引入vhost配置文件
http.conf开启代理模块
LoadModule proxy_module modules/mod_proxy.so
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
引入vhost文件
Include conf/extra/httpd-vhosts.conf
如果你想监听别的端口, 修改Listen参数
Listen 80
Listen 8087
Listen 8088
将想监听的端口全都写上,相应的, 在vhost文件里写上
NameVirtualHost *:80
NameVirtualHost *:8087
NameVirtualHost *:8088
以下解说来自此博客,写的很详细
https://limingnihao.iteye.com/blog/1934548
首先我们先介绍一下为什么要让http server与Tomcat之间进行连接。事实上Tomcat本身已经提供了HTTP服务,该服务默认的端口是8080,装好tomcat后通过8080端口可以直接使用Tomcat所运行的应用程序,你也可以将该端口改为80。既然Tomcat本身已经可以提供这样的服务,我们为什么还要引入Apache或者其他的一些专门的HTTP服务器呢?原因有下面几个:
1. 提升对静态文件的处理性能。
2. 利用Web服务器来做负载均衡以及容错。
3. 无缝的升级应用程序。
这三点对一个web网站来说是非常之重要的,我们希望我们的网站不仅是速度快,而且要稳定,不能因为某个Tomcat宕机或者是升级程序导致用户访问不了,而能完成这几个功能的、最好的HTTP服务器也就只有apache的http server了,它跟tomcat的结合是最紧密和可靠的。
默认情况下,Tomcat在server.xml中配置了两种连接器:
第一个连接器监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。
第二个连接器监听8009端口,负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。
两种端口可以同时开,也可以开一个。例如我们使用apache通过ajp进行负载均衡配置时,可以关掉tomcat的http8080端口以防止可以被单独访问。
Web客户访问Tomcat服务器上JSP组件的两种方式如图:
使用http方式,配置文件
Java代码
使用ajp方式,配置文件
Java代码
mod_proxy_balancer是apache httpd自带的负载平衡支持。其优点可以根据实际的运行时机器的环境来决定负载均衡的策略。实现Session在node上进行共享传递。
Java代码
Java代码
实现负载均衡的原理为:假设Apache接收到http://127.0.0.1 /test请求,由于该请求满足ProxyPass条件(其URL前缀为“/"),该请求会 被分发到后台某一个BalancerMember。譬如该请求可能会转发到http://127.0.0.1:8080/进行处理。当第二个满足条件的URL请求过来时,该请求可能会被分发到另外一台BalancerMember,譬如,可能会转发到 http://127.0.0.1:7080/如此循环反复,便实现了负载均衡的机制。
loadfactor表示:后台服务器负载到由Apache发送请求的权值,该值默认为1,可以将该值设置为1到100之间的任何值。以上面的配置为例,进行4此请求时,则有3次连续的这样请求被负载到BalancerMember为http://127.0.0.1:8080/的服务器;有1次被负载到BalancerMember为http://127.0.0.1:7080/的服务器。
lbmethod表示:负载载均衡策略。
lbmethod=byrequests 按照请求次数均衡(默认)
lbmethod=bytraffic 按照流量均衡
lbmethod=bybusyness 按照繁忙程度均衡(总是分配给活跃请求数最少的服务器)
ProxyPass表示:所有的test请求都会重定向到balancer://mycluster/处理。balancer是内置负载。
ProxyPassReverse表示:反向代理,也就是将所有的请求反向代理到负载均衡后的应用url路径中。
stickysession表示:进行Session复制使用。
tomcat提供了ajp协议和httpd通信。当不想tomcat的8080端口开放时,可以使用此方式,配置文件:
Java代码
热备份的实现很简单,只需添加 status=+H 属性,就可以把某台服务器指定为备份服务器:
此时请求总是流向 8080这个url ,一旦8080挂掉, Apache会检测到错误并把请求分流给7080。Apache会每隔几分钟检测一下8080的状况,如果8080恢复,就继续使用8080。
Java代码
配置文件
Java代码
可添加以下配置,可以查看监控页面。通过访问:http://127.0.0.1/balancer-manager。
配置文件
Java代码
Tomcat提供了专门的JK插件来负责Tomcat和HTTP服务器的通信。应该把JK插件安置在对方的HTTP服务器上。当HTTP服务器接收到客户请求时,它会通过JK插件来过滤URL,JK插件根据预先配置好的URL映射信息,决定是否要把客户请求转发给Tomcat服务器处理。例如预先配置好所有"/*.jsp"形式的URL都由Tomcat服务器来处理
Tomcat提供了不同的JK插件的实现模块。常用的JK插件有:
与Apache HTTPD服务器集成:mod_jk.so
与Windows IIS服务器集成:isapi_redirect.dll
Workers实际上属于Tomcat的链接器(Connector),代表了一个Tomcat实例,这个实例代表了由某种web服务器来执行 servelet程序。举例来说,我们可以使用某个服务器,例如apache 来把servelet请求转递Tomcat进程(worker)来进行后台处理。
这样我们就可以通过配置多个 Worker,让不同的请求能够被不同的Worker处理,这些Worker可以提供不同的开发环境,使得所有开发者可以共享一个服务器而每个人都拥有自己的Worker。
想要提供负载平衡,只要在同一台机器上运行多个Tomcat Worker并且能够在这些Worker之间分布Web请求。
Tomcat Workers都定义在一个叫做workers.properties属性文件之中,并且workers的说明告诉应该如何使用它们。
2.3.1.1 全局配置项
指令 | 默认 | 说明 |
worker.list | ajp13 | 由逗号分离开的worker名称列表. |
worker.maintain | 60 | 辅助连接池保持间隔,以秒为单位。 |
2.3.1.2 链接指令
可配置一个通用的,然后每个work进行继承。
指令 | 默认 | 说明 |
type | ajp13 | 指定Tomcat服务器 与Apache之间的通信协议 |
host | localhost | Tomcat主机名或 IP 地址。 |
port | 8009 | Tomcat侦听端口号。AJP13的默认端口是8009. |
socket_connect_timeout | socket_timeout*1000 | 套接字超时时间(毫秒为单位)。 |
socket_keepalive | false | 在未激活的连接中发送KEEP_ALIVE信息(发送间隔时间依赖于操作系统的设置,一般为120秒) |
ping_mode | - | 探测tomcat的状态策略。 C(content):链接模式,最后一次链接判断是否超时。connect_timeout定义时间。若未定义使用ping_timeout。 P(prepost):请求模式,通过每次请求判断是否超时。prepost_timeout定义时间。若未定义使用ping_timeout。 I(interval):间隔模式,定期检测链接是否超时。connection_ping_interval间隔时间。ping_timeout超时时间。 A:以上所有的探测策略都将开启。 |
connection_pool_size | JK会维护多个长连接做为一个池。它被用来设置每个WebServer(Apache)子进程的最大连接数。 | |
connection_pool_minsize | (pool+1)/2 | 连接池中维护最小的连接数。 |
connection_pool_timeout | 0 | 在连连池中维护的非活动连接连续多少秒后被释放。如果为0,则不释放。 |
connection_acquire_timeout | retries*retry_interval | 获取接连的超时。 |
lbfactor | 1 | 负载平衡器权值 |
2.3.1.3 负载均衡设置
指令 | 默认 | 说明 |
balance_workers | 逗号分隔的worker列表 | |
sticky_session | true | 负载喷发采用Session粘贴机制,按SessionID喷发请求。为了保障同一SessionID的请求被分发到同一台服务器上。 |
sticky_session_force | false | 如果为True, SessionID并不合法时则返回500错误,否则,丢掉Session并转发到另外的机器上。 |
2.3.1.4 实例
Java代码
Java代码
需要在中添加httpd的配置文件中加载jk的配置文件。
Java代码
Java代码
在linux自行编译jk时,需要以下步骤:
1.解压tomcat-connectors-1.2.37-src.tar.gz
2.指定httpd的apxs文件。他会自动将mod_jk.do生成到httpd的modules下。
Java代码
前端balancer可实现sticky模式的session同步功能。利用负载均衡器的sticky模式的方式把所有同一session的请求都发送到相同的Tomcat节点。这样不同用户的请求就被平均分配到集群中各个tomcat节点上,实现负载均衡的能力。这样做的缺点是没有灾难恢复的能力。一旦一个节点发生故障,这个节点上所有的session信息全部丢失;同一用户同一session只和一个webServer交互,一旦这个webserver发生故障,本次session将丢失,用户不能继续使用。
利用Tomcat session复制的机制使得所有session在所有Tomcat节点中保持一致。当一个节点修改一个session数据的时候,该节点会把这个 session的所有内容序列化,然后广播给所有其它节点。这样当下一个用户请求被负载均衡器分配到另外一个节点的时候,那个节点上有完备的 session信息可以用来服务该请求。这种做法的问题是对session哪怕有一点点修改,也要把整个sessions数据全部序列化 (serialize),还要广播给集群中所有节点,不管该节点到底需不需要这个session。这样很容易会造成大量的网络通信,导致网络阻塞。一般采 用这种方式,当Tomcat节点超过4个时候,整个集群的吞吐量就不能再上升了;
此方式是通过tomcat本身提供的功能,只需要修改server.xml文件
(1)修改Engine节点信息:
(2)去掉
(3)web.xml中增加
1.Failed to lookup provider 'shm' for 'slotmem': is mod_slotmem_shm loaded??
加载mod_slotmem_shm.so就可以了。
2.BalancerMember Can't find 'byrequests' lb method
三种模式,需要加载三个so:
mod_lbmethod_bybusyness.so
mod_lbmethod_byrequests.so
mod_lbmethod_bytraffic.so
本文来自:http://www.blogjava.net/bukebushuo/archive/2010/07/02/325037.html
描述:将远程服务器映射到本地服务器的URL空间
语法:ProxyPass [路径] !|url [键=值 键=值 ...]] [nocanon]
上下文: server config, virtual host, directory
状态:扩展
模 块:mod_proxy
该指令可以将远程服务器映射到本地服务器的URL空间;本地的服务器并不是扮演传统意义上的代理服务器的角色,而是表现为远程服务器的一个镜像。此 本地服务器常被成为反向代理(reversed proxy)或者是网关(gateway)。路 径是指本地虚拟路径的名字;url指远程服务器的一个部分URL,不能包含查询字符串。
注意:在使用ProxyPass
指令的时候,ProxyRequests
指令通常都应该是关闭的。
假设本地服务器的地址是 http://example.com/
, 那么
ProxyPass /mirror/foo/ http://backend.example.com/
将会把对http://example.com/mirror/foo/bar
的 本地请求内部转换成到http://backend.example.com/bar
的 代理请求。
其中,!
指令当你不想对某个子目录进行反向代理的时候就有用 了,例如:
ProxyPass /mirror/foo/i !
ProxyPass /mirror/foo http://backend.example.com
将会把所有的/mirror/foo
请求重定向到backend.example.com
除了对/mirror/foo/i
的请求。
注意:
顺序很重要:排除的指令必须在一般的ProxyPass
指令 之前。
和Apache 2.1一样,具备了使用到后端服务器的线程池的能力。使用“键=值
” 的参数便可调节线程池的分配。硬性最大值(Hard Maximum)
的 默认值为当前MPM中每个进程的线程数量。在Prefork MPM中,该值总是为1,在Worker MPM中,该值受ThreadsPerChild
控制。
设置min
可以决定有多少到后端服务器的链接始终打开。根据 需要最多创建数量为柔性最大值(Soft Maximum),也就是smax
的 链接。任何超出smax
数量的链接都会指定一个生存时间也就是ttl
。Apache不会同时创建超过硬性最大值(或max
)数量的到后端服务器的链接。
ProxyPass /example http://backend.example.com smax=5 max=20 ttl=120 retry=300
参数 | 默认值 | 描述 |
---|---|---|
min | 0 | 到后端服务器的总是打开的链接最小数。 |
max | 1…n | 允许连接到后端服务器的硬性最大链接数。硬性最大值 的默认 值为当前MPM中每个进程的线程数量。在Prefork MPM中,该值总是为1,在Worker MPM中,该值受ThreadsPerChild 控制。 |
smax | max | 根据需要最多创建数量为柔性最大值(Soft Maximum),也就是smax 的 链接。任何超出smax 数量的链接都会指定一个生存时间也就是ttl 。 |
acquire | - | 如果设置了该参数,它就会成为等待链接池中空闲链接的最大时间。如果链接池中没有任何空闲链接,那么Apache将会给客户端返回SERVER_BUSY 状态。 |
flushpackets | off | 决定代理模块是否要在接受到每段数据的时候自动冲掉输出缓冲。‘off’表示只有当需要的时候才冲掉,‘on’表示每段数据后都冲,‘auto’ 表示轮询/等待一段长度为‘flushwait ’毫秒的时间后如果 没有输入便冲掉。目前该参数仅对AJP有效。 |
flushwait | 10 | 表示如果‘flushpackets’为‘auto’,在冲掉输出组前等待额外输入的时间,单位毫秒。 |
keepalive | Off | 该参数应该在你的Apache和后端服务器之间有防火墙的时候时候,因为防火墙有可能会丢弃不活动的链接。该标志将会告诉操作系统在不活动的链接 中发送KEEP_ALIVE 消息(时间间隔由全局的OS设置决定, 一般为120ms),这样避免防火墙丢弃该链接。要启用keepalive可以将该属性设置为On 。 |
lbset | 0 | 对该工作单元所属的负载均衡集群进行设置。负载均衡器会先尝试较小的lbset,然后尝试大的。 |
ping | 0 | Ping数据告诉Web服务器在对ajp13链接递交请求前发送一个CPING请求。参数为等待CPONG响应的延迟,单位为秒。添加该功能是为 了避免挂起和忙碌的Tomcat的一些问题。该功能需要ajp13 的ping/pong支持,已经在Tomcat 3.3.2+、4.1.28+、5.0.13+中实现。它会增加普通操作中的网络流量,有可能是个问题,但是它在集群节点失效或者繁忙的时候减少网络流 量。目前该参数只对AJP有效。 |
loadfactor | 1 | 工作单元负载系数。用于BalancerMember。它是一个1到100之间的数字,用于定义应用于该工作单元的正规化权重负载。 |
redirect | - | 工作单元的重定向路由(Redirection Route)。该值通常被动态设置用于从集群中安全地移除某个节点。如果被设置了,所有不包含会话ID的请求都会被重定向到有等值route参数的 BalancerMember中。 |
retry | 60 | 线程池工作单元重试的超时时间,以秒为单位。如果到后端服务器的线程池工作单元状态是出错,Apache将不会递交任何请求到该服务器,直到超时 结束。这可以令后端服务器关闭进行维护,并稍后上线。如果值为0则表示总是重试错误状态的工作单元不等待任何时间。 |
route | - | 工作单元的路由,用于负载均衡器中。该路由是附加给会话ID的一个值。 |
status | - | 用一个字符定义该工作单元的初始状态:‘D’表示禁用,‘S’表示已停止,‘I’表示忽略错误,‘H’表示热备,‘E’表示出错。状态可以通过前 置‘+’表示设置或者‘-’表示清楚。这样,‘S-E’表示设置该工作单元为已停止并清除出错标志。 |
timeout | Timeout | 链接超时时间,单位为秒。如果未设置,那么Apache会一直等到有可用的链接位置。该指令常和max参数一起使用来限制到后端服务器的链接。 |
ttl | - | 超出smax连接数的非活动链接的生存时间(Time To Live),单位为秒。Apache会关闭在这段时间内没有被用过的所有链接。 |
如果代理的指令类型以balancer://
开头那么会创建 一个虚拟工作单元,并不直接和后端服务器通讯。它负责对一些“真正”的工作单元进行管理。这种情况下可以给虚拟工作单元添加一系列额外参数。更多关于均衡 器如何工作的信息请查看mod_proxy_balancer
。
参数 | 默认值 | 描述 |
---|---|---|
lbmethod | byrequests | 选择均衡器的负载均衡方式。可以是byrequests , 进行加权请求计数,或者是bytraffic ,进行加权流量字节计 数均衡。默认按请求数。 |
maxattempts | 1 | 在放弃之前的故障转移的最大尝试次数。 |
nofailover | Off | 如果设为‘On ’,当工作单元被禁用或者出错时,会话则立 即中断。可以将该值设为On 如果后端服务器不支持会话复制 (Session replication)。 |
stickysession | - | 均衡器粘连会话名称。该值常常会被设置为类似JSESSIONID 或 者PHPSESSIONID 之类的值,他依赖于支持会话的后端应用 服务器。如果后端服务器使用不同的cookie名称或者URL编码的ID(像servlet容器),使用|来分开他们。第一个部分针对cookie,第二 个针对路径。 |
timeout | 0 | 均衡器超时时间,单位为秒。如果设置了,那么就是等待空闲工作单元的最大时间。默认是不等。 |
均衡器设置范例
ProxyPass /special-area http://special.example.com/ smax=5 max=10
ProxyPass / balancer://mycluster stickysession=JSESSIONID|jsessionid nofailover=On
BalancerMember http://1.2.3.4:8009
BalancerMember http://1.2.3.5:8009 smax=10
# 性能较弱的服务器,不要给他发送太多请求
BalancerMember http://1.2.3.6:8009 smax=1 loadfactor=20
设置一个热备份,也就是只有当没有其他成员可用的时候才使用:
ProxyPass / balancer://hotcluster/
BalancerMember http://1.2.3.4:8009 loadfactor=1
BalancerMember http://1.2.3.5:8009 loadfactor=2
# 以下是热备份
BalancerMember http://1.2.3.6:8009 status=+H
ProxySet lbmethod=bytraffic
正常情况下,mod_proxy会标准化被ProxyPass的URL。但它可能会和某些后端不兼容,尤其是那些利用了PATH_INFO的。 可选的nocanon关键词可以禁止它,并不动地直接将URL路径传递给后端。注意它可能会影响到后端的安全性,因为它跳过了由代理提供的对常见的基于 URL的攻击的保护。
当用在
节中的时候, 第一个参数应被忽略,并且本地的路径将从
取得。
如果你需要更加有弹性的反向代理配置,参见是用[P]
标志的RewriteRule
指令。