1. 操作系统
RedHat Linux
2. 所需软件
Apache 2.2.14 下载地址
http://apache.freelamp.com/httpd/httpd-2.2.14.tar.gz
Tomcat5.5.28 下载地址
http://tomcat.apache.org/download-55.cgi
JK 下载地址
http://apache.etoak.com/tomcat/tomcat-connectors
文件:tomcat-connectors-1.2.28-src.tar.gz
Jdk 1_5_0_04 下载地址
http://java.sun.com/j2se/1.5.0/download.jsp
备注:下载时将所需软件包文件保存在/opt目录下
3. 安装步骤
A 安装JDK
# cd /opt/
# chmod +x jdk-1_5_0_04-linux-i586-rpm.bin
# ./jdk-1.5.0_04-linux-i586-rpm.bin
# cd /usr/java/
# ln -s /usr/java/jdk-1_5_0_04 /opt/java
# vi /etc/profile
#添加如下内容
export JAVA_HOME=/opt/java/
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=.:$JAVA_HOME/bin:$PATH
B 安装Apache
# cd /opt/
# tar xvfz httpd-2.0.54.tar.gz
# cd httpd-2.0.54
#./configure --prefix=/opt/apache --enable-module=so
# make
# make install
# cd /opt/apache/conf
# vi ./httpd.conf
将Listen 80 修改为Listen <Your IP>:80 IP到时候就是自己机器的IP地址,否则
其他机器没法访问你。
将ServerName 修改为ServerName <HOST-NAME> ,这个地方直接127.0.0.1即可。集群的时候会读httpd-vhost.conf
下面是一个配置有关的问题:
修改serverName,重装apache后问题依旧,最后发现host配置不正确,
httpd.conf 中serverName 为www.zudar.com
host 中 127.0.0.1 www.zudar.com
改为 192.168.100.38 www.zudar.com
后正确启动
问题是由于 ip 地址 与 域名没有正确匹配引起
也就是说host中一点要配置好ip与serverName
hostname与/etc/hosts的关系
很过人一提到更改hostname首先就想到修改/etc/hosts文件,认为hostname的配置文件就是/etc/hosts。其实不是的。
hosts文件的作用相当如DNS,提供IP地址到hostname的对应。早期的互联网计算机少,单机hosts文件里足够存放所有联网计算机。不过随着互联网的发展,这就远远不够了。于是就出现了分布式的DNS系统。由DNS服务器来提供类似的IP地址到域名的对应。具体可以man hosts。
Linux系统在向DNS服务器发出域名解析请求之前会查询/etc/hosts文件,如果里面有相应的记录,就会使用hosts里面的记录。/etc/hosts文件通常里面包含这一条记录
127.0.0.1 localhost.localdomain localhost
hosts文件格式是一行一条记录,分别是IP地址 hostname aliases,三者用空白字符分隔,aliases可选。
127.0.0.1到localhost这一条建议不要修改,因为很多应用程序会用到这个,比如sendmail,修改之后这些程序可能就无法正常运行。
修改hostname后,如果想要在本机上用newhostname来访问,就必须在/etc/hosts文件里添加一条newhostname的记录。比如我的eth0的IP是192.168.1.61,我将hosts文件修改如下:
#hostname blog.infernor.net
# cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
192.168.1.61 blog.infernor.net blog
这样,我就可以通过blog或者blog.infernor.net来访问本机。
在DirectoryIndex中添加 index.jsp
# cd /opt/apache/bin/
# ./apachectl configtest
若显示Syntax ok则表明安装成功
#./apachectl start
启动apache服务,访问本机80端口,查看端口是否正常
# ./apachectl stop
关闭服务
备注:prefix定义apache的安装路径
C 安装Tomcat
# cd /opt/
# tar xvfz jakarta-tomcat-5.5.9.tar.gz
# ln –s /opt/jakarta-tomcat-5.5.9 /opt/tomcat
# vi /opt/tomcat/bin/catalina.sh
JAVA_HOME=/opt/java
启动服务后,访问本机8080端口,查看端口是否正常
# /opt/tomcat/bin/startup.sh /startup.bat
关闭服务
# /opt/tomcat/bin/shutdown.sh /shutdown.bat
修改各个tomcat的端口(如果两台机器是在不同的主机上,端口可以不动,显然)
tomcat1/conf/server.xml
<Server port="8005" shutdown="SHUTDOWN" debug="0">改为
<Server port="11001" shutdown="SHUTDOWN" debug="0">
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="UTF-8"/>改为
<Connector port="11002"
......
作loadbalance的话,上面connector可以注释掉。
<Connector port="8009"
enableLookups="false" redirectPort="8443" debug="0"
protocol="AJP/1.3" />改为
<Connector port="11003"
......
tomcat2/conf/server.xml
<Server port="8005" shutdown="SHUTDOWN" debug="0">改为
<Server port="12001" shutdown="SHUTDOWN" debug="0">
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="UTF-8"/>改为
<Connector port="12002"
......
上面这个connector同样也注释掉。
<Connector port="8009"
enableLookups="false" redirectPort="8443" debug="0"
protocol="AJP/1.3" />改为
<Connector port="12003"
D 安装JK
#cd /usr/local/
# tar xzvf jakarta-tomcat-connectors-1.2.14-src.tar.gz
#cd jakarta-tomcat-connectors-1.2.14-src/native
#./buildconf.sh
#./configure --with-apxs=/usr/local/apache/bin/apxs
#make
#make install
#cd /opt/jakarta-tomcat-connectors- jk1.2.14-src/jk/native/apache-2.0/
#cp mod_jk.so /opt/apache/modules/
E 系统整合
#vi /opt/apache/conf/httpd.conf
在文件最末尾加上如下语句
include conf/mod_jk.conf
# Configure mod_jk.conf
在conf目录下创建mod_jk.conf文件,内容如下:
--------------------------mod_jk.conf--------------------------
# Load mod_jk module
LoadModule jk_module modules/mod_jk.so
# Where to find workers.properties
JkWorkersFile conf/workers.properties
# Where to put jk logs
JkLogFile logs/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器
JkMount /*.jsp loadbalancer(这个loadbalancer是下面worker.list最后一个值)
如果还要指定*.do也进行分流就再加一行
JkMount /*.do loadbalancer
如果你想对所有的请求进行分流只需要写成
JkMount /* loadbalancer
--------------------------mod_jk.conf--------------------------
编辑workers.properties
#vi /opt/apache/conf/workers.properties
#
# workers.properties
#
# list the workers by name
worker.list=tomcat1, tomcat2, loadbalancer
# ------------------------
# First tomcat server
# ------------------------
worker.tomcat1.port=11003
worker.tomcat1.host=127.0.0.1
worker.tomcat1.type=ajp13
# Specify the size of the open connection cache.
#worker.tomcat1.cachesize
#
# Specifies the load balance factor when used with
# a load balancing worker.
# Note:
# ----> lbfactor must be > 0
# ----> Low lbfactor means less work done by the worker.
worker.tomcat1.lbfactor=100
# ------------------------
# Second tomcat server
# ------------------------
worker.tomcat2.port=12003
worker.tomcat2.host=127.0.0.1
worker.tomcat2.type=ajp13
# Specify the size of the open connection cache.
#worker.tomcat2.cachesize
#
# Specifies the load balance factor when used with
# a load balancing worker.
# Note:
# ----> lbfactor must be > 0
# ----> Low lbfactor means less work done by the worker.
worker.tomcat2.lbfactor=100
# ------------------------
# Load Balancer worker
# ------------------------
# The loadbalancer (type lb) worker performs weighted round-robin
# load balancing with sticky sessions.
# Note:
# ----> If a worker dies, the load balancer will check its state
# once in a while. Until then all work is redirected to peer
# worker.
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1, tomcat2
#
# END workers.properties
#
cluster配置,如果不配置cluster只是做loadbalance不需要
修改server.xml中的engine
#vi /opt/tomcat/conf/server.xml
在120行左右修改原来的, 添加jvmRoute="tomcat1"
<Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat1">
若第二台tomcat,添加jvmRoute的修改为tomcat2
至此,系统已经整个完毕 启动apache和tomcat服务 如果不放心可以编写一个测试
在其中一个tomcat的webapps中建立一个目录TestCluster,里面新建一个test.jsp,内容为
<%
System.out.println("===========================");
%>
把TestCluster放到tomcat1,tomcat2的webapps下
启动apache,tomcat1,tomcat2,进行测试
通过 http://localhost/TestCluster/test.jsp 访问,多刷新几次页面,查看Tomcat1和Tomcat2 logs目录下面的catalina.out
文件,你将可以看到打印了一行行"===========================",并且从统计上来说,
大约在tomcat2打印的数量和在Tomcat1中一样,
如果lbfactor不一样的话,可以看到请求会被tomcat1,tomcat2按照不同的权重分流处理,实现了负载均衡。
自动重启
将如下内容添加至/etc/rc.d/rc.local文件末尾,以便系统启动后开启apache,tomcat服务
/usr/local/tomcat1/bin/startup.sh
/usr/local/tomcat2/bin/startup.sh
/opt/apache/bin/apachectl start
这样做是不是够呢,比如说一个浏览器访问的时候开始被分发给A sever,然后又分发给B server,那么
session里面的数据就不一致了或不正确了。两个问题,一个是apahce已经实现了,对于同一个浏览器通过来的请求会绑定到同一个server,那就没有问题。但是通过下面的测试发现不是的。
<%@ 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.print("<b>Session 列表</b>");
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>
是需要其他配置还是?另一个方法就是session的复制,及集群功能。
配置集群的方法参考“链接”中的一篇文章就可以了。
apache和tomcat虚拟机设置:
1,在apache中 注销DocumentRoot,ServerName,Directory 等行(Directory包括的也
是)。
2,把conf文件中的Include conf/extra/httpd-vhosts.conf的注销去掉,这个文件专
门用于配置虚拟主机。
3,设置conf文件的listen 为你的ip
4,假设apache的项目在usr/webapps下,项目的域名为www.mydomain.com,并在isp做好
了域名解析指向当前服务器的IP
5,打开conf/extra/httpd-vhosts.conf ,添加如下内容
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin admin@yazhouly.cn
ServerName www.mydomain.com
DocumentRoot "/usr/webapps/test"
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
<Directory "/usr/webapps/test">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
JkMount /* loadbalancer
</VirtualHost>
其中最后四行表示关于jsp的内容都转交给tomcat处理,虽然我们在配置连接器的时候
,已经配置了,但是在虚拟机设置后,还是要单独加上这几句,其中work就是
mod_jk.conf中配置的代理名。
打开tomcat目录conf下面的server.xml
添加主机信息
<Host name="localhost" appBase="/usr/webapps/test"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="/usr/webapps/test" debug="0" reloadable="true"
crossContext="true"/>
</Host>
保存 重新启动apache
在地址栏中输入
www.mydomain.com
就会出现你的首页
遇到的问题
1)启动时产生 Error receiving mcast package
经测试发现,我用的ADSL,如果我联网,则会报这个异常,如果断网则不会产生。看来那个
tcpListenAddress="192.168.0.1"
需要使用外网的IP地址才可以。
2)启动异常,一般是端口被占用
请仔细看各个server.xml配置文件,各个端口不能相同
3)如果不能做cluster只做load balance那么jvm="tomcat1"和jvm="tomcat2"这两部分内容必须保留,
cluster保持注释状态,<distributable/>不需要。