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/>不需要。