如何使用apache mod_proxy和Tomcat搭建基于SSL的loadbalance集群环境

来源:互联网 发布:mysql float 精度 编辑:程序博客网 时间:2024/05/17 08:00

使用的工具:

 

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了 :)





 


 

 

 

 

 

 

 

原创粉丝点击