深入了解Tomcat

1 篇文章 0 订阅
1 篇文章 0 订阅
大型网站拓扑图

浏览器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 &quot;%r&quot; %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 &quot;%r&quot; %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   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值