在网上查找了许多资料,搞了两天才搞出来,记录下来。
httpd-2.2.22-win32-x86-openssl-0.9.8t.msi,apache-tomcat-7.0.23-windows-x64.zip,tomcat-connectors-1.2.37-windows-i386-httpd-2.2.x.zip,Win64OpenSSL-0_9_8x.exe。
下面列出关键步骤
一、安装apache,tomcat集群
这一步网上有很多教程,按照步骤操作基本上没问题。
安装apache,略。
tomcat解压,我是解压了两份,分别命名为tomcat1,tomcat2.
解压tomcat-connectors,取出mod_jk.so。
1、配置jk,即tomcat集群
我把mod_jk.so直接放在了apache/conf目录下,新建jk配置文件,如jk.conf,我也直接放apache/conf目录下。在apache的httpd.conf文件中加入下面一句。
Include conf/jk.conf
jk.conf配置如
#加载jk模块
LoadModule jk_module conf/mod_jk.so
#集群设置
JkWorkersFile conf/jk.properties
#指定那些请求交给tomcat处理,"controller"为在jk.propertise里指定的负载分配控制器名
JkMount /* controller
配置集群,新建文件jk.properties,同样放在conf目录下,内容如下,注意端口,ip正确
#server
worker.list = controller
#========tomcat1========
worker.tomcat1.port=8009
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1
#========tomcat2========
worker.tomcat2.port=9009
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1
#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2
worker.controller.sticky_session=false
worker.controller.sticky_session_force=1
apache部分的配置基本完成了。现在修改tomca,server.xmlt配置,首先修改端口,跟jk的设置一致,其他修改点
<Engine name="Catalina" defaultHost="localhost">
修改为,注意跟jk配置中的名字,端口一致
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
把下面一行的注释打开
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
web项目需要在web.xml中加上以下内容,以实现两个tomcat之间的会话复制
<distributable/>
附上网上流传的测试项目test,就两个文件,文件test/index.jsp,test/WEB-INF/web.xml。在tomcat的server.xml修改配置
<Context docBase="test" distributable="true" path=""/>
index.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
// 如果有新的 Session 属性设置
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.println("<b>Session 列表</b><br>");
System.out.println("============================");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="index.jsp" method="POST">
名称:<input type=text size=20 name="dataName">
<br>
值:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>
web.xml
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
<display-name>TomcatDemo</display-name>
<distributable/>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
二、配置ssl
我是按照的openssl的windows版来生成证书的,也可以参照http://blog.sina.com.cn/s/blog_6f67b91d010115tt.html或http://blog.youkuaiyun.com/mengfanpp/article/details/4101333
安装完成后,会生成一个环境变量OPENSSL_CONF,D:\OpenSSL\bin\openssl.cfg,若之后修改安装路径的话注意这个地方。手工添加D:\OpenSSL\bin\到path。
生成根证书,服务器证书用到的命令
openssl genrsa -des3 -out ca.key 1024
openssl rsa -in ca.key -out ca.key
openssl req -new -x509 -key ca.key -out ca.crt -config D:\OpenSSL\bin\openssl.cfg
openssl genrsa -des3 -out server.key 1024
openssl rsa -in server.key -out server.key
openssl req -new -key server.key -out server.csr
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
生成的服务器证书server.crt,server.key我把它放到apache/conf下。
修改apache/httpd.conf,放开Include conf/extra/httpd-ssl.conf的注释。
找到conf/extra/httpd-ssl.conf,加入LoadModule ssl_module modules/mod_ssl.so,找到VirtualHost,修改为如以下内容
<VirtualHost _default_:443>
#https交给jk转发给tomcat
JkMount /* controller
#证书路径
SSLCertificateFile "D:/apache/conf/server.crt"
#证书key
SSLCertificateKeyFile "D:/apache/conf/server.key"
到此为止,配置基本完成。如果想禁止http访问,只开放https的话,把apache/httpd.conf下面的Listen 80注掉就可以了,这样就只开放了443的https端口。
tomcat的https配置
利用jdk的keytool工具
keytool -v -genkey -alias tomcat -keyalg RSA -keystore d:/tomcat.keystore
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true" keystoreFile="d:/tomcat.keystore" keystorePass="123456"
clientAuth="false" sslProtocol="TLS" />