Apache是Web服务器,主要用来解析静态文本,只支持静态网页,专门提供HTTP服务以及相关配置(如:虚拟主机,URL转发等等),并可做代理服务器来使用.但是没有jsp/servlet的解析能力.
Tomcat是应用服务器,主要用来解析jsp/servlet.

将Apache与Tomcat结合,适合并发数较大的企业级应用.
Apache负责接收所有来自客户端的HTTP请求,如果请求是静态文本则由Apache解析,并把结果返回给客户端.如果是动态请求,则将jsp和servlet的请求转发给Tomcat来处理.Tomcat完成处理后,将响应传回给Apache,最后Apache将响应返回给客户端.
这样就可以达到分工合作,实现负载均衡,提高系统的性能,具有更好的可扩展性.

Tomcat中有两个监听的端口,一个是8080用于提供web服务,一个是8009用于监听来自于Apache的请求.
Apache与Tomcat整合,使用AJP/1.3通信.

一:软件环境
1.Apache(http://httpd.apache.org)
     httpd-2.2.22.tar.gz
2.Tomcat(http://tomcat.apache.org)
     apache-tomcat-7.0.59.tar.gz
3.mod_jk(http://tomcat.apache.org/download-connectors.cgi)
     tomcat-connectors-1.2.37-src.tar.gz

二:负载均衡
1.安装
安装一个Apache与两个Tomcat.
Apache:(/usr/apache/Apache2.2)
Tomcat:(/usr/tomcat1/apache-tomcat-7.0.59)
Tomcat:(/usr/tomcat2/apache-tomcat-7.0.59)

修改任意一个Tomcat的配置文件,比如:tomcat2.
打开/usr/tomcat2/apache-tomcat-7.0.59/conf/server.xml文件,修改3个地方.
第一:<Server port="8005",端口改为9005.
第二:<Connector port="8080",端口改为9080.
第三:<Connector port="8009",端口改为9009.

2.Apache配置文件httpd.conf最后加入include conf/mod_jk.conf.
将mod_jk.so拷贝到apache安装目录下的modules文件夹中.(mod_jk.so版本号一定要与Apache版本号对应)

3.Apache配置文件httpd.conf同目录下新建mod_jk.conf文件,内容如下:
#加载mod_jk Module
LoadModule jk_module modules/mod_jk.so
#指定workers.properties文件路径
JkWorkersFile conf/workers.properties
#指定日志存放位置
JkLogFile logs/mod_jk.log
#指定日志级别
JkLogLevel info

#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器
#如果你想对所有的请求进行分流只需要写成
#JkMount /* controller
#JkMount把匹配的转发到指定服务器.
JkMount /*.jsp controller
JkMount /servlet/* controller
JkMount /*.do controller
JkMount /*.action controller
#JkUnMount把匹配的不转发到指定服务器,JkUnMount选项的级别高于JkMount.
#单独有JkMount规则有效,但单独有JkUnMount无效,JkUnMount与JkMount要成对出现.
JkUnMount /*.gif controller
JkUnMount /*.jpg controller
JkUnMount /*.png controller
JkUnMount /*.css controller
JkUnMount /*.js controller
JkUnMount /*.htm controller
JkUnMount /*.html controller

4.Apache配置文件httpd.conf同目录下新建workers.properties文件,内容如下:
#server列表
worker.list = controller,tomcat1,tomcat2

#========tomcat1========
#此端口号是ajp13协议对应的端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.port=8009
#tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.host=192.168.1.101
#一种协议类型
worker.tomcat1.type=ajp13
#server的加权比重,值越高,分得的请求越多
worker.tomcat1.lbfactor=1

#========tomcat2========
#此端口号是ajp13协议对应的端口号,在tomcat下server.xml配置,默认8009
worker.tomcat2.port=9009
#tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.host=192.168.1.101
#一种协议类型
worker.tomcat2.type=ajp13
#server的加权比重,值越高,分得的请求越多
worker.tomcat2.lbfactor=2

#========controller负载均衡控制器========
worker.controller.type=lb
#指定分担请求的tomcat
worker.controller.balanced_workers=tomcat1,tomcat2
worker.controller.sticky_session=1

5.测试
新建一个test.jsp文件,放入test文件夹下,内容如下:

<html>
    <head>
        <title>Hello World!</title>
    </head>
    <body>
        <h1>hello World!</h1>
        <% System.out.println("==========================="); %>
    </body>
</html>


把test文件夹分别放入以下目录中:
/usr/tomcat1/apache-tomcat-7.0.59/webapps
/usr/tomcat2/apache-tomcat-7.0.59/webapps
重启Apache与两个Tomcat.

输入测试机IP,浏览查看设置是否成功.
http://192.168.1.101/test/test.jsp
http://192.168.1.101:8080/test/test.jsp
http://192.168.1.101:9080/test/test.jsp
多次刷新页面,查看Tomcat1和Tomcat2的窗口,你可以看到打印了一行行"===========================",并且从统计上来说,大约Tomcat2打印的数量是Tomcat1的两倍,可以看到请求被按照不同的权重分流处理,实现了负载均衡.

三.配置集群
只配置负载均衡还不行,还要session复制,也就是说其中任何一个tomcat添加的session,是要同步复制到其它tomcat,集群内的tomcat都有相同的session.

1.修改Tomcat1,Tomcat2,conf下的server.xml文件.
Tomcat1中的<Engine name="Catalina" defaultHost="localhost">改为<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
Tomcat2中的<Engine name="Catalina" defaultHost="localhost">改为<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
2.修改Tomcat1,Tomcat2,conf下的server.xml文件.
在<Engine></Engine>中添加如下:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

3.新建demo.jsp文件,内容如下:

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.util.*" %>
<html>
    <head>
        <title>Cluster App Test</title>
    </head>
    
    <body>
        Server Add: <% out.println(request.getLocalAddr() + "<br>"); %>
        Server Port: <% out.println(request.getLocalPort() + "<br>"); %>
        Server ID: <% out.println(session.getId() + "<br>"); %>
        
        <%
            out.print("<br><b>Session 列表</b><br>");
            // 判断是否有新的session属性设置
            String dataName = request.getParameter("dataName");
            String dataValue = request.getParameter("dataValue");
            if (dataName != null && dataName.length() > 0 && dataValue != null && dataValue.length() > 0) {
                // 设置session属性
                session.setAttribute(dataName, dataValue);
            }
            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="demo.jsp" method="POST">
            name:<input type=text size=20 name="dataName"><br>
            value:<input type=text size=20 name="dataValue"><br>
            <input type=submit value="submit">
        </form>
    </body>
</html>

4.新建WEB-INF目录,WEB-INF目录下新建web.xml文件,内容如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0"
         metadata-complete="true">
         <display-name>Welcome to Test Tomcat7 Cluster</display-name>  
         <description>Welcome to Test Tomcat7 Cluster</description>
         <distributable/>
</web-app>

5.测试
把demo.jsp与WEB-INF目录都放入demo文件夹中,复制到Tomcat1与Tomcat2的webapps下,重启Apache,Tomcat1,Tomcat2.
输入测试机IP
http://192.168.1.101/demo/demo.jsp
http://192.168.1.101:8080/demo/demo.jsp
http://192.168.1.101:9080/demo/demo.jsp
两个页面提交表单数据,可以看到Tomcat1,Tomcat2控制台里session是同步的.

四.域名绑定
1.Apache配置文件httpd.conf中,去掉Include conf/extra/httpd-vhosts.conf前面的#号.
2.Apache配置文件conf/extra/httpd-vhosts.conf,修改内容如下:

<VirtualHost *:80>
    ServerName www.xxx.com(绑定域名)
    DocumentRoot "/usr/apache/Apache2.2/htdocs/ROOT"(项目路径)
    DirectoryIndex index.jsp(首页地址)
    ErrorLog "logs/mod_jk-error.log"
    CustomLog "logs/mod_jk-access.log" common

         JkMount /* controller
         JkUnMount /*.gif controller
         JkUnMount /*.jpg controller
         JkUnMount /*.png controller
         JkUnMount /*.css controller
         JkUnMount /*.js controller
         JkUnMount /*.htm controller
         JkUnMount /*.html controller

    <Directory "/usr/apache/Apache2.2/htdocs/ROOT">
        Options Indexes FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

注:/usr/apache/Apache2.2/htdocs/ROOT路径下部署的是项目的静态资源文件.

3.Tomcat1配置文件conf/server.xml,修改内容如下:

<Host name="localhost" appBase="webapps"
      unpackWARs="true" autoDeploy="true"
      xmlValidation="false" xmlNamespaceAware="false">
    <Context path="" docBase="/usr/tomcat1/apache-tomcat-7.0.59/webapps/ROOT" debug="0" reloadable="true"/>
</Host>
<Host name="www.xxx.com" debug="0" appBase="webapps"
      unpackWARs="true" autoDeploy="true">
    <alias>www.xxx.com</alias>
    <Context path="" docBase="/usr/tomcat1/apache-tomcat-7.0.59/webapps/ROOT" debug="0" reloadable="true"/>
</Host>

注:/usr/tomcat1/apache-tomcat-7.0.59/webapps/ROOT路径下部署的是项目的动态资源文件.

4.Tomcat2配置文件conf/server.xml,修改内容如下:

<Host name="localhost" appBase="webapps"
      unpackWARs="true" autoDeploy="true"
      xmlValidation="false" xmlNamespaceAware="false">
    <Context path="" docBase="/usr/tomcat2/apache-tomcat-7.0.59/webapps/ROOT" debug="0" reloadable="true"/>
</Host>
<Host name="www.xxx.com" debug="0" appBase="webapps"
      unpackWARs="true" autoDeploy="true">
    <alias>www.xxx.com</alias>
    <Context path="" docBase="/usr/tomcat2/apache-tomcat-7.0.59/webapps/ROOT" debug="0" reloadable="true"/>
</Host>

注:/usr/tomcat2/apache-tomcat-7.0.59/webapps/ROOT路径下部署的是项目的动态资源文件.


Logo

更多推荐