大型网站拓扑图
浏览器1
浏览器2 ---> 区域代理服务器1
浏览器3 地区1 web服务器集群系统 数据库集群系统
Web服务器1 数据库系统1
--->负载均衡系统--->Web服务器2--------->数据库系统2
Web服务器3 数据库系统3
浏览器1
浏览器2 ---> 区域代理服务器2
浏览器3 地区2
当一个地区内的浏览器,
都输入www.baidu.com时,
如何区分它们,使它们访问各自地区的代理服务器?
通过一台DNS服务器,
把www.baidu.com同时指向所有代理服务器ip
DNS服务器,通过程序,根据ip地址
判断浏览器属于哪个地区,
然后返回相应的代理服务器地址
我们发现下载网站上常常有
md5,pgp
这两个都是数字摘要
当下好软件资源后,再下载md5数字摘要
然后用软件去生成资源的md5,
对比两者,如果不同,说明资源被篡改过
Tomcat是一个web server, 又是一个Servlet的容器, JSP的容器
解压tomcat后统一修改文件夹名,比如
tomcat8.0.15
放到根目录下
原来如果有的, 删除整个文件夹
环境变量里新建
JRE_HOME: C:\Program Files\Java\jre1.8.0_25
启动:
进到c:/tomcate8.0.15/bin
里面有个start.bat, bat文件是windows下可执行的脚本文件
cmd下运行startup
停止:
运行shutdown
catalina.bat是实际上起作用的脚本
运行catalina start 也是启动
catalina stop 停止服务
tomcat默认的端口是8080
目录结构
bin/ 二进制可执行文件和脚本
common/ catalina本身需要的jar包和web应用可加载的类目录
有好多jar文件,比如
servlet-api.jar
conf/ 配置文件目录
logs/ 日志目录
server/ 服务器所需的类库目录,tomcat用,我们的程序不用
shared/ web app共享类库, tomcat不用我们的程序用
webapps/ web应用所存放的目录applications
work/ tomcat工作目录,放jsp产生的class文件
temp/ 临时产生的文件
配置文件:
要修改配置文件前,都做好备份
conf/server.xml
服务器主配置文件
conf/web.xml
定义所有web应用的配置,一般不用管,各个应用有自己的配置
当用tomcat跑多个web项目时,需要对各个不同web应用配置
conf/tomcat-user.xml
定义了tomcat用户信息,对安全的定义
server.xml结构
//常需要修改的地方有两个:
//1. Connector 中的port="8080", 我们可以修改默认的8080服务端口
//我们可以将它改成其他端口(8888),避免和其他web应用程序端口冲突
//随后重起服务,http://localhost:8888/ 访问tomcat主页
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
//修改端口处
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
//这里也是个修改点
<Context path="" docBase="ROOT" />
</Host>
</Engine>
</Service>
</Server>
tomcat-user.xml
//修改用户权限
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<role rolename="tomcat"/>
<role rolename="role1"/>
//再加一个角色
<role rolename="manager-gui"/>
//给tomcat用户添加manager角色
<user username="tomcat" password="tomcat" roles="tomcat,manager-gui"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
</tomcat-users>
重起服务和浏览器,打开http://localhost:8888/,
点Tomcat Manager(manager webapp), 输入用户名密码我们就可以进入管理页面
netstat -na
查看端口监听情况
看是否tomcat的8080端口被监听
还可以用telnet localhost 8080查看
net start/stop命令
端口号冲突导致tomcat无法正常服务的故障
可以用fport工具,查看哪个端口号是哪个程序占用的
安装后,执行fport就可以看了
然后修改server.xml文件配置下端口号
还可以查看tomcat日志
报错,address already in use: JVM_Bind:8080
windows里面打开tomcat的服务属性
我们可以看到,服务程序的启动,其实是运行了:
"C:\Tomcat 5.5\bin\tomcat5.exe" //RS//Tomcat5
其中参数RS就表示以windows服务方式启动
tomcat内核用java编写
tomcat5.exe只是windows的外壳程序
对jar包中的内核进行调用
"C:\Tomcat 5.5\bin\bootstrap.jar
启动时还需要java的参数
-Djava.endorsed.dirs=C:\Tomcat5.5\common\endorsed
-Djava.io.tmpdir=C:\Tomcat5.5\temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=C:\Tomcat5.5\conf\logging.properties
而调用java程序需要java虚拟机,就在
C:\jdk1.5.0_01\jre\bin\server\jvm.dl
还可设置日志目录
C:\Tomcat5.5\logs
以上这些我们都可以修改
比如调用的java内核,甚至虚拟机
windows注册表里,决定tomcat.exe指向哪个内核或虚拟机
tomcat的监控程序 Tomcat Monitor
调用了
"C:\Tomcat5.5\bin\tomcat5w.exe" //WS//Tomcat5
*****************************************************
批处理
startup.bat/startup.sh
需要编辑JAVA_HOME
如果没有配置JAVA_HOME
可以编辑startup.bat
在开头的@echo off后另起一行加入语句
set JAVA_HOME=C:\jdk1.5.0_01
批处理命令
test.bat
编辑
dir
ping localhost
需要打开cmd后运行
否则运行完就关闭
1 @echo off
如果想不在cmd中显示其中的命令
只显示执行结果
需要使用@符号
@dir
@ping localhost
当命令很多时,我们可以使用echo off在开头
表示后面的命令不显示自身在控制台
再加个@符号,也不显示它自己
@echo off
dir
ping localhost
2 if "%OS%"=="Windows_NT" setlocal
如果OS这个环境变量等于Windows_NT, 执行setlocal命令
使用help if可以调出if的语法帮助
查看当前的OS环境变量:
set OS
显示:
OS=Windows_NT
setlocal表示,在运行它之后的修改环境变量的操作,
只在本bat文件中有效,结束后恢复成原来环境变量
3 rem Guess CATALINA_NOME if not defined
rem可以当注释用
4 if not "%CATALINA_HOME%"=="" goto gotHome
检查是否存在CATALINA_HOME环境变量
goto跳转到下段gotHome标记础
8 :gotHome
gotHome代码段开始
9 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
如果该目录该文件存在
12 :okHome
13 set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
设置临时环境变量EXECUTABLE
13 echo %0 %1 %2
输出参数,0,1,2表示运行该bat文件时依次手动输入的参数
比如我们在test.bat中写:
echo %0 %1 %2
在控制台中运行
test.bat aaa bbb ccc
结果显示:
test.bat aaa bbb
%0指向了test.bat本身
这时候我们要使用shift,可以将%0移动到下一个参数位置
shift
echo %0 %1 %2
然后结果就成了
aaa bbb ccc
一共可以有%0 ~ %9
当超过10个参数的话
可以再调用一次shift
%9就指向了第11个参数
14 if ""%1""=="""" goto doneSetArgs
如果第一个参数是空, 进入doneSetArgs
直接调用catalina.bat
15 call "%EXECUTABLE%" start %CMD_LINE_ARGS%
call就是调用batch命令
这里EXECUTABLE指向了catalina.bat start 命令
并且再接上CMD_LINE_ARGS拼接出的参数
16 :setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
使用setArgs设置循环,
当%1不指向空时,执行
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
拼接参数字符串
知道%1指向了空,即参数结束
就跳出循环
startup.bat:
@echo off
set JAVA_HOME=C:\jdk1.5.0_01
setlocal
rem Guess CATALINA_HOME if not defined
set "CURRENT_DIR=%cd%"
if not "%CATALINA_HOME%" == "" goto gotHome
set "CATALINA_HOME=%CURRENT_DIR%"
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
cd ..
set "CATALINA_HOME=%cd%"
cd "%CURRENT_DIR%"
:gotHome
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
echo The CATALINA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end
:okHome
set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
rem Check that target executable exists
if exist "%EXECUTABLE%" goto okExec
echo Cannot find "%EXECUTABLE%"
echo This file is needed to run this program
goto end
:okExec
rem Get remaining unshifted command line arguments and save them in the
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
:doneSetArgs
call "%EXECUTABLE%" start %CMD_LINE_ARGS%
:end
可以看出catalina.bat才是启动tomcat的真正的批处理
真正的命令就是:
catalina.bat start/stop
catalina.bat:
1 if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"
2 if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath
3 echo Cannot find "%CATALINA_HOME%\bin\setclasspath.bat"
4 goto end
5 :okSetclasspath
6 call "%CATALINA_HOME%\bin\setclasspath.bat" %1
7 if errorlevel 1 goto end
根据setclasspath.bat的返回结果
返回1,就结束
8 set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"
调用java内核
bootstrap将调用common-logging.jar和common-daemon.jar
但这两个jar包没有被引入环境变量
之所以可以调用,是因为在bootstrap.jar的manifest文件中
定义了:
Class-Path:jmx.jar commons-daemon.jar commons-logging-api.jar tomcat-juli.jar
这样就可以自动调用这些文件了
还有Main-Class: org.apache.catalina.startup.Bootstrap
定义了执行bootstrap.jar的主方法
9 set _EXECJAVA=%_RUNJAVA%
10 set MAINCLASS=org.apache.catalina.startup.Bootstrap
11 set ACTION=start
12 if "%TITLE%" == "" set TITLE=Tomcat
set _EXECJAVA=start "%TITLE%" %_RUNJAVA%
如果参数是start,就启动,参数是stop就停止
start命令的作用:
启动一个新的窗口执行命令
命令的执行结果不会显示在原窗口
命令结束后窗口关闭
比如start ping localhost
当使用参数-t后, 命令将一直运行
start -t ping localhost
直到ctrl c结束命令
还可以添加新窗口标题名称
start "myping" -t ping localhost
所以这里命令就是
start "Tomcat" %_RUNJAVA%
就是另起一个名叫Tomcat的窗口执行命令
%_RUNJAVA%就是setclasspath.bat中定义的
"%JRE_HOME%\bin\java.exe"
所以我们可以修改catalina.bat,
把set _EXECJAVA=start "%TITLE%" %_RUNJAVA%修改为
set _EXECJAVA=%_RUNJAVA%
(注意有Windows系统和非Windows系统两段)
这样双击startup.bat后就不会窗口消失了
setclasspath.bat:
set "JAVA_ENDORSED_DIRS=%CATALINA_HOME%\endorsed"
set _RUNJDB="%JAVA_HOME%\bin\jdb.exe"
set _RUNJAVA="%JRE_HOME%\bin\java.exe"
有两种退出方式,分别返回1,0
之后调用setclasspath.bat后,
根据返回值判断是否调用成功
1是error,0是成功
:exit
exit /b 1
:end
exit /b 0
***********************************************
配置web站点的虚拟目录
虚拟目录
URL中的比如http://www.baidu.com/book/test.html
如何对应到站点的文件系统?
如果book不是站点服务器根目录下的对应的book目录,
那么这个book就是个web的虚拟目录
一个web站点必须有且只有一个虚拟根目录
默认tomcathome/webapps/ROOT就是站点的虚拟根目录
如果下面存放一个test.html
就可以用http://localhost:8080/test.html访问
我们新建/ROOT/book目录
里面存放test.html
那么使用http://localhost:8080/book/test.html访问
我们也可以把http://localhost:8080/映射到其他目录
替代ROOT目录
然后我们也可以在这个目录下,建立其他虚拟子目录
映射到文件系统的其他目录
一个文件系统目录,可以被映射成为多个虚拟Web目录
虚拟子目录名称可以是多极目录的结构形式
比如我们把根目录http://localhost:8080/映射在D:\test\
把根目录下的虚拟目录\myweb\book\test\映射到D:\test\web\
那么如果有D:\test\web\test.html文件
访问时就是:
http://localhost:8080/myweb/book/test/test.html
同时,D:\test\web\也可以被映射到其他虚拟子目录
比如\myweb2\
那么理论上,我们访问D:\test\web\test.html文件的URL也可以是
http://localhost:8080/myweb2/test.html
Tomcat按照最长路经匹配原则处理请求的URL
客户端请求某个路经资源时,
先取出路径中最长子目录的名称
看是否对应到了某个虚拟子目录上
否则就寻找上一级的虚拟子目录是否有映射
直到根目录为止
设置web站点根目录
server.xml文件中指定
1 <Host>元素的appBase属性所设置的应用程序基准目录中的ROOT子目录
自动选择\webapps\ROOT为根目录
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
2 使用server.xml文件中的<Context>元素
放在<Host></Host>里面
<Context path="" docBase="D:\test" debug="0"/>
将本地文件目录映射某个虚拟目录
path,虚拟目录,
空表示虚拟根目录
docBase, 本地目录,
可以绝对路径也可以相对路径,相对appBase目录
一个<Host>元素代表一个站点
一个<Context>表示一个虚拟目录
其实在Tomcat4的版本中,就可以看见这样的配置
<Context path="" docBase="ROOT" debug="0"/>
设置Web站点的虚拟子目录
1 使用server.xml中的<Context>
<Context path="/baidu" docBase="D:\myweb" debug="0"/>
2 特定目录中的xml文件中包含<Context>元素
Tomcat4的<Tomcat主目录>/webapps目录
比如建立一个admin.xml文件
Tomcat会自动读取它
如果它里面写了<Context>元素,
就可以用来做虚拟目录映射
Tomcat5的<Tomcat主目录>/conf/<引擎名>/<主机名>
C:\tomcat7.0.63\conf\Catalina\localhost
比如有个manager.xml文件
里面也写了<Context><ResourceLink>
3 server.xml的<Host>的appBase属性
所设置的应用程序基准目录中含有
WEB-INF/webl.xml文件的子目录
这些子目录就是我们平时放进去的项目
它们会自动被映射成虚拟目录
4 server.xml的<Host>的appBase属性
所设置的应用程序基准目录中的war文件
案例1
把C:\javaweb\lesson2映射成虚拟子目录
里面有test.html文件
打开server.xml
找到Host
增加Context子元素
<Context path="/it315" docBase="C:\javaweb\lesson2" />
重起tomcat
访问
http://localhost:8080/it315/test.html
<Context path="/xxx/yyy" docBase="C:\javaweb\lesson2" />
重起tomcat
访问
http://localhost:8080/xxx/yyy/test.html
两个链接可以同时访问到test.html资源
再加上如果再这样配置
<Context path="" docBase="C:\javaweb\lesson2" />
把根目录也映射到C:\javaweb\lesson2
重起tomcat
访问
http://localhost:8080/test.html
如果我们再添加目录C:\javaweb\lesson2\it315
加入test.html
访问路径:
http://localhost:8080/it315/test.html
那么这时候到底访问的是哪里的文件?
访问的是C:\javaweb\lesson2\test.html
还是C:\javaweb\lesson2\it315\test.html
这时候就要按照最长URL路径原则查找
这里最长的路径是/it315/
看它是否有对应关系
找到<Context path="/it315" docBase="C:\javaweb\lesson2" />
表示找到的是C:\javaweb\lesson2\test.html
案例2
指向一个war文件
把C:\javaweb\lesson2目录下所有内容打包到war文件
cd C:\javaweb\lesson2
jar -cvf mywar.war . (.表示当前目录下所哟内容)
生成了mywar.war
里面包含了test.html, 以及it315/test.html
注意不能在lesson2外面使用打包命令
否则会包含lesson2目录
或者使用jar -cvf mywar.war -C lesson2 .
-C表示打包的是lesson2目录,而不是当前的C:\javaweb目录
<Context path="/xxx/yyy" docBase="C:\javaweb\lesson2\mywar.war" />
这样就把虚拟目录指向了war文件
http://localhost:8080/xxx/yyy/test.html
http://localhost:8080/xxx/yyy/it315/test.html
案例3
复制C:\javaweb\lesson2到webapps目录下
(先删除里面的mywar.war文件)
访问
http://localhost:8080/lesson2/test.html
显示找不到
因为没有包含WEB-INF目录(可以没有web.xml)
我们手动添加它
就可以访问了
我们还可以直接把mywar.war文件
移动到webapps目录下
然后Tomcat会自动解压war文件在webapps下进行部署
这时候也能访问到解压后的资源
哪怕里面没有WEB-INF
这是实际工作中惯用手段
******************************************
部署描述符与目录的默认网页
部署描述符文件
/WEB-INF/web.xml
Tomcat有自己的web.xml文件
在/conf目录下
它对所有的web应用起作用
之前只创建WEB-INF而不用web.xml就可以部署成功
原因就是有这个默认web.xml
目录的默认网页文件
当url指向一个目录名,而不是文件名
会访问到什么资源?
http://localhost:8080/it315
找不到资源
我们发现在该项目中存在web.xml
但web.xml配置并不正确导致错误
这时候我们先删除它
那么就会使用Tomcat默认的/conf/web.xml
然后我们就可以访问到http://localhost:8080/it315
并且画面显示了it315目录下的所有子目录和文件
我们可以配置web.xml可以让url中的目录指向一个默认首页
<web-app>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>test.html</welcome-file>
</welcome-file-list>
</web-app>
里面可以定义多个默认的页面文件
这些文件存放在web应用的根目录
当你的项目中存在自己的web.xml的时候
它将代替tomcat的/conf/web.xml,
/conf/web.xml将失效,被覆盖
******************************************
配置虚拟主机
1 浏览器访问web资源的过程
URL
利用telnet连接web服务器
telnet localhost 8080
ctrl ] 打开本地回显功能(是否显示输入内容)
或者先用命令telnet
help 打开帮助
set ? 查询set的用法
看到localecho命令就是打开本地回显
执行set localecho, 打开本地回显
display 显示telnet参数状态
quit 退出
再连接web服务器
telnet localhost 8080
GET /it315/test.html HTTP/1.1
Host:
回车
访问到网页内容
它会按照发送出去的头字段,把网页内容返回到浏览器
Host为空表示访问主机默认的localhost
2 虚拟主机实现原理
目的就是在一台计算机上创建多个web站点
每个web站点设置不同的主目录和虚拟子目录
每个web站点作为各自独立的网站分配给不同公司或部门
多个公司或部门网站可以共用一台计算机
而用户感觉每个公司和部门都有各自独立的网站
多个没有实力在internet上架设自己专用服务器中小公司
可以联合租用一台web服务器,对外提供各自web站点互不影响
原理
web服务器上每个web站点必须设置不同的标识信息
web浏览器发出的连接和请求信息中包含web站点的标识信息
web站点标识信息
ip, 端口, 主机名
3 基于主机名的虚拟主机
当URL是http://www.it315.org/
就可以被解析为:
GET / HTTP/1.1
Host: www.it315.org
server.xml中
在TomcatEngine里面,配置了各个站点的信息
Engine是一个处理客户端请求的引擎
它接受tomcat连接器传递过来的访问请求
处理后将结果返回给连接器
可以包含多个Host元素
一个引擎可以管理多个站点
appBase指定各个站点的基准目录
Host中还可以配置站点的虚拟目录映射
<Context>中的相对路径也是相对于appBase而言的
引擎接收到访问请求头字段信息后,
会比较头字段中的Host信息和Engine中的所有站点的name
选择匹配的web站点进行响应
Engine的defaultHost是设置默认站点
和下面某个<Host>对应
如果访问请求的URL没有匹配任何一个<Host>
Engine就选择默认站点进行处理
<Engine name="Catalina" defaultHost="localhost">
<Host name="www.it315.org" appBase="webapps"...>
<Context ...>
</Host>
<Host name="localhost" appBase="webapps"...>
</Host>
......
</Engine>
有时候url如果是ip的话,
根本无法区别出到底是访问哪个站点
ip都是各个<Host>共享的
只有主机名可以被区分出来
web浏览器要访问基于主机名的虚拟主机时,
URL中必须采用主机名,而不能采用IP地址
在整个网络系统中建立主机名与IP地址的映射关系
必须将主机名添加到DNS系统
使用本地hosts文件
使用DNS服务器
案例,tomcat建立基于主机名的虚拟站点
C:/javaweb/lesson2下面建立两个子目录
VirtualHost1/ROOT
VirtualHost2/ROOT
把test.html放入其中
ROOT下必须建立WEB-INF目录,才会被tomcat自动部署
配置server.xml
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"...>
</Host>
......
<Host name="www.it315.org" appBase="C:\javaweb\lesson2\VirtualHost1"
unpackWARs="true" autoDeploy="true">
</Host>
<Host name="www.it315.cn" appBase="C:\javaweb\lesson2\VirtualHost2"
unpackWARs="true" autoDeploy="true">
</Host>
</Engine>
启动tomcat
tomcat会自动部署两个基准目录下的ROOT文件夹
telnet localhost 8080
GET /test.html HTTP/1.1
Host: www.it315.org
GET /test.html HTTP/1.1
Host: www.it315.cn
访问都成功,访问到各自下面的test.html
当我们发送任意未定义的主机名
GET /test.html HTTP/1.1
Host: www.xxx.yyy
返回的就是默认的localhost对应的资源文件
webapps/ROOT/test.html
这时候浏览器还不知道www.it315.org等对应的ip
所以还不能用http://www.it315.org/test.html访问
我们要么配置hosts文件
要么配置一个dns
然后用http://www.it315.org:8080/test.html访问
4 基于端口号的虚拟主机
server.xml中,
一个<Connector>元素用于配置一个对外的连接器
对于web服务器上的每一个监听端口号,
都要用一个单独的Connector元素
一个Connector元素对应的连接器必须有一个相关的Engine元素
将一个或多个Connector与Engine相关联的方式就是
嵌套在同一个Service元素中
<Sercice name="...">
<Connector port="...".../>
<Connector port="...".../>
。。。
<Engine name="...">
<Host name="">
<Context ...>
</Context>
</Host>
</Engine>
</Service>
一个Service里面可以有多个监听的端口
但不可以有相同的port值
例如:
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
这里是Tomcat针对HTTP的监听端口
<Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- 当使用Tomcat线程池时,使用这个监听
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
这是针对HTTPS的监听端口
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
这是接受JK插件的监听端口
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
所有上面监听到的请求都用这个Engine来处理
<Engine name="Catalina" defaultHost="localhost">
。。。
</Engine>
</Service>
</Server>
我们也可以建立自己的Service元素
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
。。。
</Service>
<Service name="Second_Service">
<Connector executor="tomcatThreadPool"
port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
配置引擎
<Engine name="Catalina" defaultHost="www.it315.org">
<Host name="www.it315.org" appBase="C:\javaweb\lesson2\VirtualHost1"
unpackWARs="true" autoDeploy="true">
</Host>
<Host name="www.it315.cn" appBase="C:\javaweb\lesson2\VirtualHost2"
unpackWARs="true" autoDeploy="true">
</Host>
</Engine>
</Service>
</Server>
然后就可以访问
http://www.it315.org/test.html
http://www.it315.org:80/test.html
80端口是默认的网页访问端口,可以省略
同时,我们也可以访问之前的
http://www.it315.org:8080/test.html
我们就可以让80端口指向一个资源
而让8080端口指向另一个资源
就实现了,同一个主机名不同端口指向不同站点
5 基于IP的虚拟主机
HTTP1.0不支持Host头字段,
所以在保证所有站点统一使用端口号80的情况下
人们早期只能采用不同的IP来建立虚拟主机
就需要给每个站点分配独立的ip,
但internet的ip资源是有限的,所以这么做不太好
HTTP1.1可以用不同的主机名来建立多个web站点后,
虚拟主机业务提供商一般不再建立基于ip的虚拟主机
Tomcat也没有提供基于ip的虚拟主机方式
演示在windows上设置多个ip, 为一个网卡绑定多个ip
网络链接设置,本地链接
TCP/IP属性
高级
就可以添加多个ip
子网掩码255.255.255.0
然后可以使用其中任意一个ip访问计算机
******************************************
Tomcat与其他专用Web服务器的集成
虽然tomcat也可以作为独立的web服务器
但它处理静态xml的速度比不上apache ,IIS这样的专业服务器
功能也不如它们强大
如果一个web站点要支持servlet,jsp
又要有较高的速度处理html静态页面,
更多的web站点功能,
就要将它与这些web服务器集成
由其他web服务器专门处理站点服务相关的内容
而tomcat用于处理Servlet,JSP相关的内容
集成的考虑因素
是否要集成要视具体情况
访问apache网站查看集成因素
Tomcat FQA网页中,找到Connector部分
告诉我们在什么情况下集成/不集成Apache
1 集群,客户端请求先到Apache集群,
再由它们均衡分派给tomcat
如果tomcat自己部属了负载均衡,
那这里可能不考虑集成了
2 集群/安全
让Apache集群在tomcat前端
根据不同请求分派给不同的tomcat
Tomcat出于web服务器后端,受保护,
用户不能直接访问
系统管理员直需要考虑前端集群
3 安全
专业web服务器有更多处理安全的技巧
4 附加功能
集成后,可以在网站中部署CGIpool,ASP,PHP
等各种程序语言的支持
5 特殊功能
补充tomcat不支持的功能
6 速度
处理网页静态内容时,可能比单纯tomcat快些
7 socket处理/系统稳定性
tomcat底层是由JVM来执行socket
需要跨越底层操作系统平台
java代码在大多情况下运行很好,
但服务器接受到来自无效ip发出的半连接,
非法数据操作等攻击时,tomcat做得没有其他好
集成技术的选择
访问tomcat FAQ
选择哪个connector?
mod_jserv, JK, JK2, mod_webapp, mod_proxy
mod_webapp,已经过时
mod_jserv,不再支持和使用
使用AJP协议,对HTTP优化
就是tomcat和其他web服务器间通信协议
JK,目前首选技术
JK2,目前不支持,曾经比JK更新,
但配置太复杂,开发人员不感兴趣,停止开发
mod_proxy,简单配置但不能实现由会话状态的负载均衡
mod_proxy_ajp, 只能在Apache2.2版本中使用
*****************************************************
JK插件
IIS和Apache等都支持插件技术
可以将符合某个条件的请求交给插件处理
它们能和tomcat集成的关键原理就是这种插件技术
URL访问请求交给JK插件
它再转交给tomcat处理
如果在为JK插件预先配置好的URL映射信息中,
所有"/*.jsp"形式的URL都由tomcat服务器来处理
那么当用户请求访问"/index.jsp"时,
web服务器将调用JK插件来处理
JK插件又把这个请求转发给tomcat服务器处理
tomcat服务器最后将响应结果经JK插件传给WEB服务器
tomcat开发小组为不同的web服务器提供不同的JK插件
不同版本tomcat与其它web服务器各个版本集成时JK插件也不同
下载JK插件
一般倾向最新版本,如果不行,选择旧版本
视频里面用jk-1.2.14版本
具体是:
isapi_redirect-1.2.14.exe(安装版,集成IIS)
mod_jk-1.2.14-apache-2.0.54.so (集成Apache,复制到moudles目录)
apache的版本是:apache-2.0.54
安转文件是:
apache_2.0.55-win32-x86-no_ssl.msi
(现在最新的是
JK:
tomcat-connectors-1.2.41-src.tar.gz
tomcat-connectors-1.2.41-src.zip
apache:
httpd-2.4.17.tar.gz
httpd-2.2.31.tar.gz
httpd-2.2.31-win32-src.zip)
JK插件的工作原理
需要解决的问题:
1 web服务器中正确安装JK插件
2 JK需要知道把请求转发给哪个Tomcat服务器上的哪个连接器
也就是需要知道该连接器的通信协议和地址
3 JK需要知道它负责处理的URL,以便通知web服务器,
把这些URL转交给它处理
另外一个JK插件可以向多个Tomcat服务器转发请求
它需要知道哪些URL应转发给哪个Tomcat服务器
4 JK本身的一些配置信息,例如记录日志的文件路径,
记录日志的级别等信息,
如果上面2,3点问题都在各自的一个属性文件中设置,
那么还需要告诉这两个属性文件的位置路径
配置和工作图
(isapi_redirect.properties)
worker_file=
worker_mount_file= -----------------
| |
| |
(uriworkermap.properties) (workers.properties)
/*.jsp=worker1 worker.list=worker1
| ----> worker.worker1.type=...
| worker.worker1.host=...
| worker.worker1.port=...
| |
| |
Client --> Web Server --> JK Plugin --> Tomcat
<-- <-- <--
JK安装步骤
1,安装isapi_redirect-1.2.14.exe
装在C:\JK\
2 C:\JK\conf下有两个配置文件
uriworkermap.properties
告诉JK哪些url请求需要转分发到哪台tomcat
/*.jsp=worker1
/myweb/*=worker1
/jsp-examples/*=worker2
workers.properties
告诉JK,如何联系Tomcat
里面设置了每一个与JK连接的Tomcat的属性
一个tomcat就是一个worker
worker.list=worker1,worker2
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker2.type=ajp13
worker.worker2.host=192.168.0.3
worker.worker2.port=8009
也可以如下设置
list指向了一套负载均衡的tomcat系统
wlb是这套系统的名称
其中ajp13w是这套系统中负责负载均衡的服务器
lb是负载均衡的意思
当设置为lb的时候,
不是指某一台tomcat
指一套实现了lb的虚拟的tomcat服务系统
没有host,port而需要设置balance_workers
它指向了这个负载均衡服务器ajp13w
worker.list=wlb
worker.ajp13w.type=ajp13
worker.ajp13w.host=localhost
worker.ajp13w.port=8009
worker.wlb.type=lb
worker.wlb.balance_workers=ajp13w
在线查阅JK帮助文档
在Apache/IIS中分别如何配置
**********************************************************
Tomcat体系结构
Server
Service
client <--HTTP--> Connector -> Engine
Host
client <--HTTP--> Connector -> Context
Context
JK连接程序 <-AJP协议-> Connector -> Host
Context
其他连接程序 <-其他协议-> Connector -> Context
这种设计方式是非常灵活的
以后如果要集成新的连接程序,用于不同协议
只需要开发新的连接器Connector
然后和引擎关联就可以了
做到即插即用效果
Tomcat与IIS服务器集成
如果两者在同一个服务器,保证其没有端口冲突
1 安装IIS
控制面板中添加Windows组件
打开IIS管理程序
查看默认网站属性
默认端口80
根目录映射到了C:\inetpub\wwwroot目录
ISAPI筛选器中要添加JK
筛选器可以添加在各个站点,
也可以直接添加在网站,对所有站点起作用
还有一个文档选项卡
类似tomcat在web.xml中配置默认网页index.html等
IIS中创建虚拟子目录
右键某个站点,新建虚拟目录
按照向导操作,把虚拟目录xxx映射到本地目录C:\myweb\lesson2
然后在网站中就多了新的虚拟站点
http://localhost:80/xxx/test.html
就可以访问了
还有一种更简单的方式
右键lesson2目录,属性-web共享
选择共享位置和虚拟目录,就可以了
还可以映射多个虚拟目录
2 配置Tomcat和JK插件
启动tomcat
80端口已经被使用错误
因为刚才我们配置了一个端口是80的<Service>
我们删除这段,重起tomcat
把JK插件安装为一个ISAPI筛选器
注意将JK插件所在目录设置为
某个站点下的一个具有执行许可权县的虚拟目录
就是将动态链接库文件isapi_redirect.dll所在目录
C:\JK\bin共享成虚拟子目录
并且权限为"执行"
其实当我们安装了JK后,
自动会将该目录在IIS中映射成虚拟子目录
虚拟目录名称为jakarta
现在我们就在ISAPI筛选器对话框内
添加筛选器jakarta
可执行文件就是JK插件的dll文件isapi_redirect.dll
重启IIS
编写JK的配置文件,C:\JK\conf\
workers.properties
设置JK所要连接的tomcat,这里我们连接一台tomcat
就是worker1
协议是ajp13,监听8009端口,tomcat的ip地址
worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
uriworkermap.properties
哪些url分派给JK,而JK又把url分配给哪个tomcat
#根目录下所有jsp交给work1处理
/*.jsp=worker1
#以下所有资源都交给worker1
/admin/*=worker1
/manager/*=worker1
/jsp-examples/*=worker1
/servlets-examples/*=worker1
设置JK插件的属性
可以在属性文件中配置
必须存放在isapi_redirect.dll文件同目录C:\JK\bin
文件名必须是:
isapi_redirect.properties
#JK插件在IIS服务器中虚拟路径,应和IIS中创建的虚拟目录一致
exension_uri=/jakarta/asapi_redirect.dll
#JK插件生成的日志文件的完整路径
log_file=C:\JK\log\isapi_redirect.log
#日志级别,有效值为debug,info,warn,error,trace
log_level=debug
#workers.properties文件的完整路径
worker_file=C:\JK\conf\workers.properties
#uriworkermap.properties文件的完整路径
worker_mount_file=C:\JK\conf\uriworkermap.properties
(还可以在Windows注册表中设置
写一个isapi_redirect.req文件,双击注册)
3 测试Tomcat和IIS集成是否成功
重起IIS,访问
http://localhost/index.jsp
这时候发现tomcat首页网页可以显示
但是图片都不能显示
发现图片地址http://localhost/tomcat.gif
由于访问流程是:
对于jsp的请求,
请求先到IIS, IIS转发给JK,JK再转发给Tomcat
这样就定位到了Tomcat的根路径,找到了Tomcat的index.jsp
但对于图像文件,img的src每个都是一个请求
这时的请求的资源后缀是gif,
所以请求只到IIS, 而不会由JK转发给Tomcat
这时候访问的是IIS的根路径C:\inetpub\wwwroot
就无法显示图片了
这时,如果在配置文件中把图片后缀的请求教给Tomcat
那样又会造成在IIS根目录下的图片请求,转发到了Tomcat
所以推荐的作法是,把Tomcat下的资源,
都存放在某个虚拟子目录下
使用/xxx/*=worker1的方式配置,
而不是使用文件后缀的方式配置
就不会和IIS本身资源冲突
最后的问题是,既然Tomcat只是和IIS集成
它不对外提供web站点服务,
那么我们在server.xml文件中,
可以把<Conector port="8080"...>这个连接器注释掉呢?
答案是可以的,并且最好就是注释掉
这样外网就无法通过http协议访问tomcat了,
只能访问IIS, 由IIS转发特定资源给Tomcat
Tomcat与Apache服务器集成
下载和安装Apache服务器
下载和安装JK插件
将下载的mod_jk-1.2.14-apache-2.0.54.so文件
改名为mod_jk.so后
复制到<apache_home>\modules目录中
设置配置信息
Apache的<apache_home>\conf\httpd.conf中
测试是否成功
httpd.conf配置如下:
方式一,
#加载JK插件模块
LoadModule jk_module modules/mod_jk.so
#配置Tomcat服务器的信息
JkWorkerProperty worker.list=worker1
JkWorkerProperty worker.worker1.port=8009
JkWorkerProperty worker.worker1.host=localhost
JkWorkerProperty worker.worker1.type=ajp13
#指定生成JK插件的日志文件目录
JkLogFile logs/mod_jk.log
#指定JK插件的日志文件级别
JkLogLevel debug
#设置JK插件的路径映射信息
JkMount /*.jsp=worker1
JkMount /myweb/*=worker1
方式二,
引用JK插件的配置文件
其中的相对路径,是相对于该文件中一个server_root的配置而言的
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMountFile conf/uriworkermap.properties
方式三,
参考下面win7下的apache+tomcat+jk负载均衡
*****************************************************
win7下的apache+tomcat+jk负载均衡
http://www.tuicool.com/articles/BbUJFz
apache http server:httpd-2.2.25-win32-x86-no_ssl.msi
tomcat:apache-tomcat-6.0.14.zip
jk:mod_jk-1.2.31-httpd-2.2.3.so
目标:
1、Apache 做为 HttpServer ,后面连接多个tomcat 应用实例,并进行负载均衡。
2、为系统设定 Session 超时时间,包括 Apache 和 tomcat
3、为系统屏蔽文件列表,包括 Apache 和 tomcat
注:本例程以一台机器为例子,即同一台机器上装一个apache 和2个Tomcat。
4、尝试共享cache (未果)
安装
把apache 解压到“D:\”下,
tomcat解压到“D:\学习\负载均衡\apache-tomcat-6.0.14a”
和“D:\学习\负载均衡\apache-tomcat-6.0.14b”。
经过我亲自的实践,apache 的安装路径中不能有中文!
不然会出问题的,不过tomcat的安装路径中可以带有中文的。
最后把mod_jk-1.2.31-httpd-2.2.3.so
放到apache目录下的module目录中。安装完成!
配置apache
1. windows 下的主要配置文件就在“安装目录/conf/httpd.conf ”。
在 %apache_home%\conf\httpd.conf 的最后面添加
# module mod_jk config file
Include conf/extra/mod_jk.conf
因为我是使用的jk 来配置负载均衡的,所以这么多就够了,然后,
2. 在%apache_home%\conf\extra\ 目录下新建文件:mod_jk.conf,
内容如下
#load module mod_jk-1.2.31-httpd-2.2.3.so is for Apache 2.2.x.
LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so
# 配置 mod_jk conf
# 加载集群中的workers
JkWorkersFile conf/workers.properties
# 加载workers的请求处理分配文件
JkMountFile conf/uriworkermap.properties
# 指定jk的日志输出文件
JkLogFile logs/mod_jk.log
# 指定日志级别
JkLogLevel info
3. 在%apache_home%\conf\ 目录下新建文件:workers.properties,
内容如下:
# worker 列表
worker.list=LB_worker,jkstatus
# 第一个worker的配置,名为worker_1
#tomcat 的主机地址,如不为本机,请填写ip地址
worker.worker_1.host=localhost
#ajp13 端口号,对应tomcat配置文件server.xml中Connector port="8009",默认8009
worker.worker_1.port=8009
worker.worker_1.type=ajp13
# 负载的权重值,越高表示负载越大
worker.worker_1.lbfactor=1
# 第二个worker的配置,名为worker_2
worker.worker_2.host=localhost
#ajp13 端口号,对应tomcat配置文件server.xml中Connector port="9009"
worker.worker_2.port=9009
worker.worker_2.type=ajp13
worker.worker_2.lbfactor=1
#LB_worker, 用于负载均衡分发的控制器
worker.LB_worker.type=lb
# 重试次数
worker.LB_worker.retries=3
# 指定负载的worker列表,用逗号分隔
worker.LB_worker.balance_workers=worker_1,worker_2
# 配置session会话是否为粘性
# 这样负载均衡器lb就会尽量保持一个session,
# 也就是使用户在一次会话中跟同一个Tomcat进行交互
worker.LB_worker.sticky_session=true
# 如果sticky_session设为true时,此处一般设为false
worker.LB_worker.sticky_session_force=false
# 设置运行状态的控制器
worker.jkstatus.type=status
4. 在%apache_home%\conf\ 目录下新建文件:uriworkermap.properties,内容如下
# 所有请求都由LB_worker 这个worker处理
/*=LB_worker
# 所有包含jkstatus请求的都由名称叫jkstatus的这个worker处理
/jkstatus=jkstatus
好了,apache 这边已经设置好了,再把tomcat设置好,
就能用apache访问tomcat啦。
配置Tomcat
其中要进行两个tomcat 的分别设置,
并且和workers.properties里面的对应的内容相匹配
其实tomcat 并不用怎么配置,就是两点,
第一,保证tomcat的端口之间互不冲突(需要修改三个地方);
第二,保证tomcat的Connector端口和
apache的worker.property配置文件中一致
(默认是8009的那个)。
准备jsp
分别在两个tomcat 的webapps下面写了两个小jsp文件
这个jsp 放到webapps/Root下面就好了。
<%
System.out.println("this is tomcat server worker_1");
%>
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+" < br > this is tomcat server worker_2");
%>
另一个是worker_2
测试负载均衡
启动tomcat :点击一号tomcat的安装目录下的bin中的startup.bat
点击二号tomcat 的安装目录下的bin中的startup.bat
看到两个tomcat 占用的端口号都是不一样的~~~
启动apache :运行这个ApacheMonitor.exe就好啦
在浏览器里面输入
http://localhost/hello.jsp 同时刷新浏览器
就会重复的出现:
一个是
null:80
this is tomcat server worker_1
另一个是
null:80
this is tomcat server worker_2
成功均分了请求到两个tomcat
共享session
很简单,在 worker 配置文件中这样改一下:
# 这样负载均衡器 lb 就会尽量保持一个 session ,
也就是使用户在一次会话中跟同一个 Tomcat 进行交互
worker.LB_worker.sticky_session = false
浏览器1
浏览器2 ---> 区域代理服务器1
浏览器3 地区1 web服务器集群系统 数据库集群系统
Web服务器1 数据库系统1
--->负载均衡系统--->Web服务器2--------->数据库系统2
Web服务器3 数据库系统3
浏览器1
浏览器2 ---> 区域代理服务器2
浏览器3 地区2
当一个地区内的浏览器,
都输入www.baidu.com时,
如何区分它们,使它们访问各自地区的代理服务器?
通过一台DNS服务器,
把www.baidu.com同时指向所有代理服务器ip
DNS服务器,通过程序,根据ip地址
判断浏览器属于哪个地区,
然后返回相应的代理服务器地址
我们发现下载网站上常常有
md5,pgp
这两个都是数字摘要
当下好软件资源后,再下载md5数字摘要
然后用软件去生成资源的md5,
对比两者,如果不同,说明资源被篡改过
Tomcat是一个web server, 又是一个Servlet的容器, JSP的容器
解压tomcat后统一修改文件夹名,比如
tomcat8.0.15
放到根目录下
原来如果有的, 删除整个文件夹
环境变量里新建
JRE_HOME: C:\Program Files\Java\jre1.8.0_25
启动:
进到c:/tomcate8.0.15/bin
里面有个start.bat, bat文件是windows下可执行的脚本文件
cmd下运行startup
停止:
运行shutdown
catalina.bat是实际上起作用的脚本
运行catalina start 也是启动
catalina stop 停止服务
tomcat默认的端口是8080
目录结构
bin/ 二进制可执行文件和脚本
common/ catalina本身需要的jar包和web应用可加载的类目录
有好多jar文件,比如
servlet-api.jar
conf/ 配置文件目录
logs/ 日志目录
server/ 服务器所需的类库目录,tomcat用,我们的程序不用
shared/ web app共享类库, tomcat不用我们的程序用
webapps/ web应用所存放的目录applications
work/ tomcat工作目录,放jsp产生的class文件
temp/ 临时产生的文件
配置文件:
要修改配置文件前,都做好备份
conf/server.xml
服务器主配置文件
conf/web.xml
定义所有web应用的配置,一般不用管,各个应用有自己的配置
当用tomcat跑多个web项目时,需要对各个不同web应用配置
conf/tomcat-user.xml
定义了tomcat用户信息,对安全的定义
server.xml结构
//常需要修改的地方有两个:
//1. Connector 中的port="8080", 我们可以修改默认的8080服务端口
//我们可以将它改成其他端口(8888),避免和其他web应用程序端口冲突
//随后重起服务,http://localhost:8888/ 访问tomcat主页
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
//修改端口处
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
//这里也是个修改点
<Context path="" docBase="ROOT" />
</Host>
</Engine>
</Service>
</Server>
tomcat-user.xml
//修改用户权限
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<role rolename="tomcat"/>
<role rolename="role1"/>
//再加一个角色
<role rolename="manager-gui"/>
//给tomcat用户添加manager角色
<user username="tomcat" password="tomcat" roles="tomcat,manager-gui"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
</tomcat-users>
重起服务和浏览器,打开http://localhost:8888/,
点Tomcat Manager(manager webapp), 输入用户名密码我们就可以进入管理页面
netstat -na
查看端口监听情况
看是否tomcat的8080端口被监听
还可以用telnet localhost 8080查看
net start/stop命令
端口号冲突导致tomcat无法正常服务的故障
可以用fport工具,查看哪个端口号是哪个程序占用的
安装后,执行fport就可以看了
然后修改server.xml文件配置下端口号
还可以查看tomcat日志
报错,address already in use: JVM_Bind:8080
windows里面打开tomcat的服务属性
我们可以看到,服务程序的启动,其实是运行了:
"C:\Tomcat 5.5\bin\tomcat5.exe" //RS//Tomcat5
其中参数RS就表示以windows服务方式启动
tomcat内核用java编写
tomcat5.exe只是windows的外壳程序
对jar包中的内核进行调用
"C:\Tomcat 5.5\bin\bootstrap.jar
启动时还需要java的参数
-Djava.endorsed.dirs=C:\Tomcat5.5\common\endorsed
-Djava.io.tmpdir=C:\Tomcat5.5\temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=C:\Tomcat5.5\conf\logging.properties
而调用java程序需要java虚拟机,就在
C:\jdk1.5.0_01\jre\bin\server\jvm.dl
还可设置日志目录
C:\Tomcat5.5\logs
以上这些我们都可以修改
比如调用的java内核,甚至虚拟机
windows注册表里,决定tomcat.exe指向哪个内核或虚拟机
tomcat的监控程序 Tomcat Monitor
调用了
"C:\Tomcat5.5\bin\tomcat5w.exe" //WS//Tomcat5
*****************************************************
批处理
startup.bat/startup.sh
需要编辑JAVA_HOME
如果没有配置JAVA_HOME
可以编辑startup.bat
在开头的@echo off后另起一行加入语句
set JAVA_HOME=C:\jdk1.5.0_01
批处理命令
test.bat
编辑
dir
ping localhost
需要打开cmd后运行
否则运行完就关闭
1 @echo off
如果想不在cmd中显示其中的命令
只显示执行结果
需要使用@符号
@dir
@ping localhost
当命令很多时,我们可以使用echo off在开头
表示后面的命令不显示自身在控制台
再加个@符号,也不显示它自己
@echo off
dir
ping localhost
2 if "%OS%"=="Windows_NT" setlocal
如果OS这个环境变量等于Windows_NT, 执行setlocal命令
使用help if可以调出if的语法帮助
查看当前的OS环境变量:
set OS
显示:
OS=Windows_NT
setlocal表示,在运行它之后的修改环境变量的操作,
只在本bat文件中有效,结束后恢复成原来环境变量
3 rem Guess CATALINA_NOME if not defined
rem可以当注释用
4 if not "%CATALINA_HOME%"=="" goto gotHome
检查是否存在CATALINA_HOME环境变量
goto跳转到下段gotHome标记础
8 :gotHome
gotHome代码段开始
9 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
如果该目录该文件存在
12 :okHome
13 set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
设置临时环境变量EXECUTABLE
13 echo %0 %1 %2
输出参数,0,1,2表示运行该bat文件时依次手动输入的参数
比如我们在test.bat中写:
echo %0 %1 %2
在控制台中运行
test.bat aaa bbb ccc
结果显示:
test.bat aaa bbb
%0指向了test.bat本身
这时候我们要使用shift,可以将%0移动到下一个参数位置
shift
echo %0 %1 %2
然后结果就成了
aaa bbb ccc
一共可以有%0 ~ %9
当超过10个参数的话
可以再调用一次shift
%9就指向了第11个参数
14 if ""%1""=="""" goto doneSetArgs
如果第一个参数是空, 进入doneSetArgs
直接调用catalina.bat
15 call "%EXECUTABLE%" start %CMD_LINE_ARGS%
call就是调用batch命令
这里EXECUTABLE指向了catalina.bat start 命令
并且再接上CMD_LINE_ARGS拼接出的参数
16 :setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
使用setArgs设置循环,
当%1不指向空时,执行
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
拼接参数字符串
知道%1指向了空,即参数结束
就跳出循环
startup.bat:
@echo off
set JAVA_HOME=C:\jdk1.5.0_01
setlocal
rem Guess CATALINA_HOME if not defined
set "CURRENT_DIR=%cd%"
if not "%CATALINA_HOME%" == "" goto gotHome
set "CATALINA_HOME=%CURRENT_DIR%"
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
cd ..
set "CATALINA_HOME=%cd%"
cd "%CURRENT_DIR%"
:gotHome
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
echo The CATALINA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end
:okHome
set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
rem Check that target executable exists
if exist "%EXECUTABLE%" goto okExec
echo Cannot find "%EXECUTABLE%"
echo This file is needed to run this program
goto end
:okExec
rem Get remaining unshifted command line arguments and save them in the
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
:doneSetArgs
call "%EXECUTABLE%" start %CMD_LINE_ARGS%
:end
可以看出catalina.bat才是启动tomcat的真正的批处理
真正的命令就是:
catalina.bat start/stop
catalina.bat:
1 if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"
2 if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath
3 echo Cannot find "%CATALINA_HOME%\bin\setclasspath.bat"
4 goto end
5 :okSetclasspath
6 call "%CATALINA_HOME%\bin\setclasspath.bat" %1
7 if errorlevel 1 goto end
根据setclasspath.bat的返回结果
返回1,就结束
8 set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"
调用java内核
bootstrap将调用common-logging.jar和common-daemon.jar
但这两个jar包没有被引入环境变量
之所以可以调用,是因为在bootstrap.jar的manifest文件中
定义了:
Class-Path:jmx.jar commons-daemon.jar commons-logging-api.jar tomcat-juli.jar
这样就可以自动调用这些文件了
还有Main-Class: org.apache.catalina.startup.Bootstrap
定义了执行bootstrap.jar的主方法
9 set _EXECJAVA=%_RUNJAVA%
10 set MAINCLASS=org.apache.catalina.startup.Bootstrap
11 set ACTION=start
12 if "%TITLE%" == "" set TITLE=Tomcat
set _EXECJAVA=start "%TITLE%" %_RUNJAVA%
如果参数是start,就启动,参数是stop就停止
start命令的作用:
启动一个新的窗口执行命令
命令的执行结果不会显示在原窗口
命令结束后窗口关闭
比如start ping localhost
当使用参数-t后, 命令将一直运行
start -t ping localhost
直到ctrl c结束命令
还可以添加新窗口标题名称
start "myping" -t ping localhost
所以这里命令就是
start "Tomcat" %_RUNJAVA%
就是另起一个名叫Tomcat的窗口执行命令
%_RUNJAVA%就是setclasspath.bat中定义的
"%JRE_HOME%\bin\java.exe"
所以我们可以修改catalina.bat,
把set _EXECJAVA=start "%TITLE%" %_RUNJAVA%修改为
set _EXECJAVA=%_RUNJAVA%
(注意有Windows系统和非Windows系统两段)
这样双击startup.bat后就不会窗口消失了
setclasspath.bat:
set "JAVA_ENDORSED_DIRS=%CATALINA_HOME%\endorsed"
set _RUNJDB="%JAVA_HOME%\bin\jdb.exe"
set _RUNJAVA="%JRE_HOME%\bin\java.exe"
有两种退出方式,分别返回1,0
之后调用setclasspath.bat后,
根据返回值判断是否调用成功
1是error,0是成功
:exit
exit /b 1
:end
exit /b 0
***********************************************
配置web站点的虚拟目录
虚拟目录
URL中的比如http://www.baidu.com/book/test.html
如何对应到站点的文件系统?
如果book不是站点服务器根目录下的对应的book目录,
那么这个book就是个web的虚拟目录
一个web站点必须有且只有一个虚拟根目录
默认tomcathome/webapps/ROOT就是站点的虚拟根目录
如果下面存放一个test.html
就可以用http://localhost:8080/test.html访问
我们新建/ROOT/book目录
里面存放test.html
那么使用http://localhost:8080/book/test.html访问
我们也可以把http://localhost:8080/映射到其他目录
替代ROOT目录
然后我们也可以在这个目录下,建立其他虚拟子目录
映射到文件系统的其他目录
一个文件系统目录,可以被映射成为多个虚拟Web目录
虚拟子目录名称可以是多极目录的结构形式
比如我们把根目录http://localhost:8080/映射在D:\test\
把根目录下的虚拟目录\myweb\book\test\映射到D:\test\web\
那么如果有D:\test\web\test.html文件
访问时就是:
http://localhost:8080/myweb/book/test/test.html
同时,D:\test\web\也可以被映射到其他虚拟子目录
比如\myweb2\
那么理论上,我们访问D:\test\web\test.html文件的URL也可以是
http://localhost:8080/myweb2/test.html
Tomcat按照最长路经匹配原则处理请求的URL
客户端请求某个路经资源时,
先取出路径中最长子目录的名称
看是否对应到了某个虚拟子目录上
否则就寻找上一级的虚拟子目录是否有映射
直到根目录为止
设置web站点根目录
server.xml文件中指定
1 <Host>元素的appBase属性所设置的应用程序基准目录中的ROOT子目录
自动选择\webapps\ROOT为根目录
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
2 使用server.xml文件中的<Context>元素
放在<Host></Host>里面
<Context path="" docBase="D:\test" debug="0"/>
将本地文件目录映射某个虚拟目录
path,虚拟目录,
空表示虚拟根目录
docBase, 本地目录,
可以绝对路径也可以相对路径,相对appBase目录
一个<Host>元素代表一个站点
一个<Context>表示一个虚拟目录
其实在Tomcat4的版本中,就可以看见这样的配置
<Context path="" docBase="ROOT" debug="0"/>
设置Web站点的虚拟子目录
1 使用server.xml中的<Context>
<Context path="/baidu" docBase="D:\myweb" debug="0"/>
2 特定目录中的xml文件中包含<Context>元素
Tomcat4的<Tomcat主目录>/webapps目录
比如建立一个admin.xml文件
Tomcat会自动读取它
如果它里面写了<Context>元素,
就可以用来做虚拟目录映射
Tomcat5的<Tomcat主目录>/conf/<引擎名>/<主机名>
C:\tomcat7.0.63\conf\Catalina\localhost
比如有个manager.xml文件
里面也写了<Context><ResourceLink>
3 server.xml的<Host>的appBase属性
所设置的应用程序基准目录中含有
WEB-INF/webl.xml文件的子目录
这些子目录就是我们平时放进去的项目
它们会自动被映射成虚拟目录
4 server.xml的<Host>的appBase属性
所设置的应用程序基准目录中的war文件
案例1
把C:\javaweb\lesson2映射成虚拟子目录
里面有test.html文件
打开server.xml
找到Host
增加Context子元素
<Context path="/it315" docBase="C:\javaweb\lesson2" />
重起tomcat
访问
http://localhost:8080/it315/test.html
<Context path="/xxx/yyy" docBase="C:\javaweb\lesson2" />
重起tomcat
访问
http://localhost:8080/xxx/yyy/test.html
两个链接可以同时访问到test.html资源
再加上如果再这样配置
<Context path="" docBase="C:\javaweb\lesson2" />
把根目录也映射到C:\javaweb\lesson2
重起tomcat
访问
http://localhost:8080/test.html
如果我们再添加目录C:\javaweb\lesson2\it315
加入test.html
访问路径:
http://localhost:8080/it315/test.html
那么这时候到底访问的是哪里的文件?
访问的是C:\javaweb\lesson2\test.html
还是C:\javaweb\lesson2\it315\test.html
这时候就要按照最长URL路径原则查找
这里最长的路径是/it315/
看它是否有对应关系
找到<Context path="/it315" docBase="C:\javaweb\lesson2" />
表示找到的是C:\javaweb\lesson2\test.html
案例2
指向一个war文件
把C:\javaweb\lesson2目录下所有内容打包到war文件
cd C:\javaweb\lesson2
jar -cvf mywar.war . (.表示当前目录下所哟内容)
生成了mywar.war
里面包含了test.html, 以及it315/test.html
注意不能在lesson2外面使用打包命令
否则会包含lesson2目录
或者使用jar -cvf mywar.war -C lesson2 .
-C表示打包的是lesson2目录,而不是当前的C:\javaweb目录
<Context path="/xxx/yyy" docBase="C:\javaweb\lesson2\mywar.war" />
这样就把虚拟目录指向了war文件
http://localhost:8080/xxx/yyy/test.html
http://localhost:8080/xxx/yyy/it315/test.html
案例3
复制C:\javaweb\lesson2到webapps目录下
(先删除里面的mywar.war文件)
访问
http://localhost:8080/lesson2/test.html
显示找不到
因为没有包含WEB-INF目录(可以没有web.xml)
我们手动添加它
就可以访问了
我们还可以直接把mywar.war文件
移动到webapps目录下
然后Tomcat会自动解压war文件在webapps下进行部署
这时候也能访问到解压后的资源
哪怕里面没有WEB-INF
这是实际工作中惯用手段
******************************************
部署描述符与目录的默认网页
部署描述符文件
/WEB-INF/web.xml
Tomcat有自己的web.xml文件
在/conf目录下
它对所有的web应用起作用
之前只创建WEB-INF而不用web.xml就可以部署成功
原因就是有这个默认web.xml
目录的默认网页文件
当url指向一个目录名,而不是文件名
会访问到什么资源?
http://localhost:8080/it315
找不到资源
我们发现在该项目中存在web.xml
但web.xml配置并不正确导致错误
这时候我们先删除它
那么就会使用Tomcat默认的/conf/web.xml
然后我们就可以访问到http://localhost:8080/it315
并且画面显示了it315目录下的所有子目录和文件
我们可以配置web.xml可以让url中的目录指向一个默认首页
<web-app>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>test.html</welcome-file>
</welcome-file-list>
</web-app>
里面可以定义多个默认的页面文件
这些文件存放在web应用的根目录
当你的项目中存在自己的web.xml的时候
它将代替tomcat的/conf/web.xml,
/conf/web.xml将失效,被覆盖
******************************************
配置虚拟主机
1 浏览器访问web资源的过程
URL
利用telnet连接web服务器
telnet localhost 8080
ctrl ] 打开本地回显功能(是否显示输入内容)
或者先用命令telnet
help 打开帮助
set ? 查询set的用法
看到localecho命令就是打开本地回显
执行set localecho, 打开本地回显
display 显示telnet参数状态
quit 退出
再连接web服务器
telnet localhost 8080
GET /it315/test.html HTTP/1.1
Host:
回车
访问到网页内容
它会按照发送出去的头字段,把网页内容返回到浏览器
Host为空表示访问主机默认的localhost
2 虚拟主机实现原理
目的就是在一台计算机上创建多个web站点
每个web站点设置不同的主目录和虚拟子目录
每个web站点作为各自独立的网站分配给不同公司或部门
多个公司或部门网站可以共用一台计算机
而用户感觉每个公司和部门都有各自独立的网站
多个没有实力在internet上架设自己专用服务器中小公司
可以联合租用一台web服务器,对外提供各自web站点互不影响
原理
web服务器上每个web站点必须设置不同的标识信息
web浏览器发出的连接和请求信息中包含web站点的标识信息
web站点标识信息
ip, 端口, 主机名
3 基于主机名的虚拟主机
当URL是http://www.it315.org/
就可以被解析为:
GET / HTTP/1.1
Host: www.it315.org
server.xml中
在TomcatEngine里面,配置了各个站点的信息
Engine是一个处理客户端请求的引擎
它接受tomcat连接器传递过来的访问请求
处理后将结果返回给连接器
可以包含多个Host元素
一个引擎可以管理多个站点
appBase指定各个站点的基准目录
Host中还可以配置站点的虚拟目录映射
<Context>中的相对路径也是相对于appBase而言的
引擎接收到访问请求头字段信息后,
会比较头字段中的Host信息和Engine中的所有站点的name
选择匹配的web站点进行响应
Engine的defaultHost是设置默认站点
和下面某个<Host>对应
如果访问请求的URL没有匹配任何一个<Host>
Engine就选择默认站点进行处理
<Engine name="Catalina" defaultHost="localhost">
<Host name="www.it315.org" appBase="webapps"...>
<Context ...>
</Host>
<Host name="localhost" appBase="webapps"...>
</Host>
......
</Engine>
有时候url如果是ip的话,
根本无法区别出到底是访问哪个站点
ip都是各个<Host>共享的
只有主机名可以被区分出来
web浏览器要访问基于主机名的虚拟主机时,
URL中必须采用主机名,而不能采用IP地址
在整个网络系统中建立主机名与IP地址的映射关系
必须将主机名添加到DNS系统
使用本地hosts文件
使用DNS服务器
案例,tomcat建立基于主机名的虚拟站点
C:/javaweb/lesson2下面建立两个子目录
VirtualHost1/ROOT
VirtualHost2/ROOT
把test.html放入其中
ROOT下必须建立WEB-INF目录,才会被tomcat自动部署
配置server.xml
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"...>
</Host>
......
<Host name="www.it315.org" appBase="C:\javaweb\lesson2\VirtualHost1"
unpackWARs="true" autoDeploy="true">
</Host>
<Host name="www.it315.cn" appBase="C:\javaweb\lesson2\VirtualHost2"
unpackWARs="true" autoDeploy="true">
</Host>
</Engine>
启动tomcat
tomcat会自动部署两个基准目录下的ROOT文件夹
telnet localhost 8080
GET /test.html HTTP/1.1
Host: www.it315.org
GET /test.html HTTP/1.1
Host: www.it315.cn
访问都成功,访问到各自下面的test.html
当我们发送任意未定义的主机名
GET /test.html HTTP/1.1
Host: www.xxx.yyy
返回的就是默认的localhost对应的资源文件
webapps/ROOT/test.html
这时候浏览器还不知道www.it315.org等对应的ip
所以还不能用http://www.it315.org/test.html访问
我们要么配置hosts文件
要么配置一个dns
然后用http://www.it315.org:8080/test.html访问
4 基于端口号的虚拟主机
server.xml中,
一个<Connector>元素用于配置一个对外的连接器
对于web服务器上的每一个监听端口号,
都要用一个单独的Connector元素
一个Connector元素对应的连接器必须有一个相关的Engine元素
将一个或多个Connector与Engine相关联的方式就是
嵌套在同一个Service元素中
<Sercice name="...">
<Connector port="...".../>
<Connector port="...".../>
。。。
<Engine name="...">
<Host name="">
<Context ...>
</Context>
</Host>
</Engine>
</Service>
一个Service里面可以有多个监听的端口
但不可以有相同的port值
例如:
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
这里是Tomcat针对HTTP的监听端口
<Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- 当使用Tomcat线程池时,使用这个监听
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
这是针对HTTPS的监听端口
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
这是接受JK插件的监听端口
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
所有上面监听到的请求都用这个Engine来处理
<Engine name="Catalina" defaultHost="localhost">
。。。
</Engine>
</Service>
</Server>
我们也可以建立自己的Service元素
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
。。。
</Service>
<Service name="Second_Service">
<Connector executor="tomcatThreadPool"
port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
配置引擎
<Engine name="Catalina" defaultHost="www.it315.org">
<Host name="www.it315.org" appBase="C:\javaweb\lesson2\VirtualHost1"
unpackWARs="true" autoDeploy="true">
</Host>
<Host name="www.it315.cn" appBase="C:\javaweb\lesson2\VirtualHost2"
unpackWARs="true" autoDeploy="true">
</Host>
</Engine>
</Service>
</Server>
然后就可以访问
http://www.it315.org/test.html
http://www.it315.org:80/test.html
80端口是默认的网页访问端口,可以省略
同时,我们也可以访问之前的
http://www.it315.org:8080/test.html
我们就可以让80端口指向一个资源
而让8080端口指向另一个资源
就实现了,同一个主机名不同端口指向不同站点
5 基于IP的虚拟主机
HTTP1.0不支持Host头字段,
所以在保证所有站点统一使用端口号80的情况下
人们早期只能采用不同的IP来建立虚拟主机
就需要给每个站点分配独立的ip,
但internet的ip资源是有限的,所以这么做不太好
HTTP1.1可以用不同的主机名来建立多个web站点后,
虚拟主机业务提供商一般不再建立基于ip的虚拟主机
Tomcat也没有提供基于ip的虚拟主机方式
演示在windows上设置多个ip, 为一个网卡绑定多个ip
网络链接设置,本地链接
TCP/IP属性
高级
就可以添加多个ip
子网掩码255.255.255.0
然后可以使用其中任意一个ip访问计算机
******************************************
Tomcat与其他专用Web服务器的集成
虽然tomcat也可以作为独立的web服务器
但它处理静态xml的速度比不上apache ,IIS这样的专业服务器
功能也不如它们强大
如果一个web站点要支持servlet,jsp
又要有较高的速度处理html静态页面,
更多的web站点功能,
就要将它与这些web服务器集成
由其他web服务器专门处理站点服务相关的内容
而tomcat用于处理Servlet,JSP相关的内容
集成的考虑因素
是否要集成要视具体情况
访问apache网站查看集成因素
Tomcat FQA网页中,找到Connector部分
告诉我们在什么情况下集成/不集成Apache
1 集群,客户端请求先到Apache集群,
再由它们均衡分派给tomcat
如果tomcat自己部属了负载均衡,
那这里可能不考虑集成了
2 集群/安全
让Apache集群在tomcat前端
根据不同请求分派给不同的tomcat
Tomcat出于web服务器后端,受保护,
用户不能直接访问
系统管理员直需要考虑前端集群
3 安全
专业web服务器有更多处理安全的技巧
4 附加功能
集成后,可以在网站中部署CGIpool,ASP,PHP
等各种程序语言的支持
5 特殊功能
补充tomcat不支持的功能
6 速度
处理网页静态内容时,可能比单纯tomcat快些
7 socket处理/系统稳定性
tomcat底层是由JVM来执行socket
需要跨越底层操作系统平台
java代码在大多情况下运行很好,
但服务器接受到来自无效ip发出的半连接,
非法数据操作等攻击时,tomcat做得没有其他好
集成技术的选择
访问tomcat FAQ
选择哪个connector?
mod_jserv, JK, JK2, mod_webapp, mod_proxy
mod_webapp,已经过时
mod_jserv,不再支持和使用
使用AJP协议,对HTTP优化
就是tomcat和其他web服务器间通信协议
JK,目前首选技术
JK2,目前不支持,曾经比JK更新,
但配置太复杂,开发人员不感兴趣,停止开发
mod_proxy,简单配置但不能实现由会话状态的负载均衡
mod_proxy_ajp, 只能在Apache2.2版本中使用
*****************************************************
JK插件
IIS和Apache等都支持插件技术
可以将符合某个条件的请求交给插件处理
它们能和tomcat集成的关键原理就是这种插件技术
URL访问请求交给JK插件
它再转交给tomcat处理
如果在为JK插件预先配置好的URL映射信息中,
所有"/*.jsp"形式的URL都由tomcat服务器来处理
那么当用户请求访问"/index.jsp"时,
web服务器将调用JK插件来处理
JK插件又把这个请求转发给tomcat服务器处理
tomcat服务器最后将响应结果经JK插件传给WEB服务器
tomcat开发小组为不同的web服务器提供不同的JK插件
不同版本tomcat与其它web服务器各个版本集成时JK插件也不同
下载JK插件
一般倾向最新版本,如果不行,选择旧版本
视频里面用jk-1.2.14版本
具体是:
isapi_redirect-1.2.14.exe(安装版,集成IIS)
mod_jk-1.2.14-apache-2.0.54.so (集成Apache,复制到moudles目录)
apache的版本是:apache-2.0.54
安转文件是:
apache_2.0.55-win32-x86-no_ssl.msi
(现在最新的是
JK:
tomcat-connectors-1.2.41-src.tar.gz
tomcat-connectors-1.2.41-src.zip
apache:
httpd-2.4.17.tar.gz
httpd-2.2.31.tar.gz
httpd-2.2.31-win32-src.zip)
JK插件的工作原理
需要解决的问题:
1 web服务器中正确安装JK插件
2 JK需要知道把请求转发给哪个Tomcat服务器上的哪个连接器
也就是需要知道该连接器的通信协议和地址
3 JK需要知道它负责处理的URL,以便通知web服务器,
把这些URL转交给它处理
另外一个JK插件可以向多个Tomcat服务器转发请求
它需要知道哪些URL应转发给哪个Tomcat服务器
4 JK本身的一些配置信息,例如记录日志的文件路径,
记录日志的级别等信息,
如果上面2,3点问题都在各自的一个属性文件中设置,
那么还需要告诉这两个属性文件的位置路径
配置和工作图
(isapi_redirect.properties)
worker_file=
worker_mount_file= -----------------
| |
| |
(uriworkermap.properties) (workers.properties)
/*.jsp=worker1 worker.list=worker1
| ----> worker.worker1.type=...
| worker.worker1.host=...
| worker.worker1.port=...
| |
| |
Client --> Web Server --> JK Plugin --> Tomcat
<-- <-- <--
JK安装步骤
1,安装isapi_redirect-1.2.14.exe
装在C:\JK\
2 C:\JK\conf下有两个配置文件
uriworkermap.properties
告诉JK哪些url请求需要转分发到哪台tomcat
/*.jsp=worker1
/myweb/*=worker1
/jsp-examples/*=worker2
workers.properties
告诉JK,如何联系Tomcat
里面设置了每一个与JK连接的Tomcat的属性
一个tomcat就是一个worker
worker.list=worker1,worker2
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker2.type=ajp13
worker.worker2.host=192.168.0.3
worker.worker2.port=8009
也可以如下设置
list指向了一套负载均衡的tomcat系统
wlb是这套系统的名称
其中ajp13w是这套系统中负责负载均衡的服务器
lb是负载均衡的意思
当设置为lb的时候,
不是指某一台tomcat
指一套实现了lb的虚拟的tomcat服务系统
没有host,port而需要设置balance_workers
它指向了这个负载均衡服务器ajp13w
worker.list=wlb
worker.ajp13w.type=ajp13
worker.ajp13w.host=localhost
worker.ajp13w.port=8009
worker.wlb.type=lb
worker.wlb.balance_workers=ajp13w
在线查阅JK帮助文档
在Apache/IIS中分别如何配置
**********************************************************
Tomcat体系结构
Server
Service
client <--HTTP--> Connector -> Engine
Host
client <--HTTP--> Connector -> Context
Context
JK连接程序 <-AJP协议-> Connector -> Host
Context
其他连接程序 <-其他协议-> Connector -> Context
这种设计方式是非常灵活的
以后如果要集成新的连接程序,用于不同协议
只需要开发新的连接器Connector
然后和引擎关联就可以了
做到即插即用效果
Tomcat与IIS服务器集成
如果两者在同一个服务器,保证其没有端口冲突
1 安装IIS
控制面板中添加Windows组件
打开IIS管理程序
查看默认网站属性
默认端口80
根目录映射到了C:\inetpub\wwwroot目录
ISAPI筛选器中要添加JK
筛选器可以添加在各个站点,
也可以直接添加在网站,对所有站点起作用
还有一个文档选项卡
类似tomcat在web.xml中配置默认网页index.html等
IIS中创建虚拟子目录
右键某个站点,新建虚拟目录
按照向导操作,把虚拟目录xxx映射到本地目录C:\myweb\lesson2
然后在网站中就多了新的虚拟站点
http://localhost:80/xxx/test.html
就可以访问了
还有一种更简单的方式
右键lesson2目录,属性-web共享
选择共享位置和虚拟目录,就可以了
还可以映射多个虚拟目录
2 配置Tomcat和JK插件
启动tomcat
80端口已经被使用错误
因为刚才我们配置了一个端口是80的<Service>
我们删除这段,重起tomcat
把JK插件安装为一个ISAPI筛选器
注意将JK插件所在目录设置为
某个站点下的一个具有执行许可权县的虚拟目录
就是将动态链接库文件isapi_redirect.dll所在目录
C:\JK\bin共享成虚拟子目录
并且权限为"执行"
其实当我们安装了JK后,
自动会将该目录在IIS中映射成虚拟子目录
虚拟目录名称为jakarta
现在我们就在ISAPI筛选器对话框内
添加筛选器jakarta
可执行文件就是JK插件的dll文件isapi_redirect.dll
重启IIS
编写JK的配置文件,C:\JK\conf\
workers.properties
设置JK所要连接的tomcat,这里我们连接一台tomcat
就是worker1
协议是ajp13,监听8009端口,tomcat的ip地址
worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
uriworkermap.properties
哪些url分派给JK,而JK又把url分配给哪个tomcat
#根目录下所有jsp交给work1处理
/*.jsp=worker1
#以下所有资源都交给worker1
/admin/*=worker1
/manager/*=worker1
/jsp-examples/*=worker1
/servlets-examples/*=worker1
设置JK插件的属性
可以在属性文件中配置
必须存放在isapi_redirect.dll文件同目录C:\JK\bin
文件名必须是:
isapi_redirect.properties
#JK插件在IIS服务器中虚拟路径,应和IIS中创建的虚拟目录一致
exension_uri=/jakarta/asapi_redirect.dll
#JK插件生成的日志文件的完整路径
log_file=C:\JK\log\isapi_redirect.log
#日志级别,有效值为debug,info,warn,error,trace
log_level=debug
#workers.properties文件的完整路径
worker_file=C:\JK\conf\workers.properties
#uriworkermap.properties文件的完整路径
worker_mount_file=C:\JK\conf\uriworkermap.properties
(还可以在Windows注册表中设置
写一个isapi_redirect.req文件,双击注册)
3 测试Tomcat和IIS集成是否成功
重起IIS,访问
http://localhost/index.jsp
这时候发现tomcat首页网页可以显示
但是图片都不能显示
发现图片地址http://localhost/tomcat.gif
由于访问流程是:
对于jsp的请求,
请求先到IIS, IIS转发给JK,JK再转发给Tomcat
这样就定位到了Tomcat的根路径,找到了Tomcat的index.jsp
但对于图像文件,img的src每个都是一个请求
这时的请求的资源后缀是gif,
所以请求只到IIS, 而不会由JK转发给Tomcat
这时候访问的是IIS的根路径C:\inetpub\wwwroot
就无法显示图片了
这时,如果在配置文件中把图片后缀的请求教给Tomcat
那样又会造成在IIS根目录下的图片请求,转发到了Tomcat
所以推荐的作法是,把Tomcat下的资源,
都存放在某个虚拟子目录下
使用/xxx/*=worker1的方式配置,
而不是使用文件后缀的方式配置
就不会和IIS本身资源冲突
最后的问题是,既然Tomcat只是和IIS集成
它不对外提供web站点服务,
那么我们在server.xml文件中,
可以把<Conector port="8080"...>这个连接器注释掉呢?
答案是可以的,并且最好就是注释掉
这样外网就无法通过http协议访问tomcat了,
只能访问IIS, 由IIS转发特定资源给Tomcat
Tomcat与Apache服务器集成
下载和安装Apache服务器
下载和安装JK插件
将下载的mod_jk-1.2.14-apache-2.0.54.so文件
改名为mod_jk.so后
复制到<apache_home>\modules目录中
设置配置信息
Apache的<apache_home>\conf\httpd.conf中
测试是否成功
httpd.conf配置如下:
方式一,
#加载JK插件模块
LoadModule jk_module modules/mod_jk.so
#配置Tomcat服务器的信息
JkWorkerProperty worker.list=worker1
JkWorkerProperty worker.worker1.port=8009
JkWorkerProperty worker.worker1.host=localhost
JkWorkerProperty worker.worker1.type=ajp13
#指定生成JK插件的日志文件目录
JkLogFile logs/mod_jk.log
#指定JK插件的日志文件级别
JkLogLevel debug
#设置JK插件的路径映射信息
JkMount /*.jsp=worker1
JkMount /myweb/*=worker1
方式二,
引用JK插件的配置文件
其中的相对路径,是相对于该文件中一个server_root的配置而言的
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMountFile conf/uriworkermap.properties
方式三,
参考下面win7下的apache+tomcat+jk负载均衡
*****************************************************
win7下的apache+tomcat+jk负载均衡
http://www.tuicool.com/articles/BbUJFz
apache http server:httpd-2.2.25-win32-x86-no_ssl.msi
tomcat:apache-tomcat-6.0.14.zip
jk:mod_jk-1.2.31-httpd-2.2.3.so
目标:
1、Apache 做为 HttpServer ,后面连接多个tomcat 应用实例,并进行负载均衡。
2、为系统设定 Session 超时时间,包括 Apache 和 tomcat
3、为系统屏蔽文件列表,包括 Apache 和 tomcat
注:本例程以一台机器为例子,即同一台机器上装一个apache 和2个Tomcat。
4、尝试共享cache (未果)
安装
把apache 解压到“D:\”下,
tomcat解压到“D:\学习\负载均衡\apache-tomcat-6.0.14a”
和“D:\学习\负载均衡\apache-tomcat-6.0.14b”。
经过我亲自的实践,apache 的安装路径中不能有中文!
不然会出问题的,不过tomcat的安装路径中可以带有中文的。
最后把mod_jk-1.2.31-httpd-2.2.3.so
放到apache目录下的module目录中。安装完成!
配置apache
1. windows 下的主要配置文件就在“安装目录/conf/httpd.conf ”。
在 %apache_home%\conf\httpd.conf 的最后面添加
# module mod_jk config file
Include conf/extra/mod_jk.conf
因为我是使用的jk 来配置负载均衡的,所以这么多就够了,然后,
2. 在%apache_home%\conf\extra\ 目录下新建文件:mod_jk.conf,
内容如下
#load module mod_jk-1.2.31-httpd-2.2.3.so is for Apache 2.2.x.
LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so
# 配置 mod_jk conf
# 加载集群中的workers
JkWorkersFile conf/workers.properties
# 加载workers的请求处理分配文件
JkMountFile conf/uriworkermap.properties
# 指定jk的日志输出文件
JkLogFile logs/mod_jk.log
# 指定日志级别
JkLogLevel info
3. 在%apache_home%\conf\ 目录下新建文件:workers.properties,
内容如下:
# worker 列表
worker.list=LB_worker,jkstatus
# 第一个worker的配置,名为worker_1
#tomcat 的主机地址,如不为本机,请填写ip地址
worker.worker_1.host=localhost
#ajp13 端口号,对应tomcat配置文件server.xml中Connector port="8009",默认8009
worker.worker_1.port=8009
worker.worker_1.type=ajp13
# 负载的权重值,越高表示负载越大
worker.worker_1.lbfactor=1
# 第二个worker的配置,名为worker_2
worker.worker_2.host=localhost
#ajp13 端口号,对应tomcat配置文件server.xml中Connector port="9009"
worker.worker_2.port=9009
worker.worker_2.type=ajp13
worker.worker_2.lbfactor=1
#LB_worker, 用于负载均衡分发的控制器
worker.LB_worker.type=lb
# 重试次数
worker.LB_worker.retries=3
# 指定负载的worker列表,用逗号分隔
worker.LB_worker.balance_workers=worker_1,worker_2
# 配置session会话是否为粘性
# 这样负载均衡器lb就会尽量保持一个session,
# 也就是使用户在一次会话中跟同一个Tomcat进行交互
worker.LB_worker.sticky_session=true
# 如果sticky_session设为true时,此处一般设为false
worker.LB_worker.sticky_session_force=false
# 设置运行状态的控制器
worker.jkstatus.type=status
4. 在%apache_home%\conf\ 目录下新建文件:uriworkermap.properties,内容如下
# 所有请求都由LB_worker 这个worker处理
/*=LB_worker
# 所有包含jkstatus请求的都由名称叫jkstatus的这个worker处理
/jkstatus=jkstatus
好了,apache 这边已经设置好了,再把tomcat设置好,
就能用apache访问tomcat啦。
配置Tomcat
其中要进行两个tomcat 的分别设置,
并且和workers.properties里面的对应的内容相匹配
其实tomcat 并不用怎么配置,就是两点,
第一,保证tomcat的端口之间互不冲突(需要修改三个地方);
第二,保证tomcat的Connector端口和
apache的worker.property配置文件中一致
(默认是8009的那个)。
准备jsp
分别在两个tomcat 的webapps下面写了两个小jsp文件
这个jsp 放到webapps/Root下面就好了。
<%
System.out.println("this is tomcat server worker_1");
%>
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+" < br > this is tomcat server worker_2");
%>
另一个是worker_2
测试负载均衡
启动tomcat :点击一号tomcat的安装目录下的bin中的startup.bat
点击二号tomcat 的安装目录下的bin中的startup.bat
看到两个tomcat 占用的端口号都是不一样的~~~
启动apache :运行这个ApacheMonitor.exe就好啦
在浏览器里面输入
http://localhost/hello.jsp 同时刷新浏览器
就会重复的出现:
一个是
null:80
this is tomcat server worker_1
另一个是
null:80
this is tomcat server worker_2
成功均分了请求到两个tomcat
共享session
很简单,在 worker 配置文件中这样改一下:
# 这样负载均衡器 lb 就会尽量保持一个 session ,
也就是使用户在一次会话中跟同一个 Tomcat 进行交互
worker.LB_worker.sticky_session = false