集群就是在多个应用服务(如:Tomcat)前端设一个前端控制器,负责请求的接收和转发,多数是起到一个分流的作用,把压力分散到每一个应用服务上。
负载均衡就是在集群的基础上前端控制器尽量可以做到对每一个应用服务的请求平衡,负载均衡,即尽量把压力平均分配到每一个后端应用服务,从而达到整个系统的高性能和高可用性。
Apache通常是作为应用服务器的集群的前端。而集群并不局限于Web服务器。很多应用都可以做集群,如数据库、缓存服务器、消息队列等等。
Apache + Tomcat 实现负载均衡
1、环境
(1)Linux:linux系统
(2)Apache:Apache/2.4.6
(3)Tomcat:Apache Tomcat/8.0.36(至少2个,部署在两台机器上)
2、Apache配置
(1)首先,在Apache安装目录下找到conf/httpd.conf文件,以文本编辑器打开
(2)去掉以下文本前的注释符(#)以便让Apache在启动时自动加载代理模块
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.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
注意:有的Apache版本无需在这里面配置,直接引用/httpd/conf.modules.d/下所有文件
(3)在httpd.conf文件末尾添加如下代码
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On
ProxyPassReverse / balancer://cluster/
ServerName 本机IP(域名)
ServerAlias 本机IP(域名)
ErrorLog "logs/error-log.log"
CustomLog "logs/custom-log.log" common
</VirtualHost>
注意:这里balancer://是告诉Apache需要进行负载均衡的代理,后面的cluster是集群名,可以随意取,两个日志引擎ErrorLog负责记录错误,CustomLog负责记录所有的http访问以及返回状态,日志名可以自己取。
(4)在httpd.conf文件最后加上
ProxyRequests Off
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e;path=/" env=BALANCER_ROUTE_CHANGED
<proxy balancer://cluster>
#此处http协议可以更换为ajp协议
BalancerMember http://IP1 loadfactor=1 route=jvm1
BalancerMember http://IP2 loadfactor=1 route=jvm2
ProxySet stickysession=ROUTEID
</proxy>
或者:
ProxyRequests Off
<proxy balancer://cluster>
#此处ajp协议可以更换为http协议
BalancerMember ajp://IP1:8009 loadfactor=1 route=jvm1
BalancerMember ajp://IP2:8009 loadfactor=1 route=jvm2
</proxy>
3、Tomcat配置
(1)配置HTTP/1.1 Connector端口
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>
HTTP/1.1 Connector,即tomcat单独工作时的默认Connector,也是tomcat接收从Apache过来的http请求连接时使用的端口。
(2)配置AJP/1.3 Connector端口
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
AJP/1.3 Connector,这是tomcat接收从Apache过来的ajp连接请求时使用的端口。
注意,这里的端口对应 Apache httpd.conf中BalancerMember中配置的ajp连接端口
(3)配置引擎
找到<Engine name="Catalina" defaultHost="localhost">,去掉这段注释,并修改为
修改Tomcat1:<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
修改Tomcat2:<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm2">
注意:这里的jvmRoute对应Apache httpd.conf中BalancerMember中配置的route参数
(4)配置session共享
打开<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>注释,这里的配置是为了可以在集群中的所有tomcat节点间共享会话(Session)。