您的位置:首页 > 运维架构 > Tomcat

Linux Apache集成Tomcat 动静分离与垂直集群(域名绑定)

2012-01-17 15:38 447 查看
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路径下部署的是项目的动态资源文件.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: