Apache HTTP Server(简称 Apache),是 Apache 软件基金协会的一个开放源码的网页服务器,Apache 反应速度快,运行效率高,但只支持HTML等静态页面(加载插件后也可支持 PHP 页面)。Tomcat 是由 Apache 软件基金协会与 Sun 公司联合开发的一款Web服务器,它除了支持HTML等静态页面外,还支持JSP、Servlet 。在相同的运行环境下,Tomcat 对静态页面的反应速度没有 Apache 灵敏,生产环境使用 Apache 与 Tomcat 搭建负载均衡集群,可以提高网站并发。Apache+Tomcat搭建集群连接有三种方式:JK、http_proxy、ajp_proxy
在开始下文之前,需要已安装了apache和tomcat,可参考:安装配置apache 、安装配置tomcat
1.准备两套tomcat环境
cp -a /usr/local/tomcat /usr/local/tomcat1 cp -a /usr/local/tomcat /usr/local/tomcat2 vim /usr/local/tomcat2/conf/server.xml #修改tomcat2的远程停止服务端口,如果两台tomcat在不同机器上就不用修改 <Server port="8006" shutdown="SHUTDOWN"> #修改tomcat2的HTTP监听端口,如果两台tomcat在不同机器上就不用修改 <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> #修改tomcat2的AJP监听端口,如果两台tomcat在不同机器上就不用修改 <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" /> #修改tomcat2的标识名,这一步必须做 <Engine name="Catalina" defaultHost="localhost" jvmRoute="worker2"> vim /usr/local/tomcat2/conf/context.xml #要实现session复制,还需要在Context添加属性distributable="true" <Context distributable="true"> vim /usr/local/tomcat1/conf/context.xml #同理,还需tomcat1的Context添加属性distributable="true" <Context distributable="true"> vim /usr/local/tomcat1/webapps/ROOT/test.jsp #在tomcat1的wed路径下创建一个用于测试的页面 tomcat1 SessionID: <%=session.getId() %> vim /usr/local/tomcat2/webapps/ROOT/test.jsp #在tomcat2的wed路径下创建一个用于测试的页面 tomcat1 SessionID: <%=session.getId() %>
2.编译生成mod_jk.so模块
Apache之所以能够和Tomcat通讯就是依靠了tomcat-connectors(连接器),官方下载地址。而这个东西通讯协议就是AJP/1.3 ,这也是为什么我们每次启动Tomcat的时候除了我们常见的http通讯端口8080,但还有一个端口AJP 8009。其实多启动的这个8009端口就是为了与Apache通讯使用的,如果我们用不到Apache服务器那我们完全可以把Tomcat加载启动AJP服务关闭掉,减少内存占用提高效率。编译安装tomcat-connectors完成后会生成mod_jk.so,即Apache与Tomcat的连接模块,此模块附带提供集群和负载均衡的功能。JK分为两个版本1.x和2.x,其中2.x并不是最新的版本,它是JK的另外一个分支,后来没有继续开发,2.x版本已经废弃,通常使用1.x的版本。官方下载地址。
#需要先安装依赖包,否则会报错 yum install glibc-headers gcc-c++ -y wget http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.43-src.tar.gz tar zxvf tomcat-connectors-1.2.43-src.tar.gz cd tomcat-connectors-1.2.43-src/native/ ./configure --with-apxs=/usr/local/apache2/bin/apxs make cp apache-2.0/mod_jk.so /usr/local/apache2/modules/
3.添加mod_jK配置文件
vim /usr/local/apache2/conf/mod_jk.conf #载入mod_jk.so LoadModule jk_module modules/mod_jk.so #指出mod_jk模块工作所需的工作文件workers.properties的路径 JkWorkersFile conf/workers.properties #指定JK日志文件路径 #JkLogFile logs/mod_jk.log #指定JK日志记录级别 JkLogLevel debug #指定日志格式 JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " #指定请求日志格式 JkRequestLogFormat "%w %V %T" #把匹配的页面转发到负载均衡集群,loadbalancer在workers.properties中配置 JkMount /*.do loadbalancer JkMount /*.jsp loadbalancer # 指定apache解析的静态页面路径 JkAutoAlias /usr/local/apache2/htdocs
3.添加mod_jK服务器配置文件
关于workers.properties更多参数解释可以网上搜索“workers.properties配置说明”
vim /usr/local/apache2/conf/workers.properties #定义名为loadbalancer的集群 worker.list=loadbalancer #定义类型为负载平衡 worker.loadbalancer.type=lb #定义集群包含的工作组 worker.loadbalancer.balance_workers=worker1,worker2 #下面的1为黏性Session,即同一会话中的请求都被派送到同一个tomcat实例 worker.loadbalancer.sticky_session=1 #设置worker1的属性:ajp端口、IP、类型、负载权重 worker.worker1.port=8009 worker.worker1.host=127.0.0.1 worker.worker1.type=ajp13 worker.worker1.lbfactor=1 #设置worker2的属性 worker.worker2.port=8010 worker.worker2.host=127.0.0.1 worker.worker2.type=ajp13 worker.worker2.lbfactor=1
4.修改apache配置文件
vim /usr/local/apache2/conf/httpd.conf #增加包含mod_jk.conf的语句 Include /usr/local/apache2/conf/mod_jk.conf
5.测试
重启tomcat和apache后(如果启动不起来会在相应日志里打印,查询并排除即可),在浏览器地址栏输入http://<server IP>/test.jsp,可以看到使用的是tomcat1或者tomcat2下的test.jsp文件,一直刷新页面也是固定不变的,说明黏性Session设置没问题。