一、Web应用的相关知识
- HTTP协议
Web浏览器与Web服务器的交互过程得遵循一定的规则,这个规则就是HTTP协议。 - URL
放置在Internet上的Web服务器中的每一个网页文件都应该有一个访问标记符,
用于唯一地标识它的访问位置,以便Web浏览器能够定位到它。这个访问标识符称为URL,
即Uniform Resource Locator的英文简写,翻译成中文就是统一资源定位符。
URL地址中包含Web服务器主机或IP地址、文件(或其他资源)路径名称,以及使用的网络协议和端口号。 - 主要的Web服务器软件
目前主要的两种Web服务器软件是Microsoft Internet Information Server(简称IIS)和Apache。
要想在这些Web服务器软件中运行Servlet和JSP,还必须将它们与某种Servlet和JSP容器(引擎)进行集成。
Tomcat是Sun公司推荐的运行Servlet和JSP的容器,它可以被集成到IIS和Apache中。另外,Tomcat
也具有Web服务器的一些基本功能,对于一般的应用情况,也可以直接将Tomcat作为Web服务器软件运行。 - 网站系统的组成
二、安装Tomcat
- Tomcat简介
Tomcat是Apache组织的Jakarta项目中的一个核心项目,它是Sun公司推荐的
运行Servlet和JSP的容器(引擎),其源代码是公开的。
Tomcat还具有Web服务器的基本功能,提供数据库连接池、SSL、Proxy等许多通用组件功能。
Tomcat也可以作为独立的Web服务器软件运行,但它处理静态HTML文件的速度比不上Apache和IIS
等专业的Web服务器,且其作为Web服务器软件的功能也不如Apache和IIS强大。
可以将Tomcat与Apache或IIS集成起来,让Apache或IIS处理静态HTML文件,
Tomcat则专门用于处理Servlet与JSP等编写的“动态网页”。 - 获取Tomcat安装程序包
下载地址:https://tomcat.apache.org - 使用zip和tar.gz包安装Tomcat
解压;
主要子目录的介绍:
bin 用于放置Tomcat的可执行文件和脚本执行文件。
conf 用于放置Tomcat的配置文件。
logs 用于放置Tomcat的日志记录文件。
webapps Web应用程序的主要发布目录。
work Tomcat的工作目录,JSP文件翻译成的Servlet源文件和class文件放置在这里。 - 使用exe程序安装Tomcat
在安装Tomcat之前,必须安装JDK。
使用exe程序进行安装可增加一些启动和管理Tomcat的快捷方式,
以及帮助用户修改Tomcat管理员账户和网络监听端口的默认设置。
选择“NT Service”项,Tomcat将作为NT服务程序安装;
选择“JSP Development Shell Extensions”项,
以.jsp为扩展名的文件将被关联成双击时用Windows记事本程序打开;
选择“Tomcat Start Menu Group”项,在Windows程序菜单中添加启动和管理Tomcat的一些快捷菜单。
三、Tomcat的启动与停止
- 使用Tomcat服务程序
启动与停止
在Tomcat的服务菜单中,单击“启动”按钮和单击“停止”按钮。
修改Tomcat服务程序的启动类型
设置为主动时,每次启动Windows后,该服务程序自动启动运行;设置为手动时,
需要单击“启动”按钮启动。
命令行启动和停止
启动:net start 服务名称,停止:net stop 服务名称。
IP和端口
正确安装TCP/IP协议后,计算机本地回路IP地址是127.0.0.1,操作系统将localhost映射成127.0.0.1
Tomcat的Web服务监听端口为8080。
查看Tomcat服务程序启动运行后的效果
http://localhost:8080
查找网络服务程序监听异常的问题
执行netstat-na命令,查看TCP监听端口列表中是否包含Tomcat的Web服务绑定的监听端口。
使用一个名为Fport的工具软件,可以查看到本地计算机上所有打开的TCP和UDP端口,
以及使用这些端口的应用程序名称。 - startup.bat批处理文件
批处理文件
用于批量执行多条Windows命令的文本文件称为Windows命令脚本文件或批处理文件。
startup.bat
01 @echo off
用于让其后的所有命令在执行时都不在命令行窗口中显示命令自身的文本内容。如果在
某个命令的最前面加上@,这个命令执行时将不在命令行窗口中显示其自身的文本内容。
02 if "%OS%" == "Windows_NT" setlocal
if三种语法格式之一:if "参数或环境变量" == "字符串" 命令
条件成立,语句中的命令执行后再继续往下执行,否则就不执行语句中的命令而直接往下执行。
03 rem Guess CATALINA_HOME if not defined
rem后表示注释
04 if not "%CATALINA_HOME%" == "" goto gotHome
goto命令用于让批处理跳转到它后面指定的标号处开始往下执行。标号在一个单独的行中定义,
格式为标号名称前面加上一个冒号(:),如08行所示,标号所在行不被执行。
05 set CATALINA_HOME=.
设置环境变量
06 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
if另外一种格式:if exist 文件名 命令
07 set CATALINA_HOME=..
08 :gotHome
设置标号
09 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
10 echo The CATALINA_HOME environment variable is not defined
echo命令用于在命令行窗口中显示一行文本
11 goto end
12 :okHome
13 set EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat
14 set CMD_LINE_ARGS=
清空环境变量
15 :setArgs
16 if ""%1""=="""" goto doneSetArgs
在执行批处理文件时,可以在批处理文件名后面追加若干用空格分隔的文本字符串。这些
文本字符串就是传递给批处理文件的参数,每个用空格分开的文本字符串分别代表一个参数。
批处理文件中可以使用%0到%9这样的10个变量名,其中,%0的值为正在执行的批处理文件名,
%1到%9依次为传递给这个批处理文件的前9个参数。
17 set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
18 shift
shift命令用于将传递给批处理文件的参数依次向前移位。
19 goto setArgs
20 :doneSetArgs
21 call "%EXECUTABLE%" start %CMD_LINE_ARGS%
call命令用于调用另一个批处理文件,另外那个批处理文件执行完后
回到当前批处理文件中接着执行call后面的命令行。
22 :end - catalina.bat批处理文件
catalina.bat
26 set _EXECJAVA=start "Tomcat" %_RUNJAVA%
如果当前操作系统的OS环境属性为Windows_NT,那么执行将新启动的命令行窗口标题设置为Tomcat。
34 :ececCmd
35 xxx
最简形式:%_EXECJAVA% %MAINCLASS% %ACTION%
java org.apache.catalina.startup.Bootstrap start - 使用批处理程序及查找Tomcat的启动问题
Windows启动和结束Tomcat
只要在setclasspath.bat批处理文件第一次使用JAVA_HOME环境变量之前的任何地方,
例如在Windows系统特性的“环境变量”对话框中,或者在startup.bat、catalina.bat、
setclasspath.bat等任意一个文件的开始位置处,将JAVA_HOME环境变量设置为
JDK的安装主目录,就可以使用strat.bat文件启动Tomcat了。
可以使用shutdown.bat文件或“Stop Tomcat”快捷菜单项、
或者命令行窗口中按下Ctrl+C键结束Tomcat。
Linux启动和结束Tomcat
Linux下的Tomcat启动脚本文件为startup.sh,关闭脚本文件为shutdown.sh。
让startup批处理的内部不要产生新的命令行窗口
将catalina.bat文件中的第26行里的位于%_RUNJAVA%前面的start “Tomcat”部分删除,
或者将29行里位于%_RUNJAVA%前面的start部分删除。
四、配置Web站点的虚拟目录
- 虚拟目录
一个Web资源的URL中的资源路径部分,例如/training/index.html,
就是由Web服务器的某个本地目录中的资源所映射成的虚拟路径。
/training/index.html中的第一个正斜杠“/”表示站点的根目录,
/training/表示站点根目录下面的一个名为training的子目录,
/training/index.html表示“training”子目录中的一个名为index.html的文件。
将Web服务器的本地文件系统中的某个目录映射成一个虚拟Web目录过程叫Web发布。 - 虚拟Web目录的映射原理
一个Web站点上必须有且只能有一个虚拟根目录,其他虚拟目录都以根目录的子孙目录形式出现,
根目录用正斜杠“/”表示,根目录与该目录下的子目录或资源文件也用正斜杠“/”进行分割。
一个Web站点除了可以设置一个虚拟根目录外,还可以为其设置若干个虚拟子目录。
一个文件系统目录可以被映射成一个或多个虚拟Web目录,
但一个虚拟Web目录只能对应一个本地文件系统目录。
当浏览器请求某个路径的资源时,Tomcat按照最长路径匹配原则进行处理。 - 设置Web站点的根目录
1、<Tomcat主目录>/webapps/ROOT目录可以自动映射成为Web站点的虚拟根目录,
Tomcat初始安装后的虚拟根目录里就是以这种方式创建的,注意目录名ROOT中的每个字母都是大写的。
2、<Tomcat主目录>/conf/server.xml文件中的一个<Context>:
<Context path="" docBase="ROOT" debug="0"/>
元素用于将本地文件系统中的一个目录映射成一个可供Web浏览器访问的虚拟Web目录。
其中,path属性指定虚拟Web目录的路径,当其设置为空字符串时,
则表示的是整个Web站点的根目录;docBase属性指定该虚拟Web目录所映射到的本地文件系统目录,
可以使用绝对路径或相对<Tomcat主目录>/webapps的相对目录。 - 设置Web站点的虚拟子目录
1、基本方式
在Tomcat中设置虚拟子目录的最基本的方式就是在<Tomcat主目录>/conf/server.xml文件中设置<Context>
元素,<Context>元素必须嵌套在<Host>元素之中,一个<Host>元素表示一个Web站点,
其中可以包含多个<Context>子元素,每个<Context>子元素分别对应该站点下的一个虚拟Web目录。
只有<Tomcat主目录>/webapps目录下的子目录中包含WEB-INF子目录。更确切的说,
在包含WEB-INF/web.xml文件时,该子目录会被自动设置成一个Web应用程序,
其虚拟路径就是在该子目录的名称前加上“/”。
放入<Tomcat主目录>/webapps目录下的war文件将被自动设置成一个Web应用程序,
其虚拟路径就是该war文件名称的前面加上“/”。在这种情况下,
war文件对应的目录中可以不包含WEB-INF子目录和WEB-INF/web.xml文件。 - 部署描述符与目录的默认网页
web.xml文件用于描述Web应用程序的部署信息,因此web.xml文件也称为应用程序的部署描述符。
在<Tomcat主目录>/conf目录中也提供了一个web.xml文件,该文件中的设置信息对所有的Web应用程序
都起作用。<Tomcat主目录>/conf/web.xml文件里面的设置信息也就是每个Web应用程序的默认设置。
每个Web应用程序内部的web.xml文件用于在<Tomcat主目录>/conf/web.xml文件的设置基础上增加
或覆盖一些设置信息,一个Web应用程序内部的web.xml中所设置的信息只对该web应用程序自己有效。
如果客户端访问的URL指向的是一个目录名,而不是文件名,Tomcat有可能返回目录下的内容列表,
也可能返回该目录下的一个默认网页文件。
<webcome-file-list>元素用于设置Web目录的默认网页文档列表,其中可以嵌套多个<welcome-file>子元素,
每个<welcome-file>子元素中指定一个网页文件。
当浏览器访问指向目录的URL地址时,Tomcat按照<welcome-file-list>元素指定的默认网页文档的顺序,
依次在该目录中查找这些默认网页文档,将最先找到的默认网页回传给Web浏览器,并停止查找后面的
默认网页文件。如果<welcome-file-list>元素指定的所有默认网页文档在浏览器访问的目录中都不存在,
Tomcat将该目录中的文件和子目录的超链接列表传送给Web浏览器。
五、配置虚拟主机
- 浏览器访问Web资源的过程
浏览器访问过程
浏览器访问一个Web资源时,根据URL中的协议名、IP地址(或主机名)、端口号等信息
与Web服务器建立网络连接。Web浏览器与Web服务器建立连接后,通过这个连接URL后半部分的
资源路径发送给Web服务器,请求服务器返回这个路径名所指定的资源。
Telnet程序访问Web资源的过程
启动Tomcat Web服务器程序,然后打开一个新的命令行窗口,并在命令行窗口中执行如下命令:
telnet 127.0.0.1 8080
在Telnet程序启动的命令行窗口中,输入如下内容:
GET /test.html HTTP/1.1
打开Telnet程序的本地回显功能 - 虚拟主机及实现原理
虚拟主机
在一台计算机上可以使用Tomcat创建多个Web站点,一台Web服务器,对外提供各自的Web服务
而互不影响,这就是称之为虚拟主机的解决方案。
实现原理
在一台Web服务器上,可以使用不同的端口号、IP地址或主机名,以及这三个要素的不同组合
来创建多个Web站点。根据Web浏览器建立连接和发出请求消息时所指定的这三部分信息,
Web服务器就能够确定Web浏览器要访问的到底是这台Web服务器上的哪个站点。 - 基于主机名的虚拟主机
虚拟主机
<Engine name="Standalone" defaultHost="localhost" debug="0">
...
<Host name="localhost" appBase="webapps"...>
...
</Host>
...
</Engine>
一个<Engine>元素构建一个处理客户端请求的引擎,它接受Tomcat的连接器传递来的访问请求,
进行具体的处理后将结果返回连接器。<Engine>元素的defaultHost属性设置为嵌套在它里面的
某个<Host>元素的name属性值,该<Host>元素所创建的Web站点就成该引擎的默认Web站点。
在一个<Engine>元素中可以使用多个<Host>元素来建立多个Web站点。
<Host>元素的name属性用于指定其所对应的Web站点的主机名称,嵌套在同一个<Engine>元素中的
多个<Host>元素的name属性不能相同。appBase属性指定一个路径,该路径将作为嵌套在它里面的
<Context>元素的docBase属性中设置的相对路径的基准路径。
访问过程
当Tomcat的连接器将接受到的访问请求交给关联的处理引擎时,处理引擎将比较请求消息中的Host头字段的值
与相应的<Engine>元素中的所有<Host>元素的name属性值,并选择匹配的<Host>元素
所对应的Web站点下的内容来进行响应。如果相应的<Engine>元素中没有与
请求消息的Host头字段匹配的<Host>元素,处理引擎将选择默认的Web站点来进行响应。
访问URL中必须采用主机名
在同一台计算机上建立多个基于主机名的虚拟主机后,Web浏览器要访问其中的某个虚拟主机的资源时,
在访问URL中必须采用主机名,而不能采用IP地址。
建立主机名与IP地址的映射关系
建立主机名与IP地址的映射关系的惯用方式有两种,一是使用客户机本地的Hosts文件,
二是使用DNS(Domain Name System,域名系统)服务器。
客户机首先在本地的Hosts文件中查找主机名称所映射的IP地址,如果没有找到,再去查询DNS服务器。 - 基于端口号的虚拟主机
一个<Connector>元素对应的连接器必须有一个相关的<Engine>元素去处理它所接受到的访问请求,将一个
或多个<Connector>元素与某个<Engine>元素相关联的方式就是将他们嵌套在同一个<Service>元素中。
要想使用Tomcat建立基于端口号的多个虚拟主机,需要在server.xml文件中创建多个<Service>元素,
并且每个<Service>元素中的<Connector>元素的port属性的值不同。 - 基于IP地址的虚拟主机
在同一台计算机上可以使用多个IP地址来维护多个Web站点。
建立基于IP地址的虚拟主机的意义不大,所以Tomcat没有提供建立基于IP地址的虚拟主机方式。
六、与专用Web服务器的集成
- 集成的考虑因素
1、集群
让专业Web服务器作为多个提供相同内容的Tomcat服务器的前端系统,客户端的访问请求先交给专业的
Web服务器,专业Web服务器再将访问请求均衡地分配给这些Tomcat服务器去处理。
2、集群/安全
每个Tomcat服务器位于专业Web服务器的后端,它们位于被保护的区域内,用户不能够直接访问它们,
系统管理人员只需要考虑Web服务器的安全。
3、安全
专业Web服务器对于安全有更多的考虑和处理技巧。
4、附加功能
Tomcat中要集成CGI、Perl、PHP这些功能非常麻烦。
5、特殊功能
专业Web服务器能够执行很多Tomcat不支持或者现在还不能很好支持的特殊功能。
6、速度
在某些场合下,Tomcat甚至比专业Web服务器更快。
7、Socket处理/系统稳定性
专业Web服务器在应对某些情况,比基于JVM的程序做得要好得多。 - 集成技术的选择
JK集成Tomcat与其他Web服务器的技术,与Tomcat服务器之间采用AJP协议通讯,在实际应用中非常稳定。 - JK插件
假定在为JK插件预先配置好的URL映射信息中,所有的“/*.jsp”形式的URL都由Tomcat服务器来处理,
那么,当用户请求访问“/index.jsp”时,Web服务器将调用JK插件来处理,JK插件又把这个请求
转发给Tomcat服务器处理,Tomcat服务器最后将响应结果经JK插件传给Web服务器。
下载 - Tomcat体系结构与JK插件的工作原理
一个<Engine>元素可以与多个<Connector>元素相关联,也就是多个连接器可以共用一个处理引擎。每个
连接器接受到不同协议和格式的访问请求后,将它们转换成统一的格式后再交给与它们关联的引擎去处理。
要想让JK插件正常工作,需要解决如下一些问题:
1、在Web服务器中正确安装JK插件。
2、JK插件需要知道把请求转发给哪个Tomcat服务器上的哪个连接器,
也就是需要知道该连接器的通讯协议和地址。
3、JK插件需要知道它负责处理的URL,以便通知Web服务器把这些URL转交给它处理;另外,
一个JK插件可以向多个Tomcat服务器转发请求,它需要知道哪些URL应转发给哪个Tomcat服务器。
4、JK本身的一些配置信息,例如,记录日志的文件路径、记录日志的级别等信息,如果第2和第3个问题
都在各自的一个属性文件中进行设置,那么,还需要告诉这两个属性文件的位置路径。
在workers.properties文件中设置了与JK插件进行连接的每个Tomcat实例的属性。
每个Tomcat实例的属性由“.”符号分隔成三部分组成。
第一部分固定为“worker”;
第二部分是为要连接的一个Tomcat实例的名称;
第三部分就是具体的属性名称。
每个真实的Tomcat实例至少需要设置下面的三个属性:
type,指定Tomcat实例中负责与JK相连的那个连接器所使用的协议类型。
host,指定Tomcat实例的主机名或IP地址。
port,指定Tomcat实例中负责与JK相连的那个连接器所监听的端口。
在workers.properties文件中,还需要设置worker.list属性来指定JK插件所要连接的Tomcat实例的名称,
如果JK要连接多个Tomcat实例,每个Tomcat实例的名称之间使用逗号分隔。
在workers.properties文件中还可以将某个Tomcat实例的type属性设置为lb,表示这个Tomcat实例并不指向
真正的Tomcat服务器,而是代表一个实现负载均衡的系统,代表负载均衡系统的Tomcat实例是一种虚拟的
Tomcat实例,它没有host和port属性,而是需要设置一个balance_workers属性。balance_workers属性中
列出了组成该负载均衡系统的所有其他真实的Tomcat实例的名称。参与了一个负载均衡系统的
每个Tomcat实例的名称不能出现在work.list属性中。
在uriworkermap.properties文件中设置Web服务器需要转发给Tomcat服务器去处理的URL,
以及处理每个URL的Tomcat实例名称。其中,每行等号左边的内容表示要转发给
Tomcat服务器处理的URL,可以使用“*”通配符来匹配一组URL,等号右边是处理
该组URL的Tomcat实例的名称,该名称必须是在worker.properties文件中定义的名称。 - Tomcat与IIS服务器集成
1、下载并安装JK插件
下载
在IIS安装JK插件,就是要把JK插件安装为一个ISAPI筛选器。
还必须将JK插件所在的目录设置为某个站点下的一个具有执行许可权限的虚拟目录。
2、编写workers.properties和uriworkermap.properties文件
提示:Tomcat与IIS可以位于不同的计算机上,并且一个IIS服务器可以与多个不同计算机上的
Tomcat服务器进行集成,JK插件相关的配置文件都应该放置在IIS服务器所在的计算机上,
而不用放置在任何Tomcat服务器上。
3、设置JK插件的属性
isapi_redirect.properties设置workers.properties和uriworkermap.properties文件的路径属性。
4、测试配置是否成功 - Tomcat与Windows系统下的Apache服务器集成
1、下载并安装Apache服务器
下载
安装
启动
2、下载并安装JK插件
将下载的供Apache服务器使用的JK插件文件改名为mod_jk.so后,复制到<APACHE_HOME>\modules
目录中,然后在Apache的httpd.conf配置文件中增加一条loadMoudle指令即可。
3、设置配置信息
httpd.conf
#加载JK插件模块
LoadModule jk_module modules/mod_jk.so
#配置Tomcat服务器的信息
JkWorkerPropertity worker.list=worker1
JkWorkerPropertity worker.worker1.port=8009
JkWorkerPropertity worker.worker1.host=localhost
JkWorkerPropertity worker.worker1.type=ajp13
#指定生成JK插件的日志文件的目录
JkLogFile logs/mod_jk.log
#指定JK插件的日志文件的级别
JkLogLevel debug
#设置JK插件的路径映射信息
JkMount /*.jsp worker1
JkMount /myweb/* worker1
如果Tomcat服务器的配置信息和JK插件的URL路径映射信息比较复杂,
也可以将它们分别放在workers.properties和uriworkermap.properties文件中编写,
然后在httpd.conf文件中使用两条指令来说明这两个文件的位置路径。
workers.properties
worker.list=worker1
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
uriworkermap.properties
/*.jsp=worker1
/myweb/*=worker1
httpd.confg
#加载JK插件模块
LoadModule jk_module modules/mod_jk.so
#配置Tomcat服务器的信息
JkWorkersFile conf/workers.properties
#指定生成JK插件的日志文件的目录
JkLogFile logs/mod_jk.log
#指定JK插件的日志文件的级别
JkLogLevel debug
#设置JK插件的路径映射信息
JkMountFile conf/uriworkermap.properties
4、测试配置是否成功