当httpd端采用mod_proxy和tomcat连接时,可以采用ajp或http协议进行连接。
要使用mod_proxy与Tomcat连接,需要apache已经装载mod_proxy、mod_proxy_http、mod_proxy_ajp和proxy_balancer_module(实现Tomcat负载均衡时用到)等模块。使用rpm包安装的httpd一般默认已经启用它们,如果是编译httpd,则在编译选项中加上以下对应几项:
--enable-proxy --enable-proxy-http --enable-proxy-ajp --enable-proxy-balancer
如果是已经编译好的Httpd,则可以使用apxs工具,向httpd中添加这几个新模块。添加方法见:httpd添加新模块。
确保proxy相关的模块已经加载了。
[root@xuexi ~]# httpd -M | grep proxy
Syntax OK
proxy_module (shared)
proxy_balancer_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared)
proxy_ajp_module (shared)
proxy_connect_module (shared)
5.1 配置httpd代理到tomcat
基于ajp连接协议和tomcat连接时,向httpd添加以下配置文件。如果要基于http协议连接tomcat,将上面配置文件的ajp协议改为http协议,并修改端口即可。
[root@xuexi ~]# cat /etc/httpd/conf.d/ajp.conf
<Location /status>
SetHandler balancer-manager
Proxypass ! # 表示此Location的URL不进行反向代理
Require ip 192.168.100
</Location>
ProxyVia Off
ProxyRequests Off
ProxyPreserveHost Off
ProxyPassMatch "^/(.*\.jsp)$" ajp://192.168.100.22:8009/$1
ProxyPassReverse "^/(.*\.jsp)$" ajp://192.168.100.22:8009/$1
<Proxy *>
Require all granted
</Proxy>
重启httpd。注意,重启前将前面mod_jk实验的配置文件删除掉。
关于如上apache配置的几个指令,解释如下。httpd反向代理的详细内容,可参见:详细分析apache httpd反向代理的用法。
- ProxyVia {On|Off|Full|Block}:用于控制在http首部是否使用"Via:",主要用于在多级代理中控制代理请求的流向。默认为Off,即不启用此功能;On表示每个请求和响应报文均添加"Via:";Full表示每个"Via:"行都会添加当前apache服务器的版本号信息;Block表示每个代理请求报文中的"Via:"都会被移除。
- ProxyRequests {On|Off}:是否开启apache正向代理的功能;如果为apache设置了ProxyPass即反向代理,则必须将ProxyRequests设置为Off。
- ProxyPreserveHost {On|Off}:如果启用此功能,代理会将用户请求报文中的"Host:"行发送给后端的服务器,而不再使用ProxyPass指定的服务器IP地址。如果后端一个IP上可能会有多个虚拟主机,则需要开启此项明确转发给哪台虚拟主机,否则就无需打开此功能。
- ProxyPassReverse:在反向代理环境中必须使用此指令避免重定向报文绕过proxy服务器,属性设置为ProxyPass一样基本上就可以。
- ProxyPass [path] !|[url [key=value key=value ...]]:将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务器上某URL路径。使用此指令时必须将ProxyRequests的值设置为Off。需要注意的是,如果path以"/"结尾,则对应的url也必须以"/"结尾,反之亦然。
- ProxyPassMatch [regex] !|url [key=value [key=value ...]]:正则格式的ProxyPass。
5.2 通过mod_proxy负载均衡tomcat
关于httpd反向代理的负载均衡配置方式,参见详细分析apache httpd反向代理的用法。
在httpd.conf中配置如下内容:
<proxy balancer://TomcatLB>
BalancerMember ajp://192.168.100.38:8009 loadfactor=5
BalancerMember ajp://192.168.100.36:8009 loadfactor=10
</proxy>
ProxyVia Off
ProxyRequests Off
ProxyPreserveHost Off
ProxyPassMatch "^/(.*\.jsp)$" balancer://TomcatLB/$1
ProxyPassReverse "^/(.*\.jsp)$" balancer://TomcatLB/$1
<Proxy *>
Require all granted
</Proxy>
<Location /status>
SetHandler balancer-manager
Proxypass !
Require ip 192.168.100
</Location>
重启httpd并在浏览器中输入192.168.100.17/test/index.jsp测试,测试时会轮调两次tomcatB再轮调一次tomcatA。
如果要实现session粘滞(绑定),则修改httpd配置文件如下:
<proxy balancer://TomcatLB>
BalancerMember ajp://192.168.100.22:8009 loadfactor=5 route=TomcatA
BalancerMember ajp://192.168.100.23:8009 loadfactor=10 route=TomcatB
ProxySet lbmethod=byrequets
</proxy>
ProxyVia Off
ProxyRequests Off
ProxyPreserveHost Off
ProxyPassMatch "^/(.*\.jsp)$" balancer://TomcatLB/$1 stickysession=JSESSIONID
ProxyPassReverse "^/(.*\.jsp)$" balancer://TomcatLB/$1 stickysession=JSESSIONID
<Proxy *>
Require all granted
</Proxy>
<Location /status>
SetHandler balancer-manager
Proxypass !
Require ip 192.168.100
</Location>
然后分别配置tomcatA和tomcatB的engine组件,分别加上jvmRoute="TomcatA"和jvmRoute="TomcatB"属性。
<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">
<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB">
重启httpd和tomcatA、tomcatB,然后测试结果,再测试时同一客户端将总是得到同一个结果,不会出现负载均衡。
转载请注明出处:http://www.cnblogs.com/f-ck-need-u/p/8414043.html