利用httpd对Tomcat进行负载均衡

操作系统:CentOS 6.5_x86_64

前提:提前准备好编译环境,防火墙和selinux都关闭

主机IP:两台机器,192.168.203.103、192.168.203.104

安装软件:jdk-8u51-linux-x64, apache-tomcat-8.0.24, tomcat-connectors-1.2.41, httpd-2.2.15, httpd-devel-2.2.15

一、两台机器都安装JAVA8

1
2
3
sudo rpm -qa | grep jdk
jdk-1.7.0_45-fcs.x86_64
sudo rpm -e jdk-1.7.0_45

下载JDK8的包

1
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u60-b27/jdk-8u60-linux-x64.tar.gz"

如果上述链接失效,请去官网下载最新的源码包。

1
2
3
4
5
6
cd /opt/
tar xzf jdk-8u51-linux-x64.tar.gz
cd /opt/jdk1.8.0_51/
sudo chown -R root:root /opt/jdk1.8.0_51/
sudo alternatives --install /usr/bin/java java /opt/jdk1.8.0_51/bin/java 2
sudo alternatives --config java

得到以下输出,选择刚刚安装的jdk8即可:

1
2
3
4
5
6
7
8
9
There are 3 programs which provide 'java'.

Selection Command
-----------------------------------------------
* 1 /opt/jdk1.7.0_71/bin/java
+ 2 /opt/jdk1.8.0_25/bin/java
3 /opt/jdk1.8.0_51/bin/java

Enter to keep the current selection[+], or type selection number: 3

然后再配置下javac和jar

1
2
3
4
sudo alternatives --install /usr/bin/jar jar /opt/jdk1.8.0_51/bin/jar 2
sudo alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_51/bin/javac 2
sudo alternatives --set jar /opt/jdk1.8.0_51/bin/jar
sudo alternatives --set javac /opt/jdk1.8.0_51/bin/javac

查看下JDK版本

1
java -version

修改环境变量

1
sudo vim /etc/profile

输入以下内容

1
2
3
export JAVA_HOME=/opt/jdk1.8.0_51
export JRE_HOME=/opt/jdk1.8.0_51/jre
export PATH=$PATH:$JAVA_HOME/bin

执行

1
source /etc/profile

二、两台机器安装tomcat

1.下载安装tomcat

1
2
3
4
wget http://mirrors.cnnic.cn/apache/tomcat/tomcat-8/v8.0.24/bin/apache-tomcat-8.0.24.tar.gz
tar xf apache-tomcat-8.0.24.tar.gz -C /usr/local/
cd /usr/local/
ln -sv apache-tomcat-8.0.24 tomcat

2.配置环境变量

1
vim /etc/profile.d/tomcat.sh

1
2
3
CATALINA_BASE=/usr/local/tomcat
PATH=$CATALINA_BASE/bin:$PATH
export PATH CATALINA_BASE

执行:

1
. /etc/profile.d/tomcat.sh

3.查看状态:

1
catalina.sh version

4.提供启动脚本

sudo vim /etc/init.d/tomcat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

#!/bin/sh
# Tomcat init script for linux
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container
# JAVA_OPTS='-Xms64m -Xmx128m'
JAVA_HOME=/opt/jdk
CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME CATALINA_HOME

case $1 in
start)
exec $CATALINA_HOME/bin/catalina.sh start ;;
stop)
exec $CATALINA_HOME/bin/catalina.sh stop ;;
restart)
echo "stoping tomcat ..."
ps aux |grep tomcat/bin |grep -v "grep tomcat/bin" |while read line
do
linewords=($line)
pid="${linewords[1]}"
kill -9 $pid
done
# $CATALINA_HOME/bin/catalina.sh stop
sleep 2
echo "starting tomcat ..."
exec $CATALINA_HOME/bin/catalina.sh start ;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac

执行:

1
2
3

sudo chmod +x /etc/init.d/tomcat
sudo chkconfig --add tomcat

5.编辑tomcat配置文件,只添加jvmRoute参数:

在第一台机子上面:

1
sudo vim /usr/local/tomcat/conf/server.xml

修改下面这句:

1
<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">

在第二台机子上面:

1
sudo vim /usr/local/tomcat/conf/server.xml

修改下面这句:

1
<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB">

6.提供测试页面

第一台机器上:

1
2
sudo mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}
sudo vim /usr/local/tomcat/webapps/test/index.jsp

写一个简单的JSP页面:

1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>test</title>
</head>
<body>
<%
out.println("This is TomcatA");
%>
</body>
</html>

然后启动tomcat

1
sudo service tomcat start

这时候可以通过访问 http://192.168.203.103:8080/test 访问到这个页面

第二台机器上:

1
2
sudo mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}
sudo vim /usr/local/tomcat/webapps/test/index.jsp

写一个简单的JSP页面:

1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>test</title>
</head>
<body>
<%
out.println("This is TomcatB");
%>
</body>
</html>

然后启动tomcat

1
sudo service tomcat start

这时候可以通过访问http://192.168.203.104:8080/test访问到这个页面

三、利用mod_jk模块对tomcat进行负载均衡

利用httpd反向代理tomcat时有两种方法,分别要用到mod_proxy和mod_jk这两个模块。
mod_jk需要额外编译安装,不过它功能更强大,所以推荐mod_jk。
此模块只需要在一台机器上安装,我们这里在第一台机器(103)上安装。

1.安装httpd:

1
yum -y install httpd httpd-devel

2.安装mod_jk.so模块:

1
2
3
4
5
wget http://mirrors.cnnic.cn/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.41-src.tar.gz
tar xf tomcat-connectors-1.2.41-src.tar.gz
cd tomcat-connectors-1.2.41-src/native/
./configure --with-apxs=/usr/sbin/apxs
sudo make && sudo make install

3.提供额外的httpd模块配置文件:

1
vim /etc/httpd/conf.d/httpd-jk.conf
1
2
3
4
5
6
7
# Load the mod_jk
LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/httpd/conf.d/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount /* lb1
JkMount /status/ stat1

4.配置mod_jk模块的配置文件workers.properties:

1
vim /etc/httpd/conf.d/workers.properties
1
2
3
4
5
6
7
8
9
10
11
12
13
worker.list = lb1,stat1
worker.TomcatA.type = ajp13
worker.TomcatA.host = 192.168.203.103
worker.TomcatA.port = 8009
worker.TomcatA.lbfactor = 1
worker.TomcatB.type = ajp13
worker.TomcatB.host = 192.168.203.104
worker.TomcatB.port = 8009
worker.TomcatB.lbfactor = 1
worker.lb1.type = lb
worker.lb1.sticky_session = 0
worker.lb1.balance_workers = TomcatA, TomcatB
worker.stat1.type = status

5.启动httpd测试:
我们先去修改下hostname,还有httpd的domainname,sudo vim /etc/hosts

1
127.0.0.1	localhost centos03

然后修改httpd的配置文件,sudo vim /etc/httpd/conf/httpd.conf
修改这一行:

1
ServerName localhost:80

最后我们启动httpd服务:

1
sudo service httpd start

用浏览器打开http://192.168.203.103/test,我们不断刷新,可以看到效果。

6.修改httpd默认端口号方法

1
sudo vim /etc/httpd/conf/httpd.conf

修改两个地方

1
2
3
4
5
6
7
8
9
#Listen 12.34.56.78:80
Listen 80
#把80改为你设置的端口,我设置端口为8088

Listen 8088

NameVirtualHost *:80
#把80改为你设置的端口,我设置端口为8088
NameVirtualHost *:8088

保存修改,退出,重启httpd服务。