使用的工具:
1. Apache2.2.13 + OpenSSL0.98k
2. Tomcat 5.5.28 可以下载最新的source code project然后自己build最新的jar
说明:要搭建基于SSL的环境,是因为tomcat中的应用是基于HTTPS的,那么因为这个原因apache proxy也要设置为SSL proxy才可以
设置tomcat的SSL连接:
1. 生成key,使用JDK提供的的工具keytool,配好JAVA_HOME后进入你的TOMCAT_HOME执行
keytool -genkey -alias tomcat -keyalg RSA -keypass pwd -storepass pwd -keystore server.keystore -validity 365
会在TOMCAT_HOME中生成一个server.keystore的文件
2. 修改server.xml配置tomcat
<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" keystoreFile="server.keystore" keystorePass="pwd"/>
3. 配置tomcat cluster
- 如果你使用的embedded tomcat,也就是说你是用tomcat api去初始化你的engine的话,你需要使用java api来设置cluster.需要的class
org.apache.catalina.cluster.tcp.SimpleTcpCluster
org.apache.catalina.cluster.session.DeltaManager/SimpleTcpReplicationManager
org.apache.catalina.cluster.mcast.McastService
org.apache.catalina.cluster.tcp.ReplicationListener
org.apache.catalina.cluster.tcp.ReplicationTransmitter
org.apache.catalina.cluster.tcp.ReplicationValve
org.apache.catalina.cluster.deploy.FarmWarDeployer
lib - catalina-cluster.jar
将SimpleTcpCluster绑定到你的Host或者是某个Context上,给你的Context设置一个Manager,DeltaManager或者SimpleTcpReplicationManager,区别是DeltaManager只会在你调用session.set/removeAttribute的时候进行session replication,而SimpleTcpReplicationManager则会对每个访问当前Context的request进行replication,你可以通过设置ReplicationValve的filter来过滤那些不对session内容产生影响的request,filter是一些的正则表达式,要用;隔开
- 如果你使用的安装好的tomcat,只需修改server.xml就可以了
<Engine name="Catalina" defaultHost="localhost" jvmRoute="NODE1" >
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="false"
notifyListenersOnReplication="true">
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"
ackTimeout="15000"
waitForAck="true"/>
<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*/.gif;.*/.js;.*/.jpg;.*/.png;.*/.htm;.*/.html;.*/.css;.*/.txt;"/>
<Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/></Cluster>
设置apache loadbalance
1. 加载需要的Module
- 修改httpd.conf
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule ssl_module modules/mod_ssl.so
- 修改httpd.conf,加载httpd-ssl.conf,这个是ssl的设置
Include conf/extra/httpd-ssl.conf
- 设置SSL环境,使用OpenSSL生成SSL需要的证书 进入bin下面执行以下命令
openssl req -config ../conf/openssl.cnf -new -out server.csr
openssl rsa -in privkey.pem -out server.key
openssl x509 -in server.csr -out server.cert -req -signkey server.key -days 365
- 将生成的server.cert和server.key拷贝到conf/ssl,ssl目录是新建 的
- 修改conf/extra/httpd-ssl.conf
SSLCertificateFile "c:/Apache2.2/conf/ssl/server.cert"
SSLCertificateKeyFile "c:/Apache2.2/conf/ssl/server.key"
SSLEngine on
SSLProxyEngine on
- 修改httpd.conf设置loadbalancer
# Load Balance settings (stickysession=JSESSIONID) status=+H (standby)
<IfModule mod_proxy.c>
ProxyRequests Off
ProxyPass /appURL balancer://mycluster/ lbmethod=bytraffic
ProxyPassReverse /appURL https://NODE1Host:PORT/appURL
ProxyPassReverse /appURL https://NODE2Host:PORT/appURL
<Proxy balancer://mycluster>
BalancerMember https://NODE1Host:PORT/appURL route=NODE1 loadfactor=50
BalancerMember https://NODE2Host:PORT/appURL route=NODE2 loadfactor=50
</Proxy>
<Location /balancer-manager>
SetHandler balancer-manager
</Location>
</IfModule>
说明:
1. /balancer-manager是apache提供的一个loadbalance管理界面,你可以在上面看到一些负载的数据,还可以修改一些参数
2. stickysession= JSESSIONID, 这个设置要加载ProxyPass里,代表proxy server可以将某个sessionID的request总是定向到生成这个session的server
3. status=+H,放到BalancerMember这一行的最后,代表这个server是做备份的,通常proxy server不会分派request给它,当另一台server宕机的时候,就自动分配request到这一台机器上,如果你的webApp是很依赖session的应用,你需要配置Tomcat的cluster来做session replication
4. route的值必须和tomcat cluster中设置的jvmRoute相同
5. loadfactor可以根据你的需要修改,范围在1-100之间
到此为止,大功告成,可以访问https://localhost:443/appURL来验证你的loadbalance了 :)