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文件夹下,内容如下:
把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路径下部署的是项目的动态资源文件.
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路径下部署的是项目的动态资源文件.