tomcat服务的原理和使用

一、tomcat与服务器的关系

服务器是指安装了服务器软件的计算机,而服务器软件是指接收用户请求,处理请求,返回请求结果的程序,常见的服务器软件有tomcat、iis等,也称为web容器。在服务器软件中可以部署web项目,用户可以通过浏览器来访问这些项目。

tomcat具有跨平台功能,支持windows、linux系统,它是基于Java中提供的NIO技术开发出来的,具有很高的运行效率,目前由apche公司维护。toomcat主要作用是接收http请求,将其转发到具体的servlet处理程序,再将其处理结果返回给客户端,以下是tomcat的架构图:

tomcat服务的原理和使用

客户端向服务器请求的资源分为两类,一类是静态资源,比如img、mp3、css、html、js等,这类资源在服务器中时直接返回的,它可以被浏览器直接解析;一类是动态资源 ,比如jsp、php文件,这类资源需要被一个叫做servlet的程序处理为静态资源类型后再返回给浏览器。

二、tomcat的安装目录说明

运行tomcat:进入官网www.apache.org选择合适自己系统的版本,下载解压到安装目录(不同的操作系统与很多不同的安装方式)。打开安装目录会发现如下几个文件夹:

◉bin目录:包含所有可执行的二进制程序,其中就包含tomcat的启动文件startup和停止文件shutdown。

◉conf目录:保存核心配置文件。

◉lib目录:是类加载路径,保存了与tomcat运行相关的jar文件。

◉log目录:保存tomcat的日子信息。

◉webapps目录:是tomcat的热部署目录,可以直接实现项目的发布。初始的tomcat内部包含了五个默认文件夹docs、examples、host-manager、manager、ROOT,提供了tomcat本身的一些管理页面和示例web,当通过localhost:8080访问默认显示的就是这些目录下的内容。

◉work目录:是tomcat生成的临时文件目录。

三、tomcat的运行和注意事项

◉首先需要在宿主机上安装jdk并配置JAVA_HOME环境变量。打开tomcat安装目录/bin,运行startup文件(windows系统为start.bat,linux为start.sh)即可启动运行窗口,访问localhost:8080即可访问tomcat管理界面。

◉如果运行一闪而过可能是没有正确的配置JAVA_HOME或者端口被占用或者,具体需要查看运行日志来解决问题。

◉如果运行窗口中出现中文乱码,请修改配置文件conf/logging.properties中java.util.logging.ConsoleHandler.encoding = GBK,重启即可。

◉部署vue项目时,如果刷新页面出现404,则需要在项目目录下新增WEB-INF/web.xml文件,内容如下:

"1.0" encoding="UTF-8"?>
"http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1" metadata-complete="true">
  系统描述
  WEB端

      404
      /index.html

◉tomcat服务器的默认端口为8080,可在conf/server.xml文件中修改如下节点的port属性,改为自己想要的端口:

"8080" protocol="HTTP/1.1" connectionTimeout="20000"  redirectPort="8443" />

◉绑定域名:默认我们输入localhost来访问,localhost代表本机地址127.0.0.1,如果我们想要使用域名来访问,可以修改本机hosts文件来模拟,设置域名映射 127.0.0.1 www.tomcatserver.com ,即可在本机通过www.tomcatserver.com访问。也可向域名服务商申请真实域名来绑定IP访问。

◉Tomcat安全配置建议:正式部署应用关闭角色登录管理功能,同时移除自带的web程序;修改默认的关机命令端口8005以及命令名称;关闭资源文件的列表功能。

◉启用https传输协议:https的全称是超文本传输安全协议(Hypertext Transfer Protocol Secure ),是一种网络安全传输协议。在HTTP的基础上加入SSL/TLS来进行数据加密,保护交换数据不被泄露、窃取。tomcat支持https协议,使用该协议需要证书,证书一般需要向证书管理机构申请,然后与域名绑定,这种证书是受浏览器信任的证书,还有一种是自签证书,这种证书是免费的本地签发的。可以使用Keytool工具生成证书,配置过程如下:

1、cmd运行命令” keytool -genkey -alias tomcat -keyalg RSA -keystore tomcatkey.keystore -validity 888″,根据提示输入密钥库口令、姓氏、组织名称、城市区域、国家地区代码、Y等完成一系列步骤后就会产生一个名为tomcatkey.keystore的证书文件。

2、将生成的.keystore证书文件移动到tomcat的conf文件夹下。

3、修改配置文件conf/server.xml,增加一个连接器Connector,内容如下:

<Connector port="8443" 
protocol
="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150"
SSLEnabled
="true"> <SSLHostConfig> <Certificate certificateKeystoreFile="conf/tomcatkey.keystore" certificateKeystorePassword="123456" type="RSA" /> SSLHostConfig> Connector>

4、访问https://localhost:8443即可通过https协议访问。

◉默认tomcat为了项目的部署安全,将列表显示功能直接关闭了,如果想要显示web项目虚拟路径下的资源文件列表,就在conf/web.xml文件中修改listings配置项开启列表功能。

 <servlet>
        <servlet-name>defaultservlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServletservlet-class>
        <init-param>
            <param-name>debugparam-name>
            <param-value>0param-value>
        init-param>
        <init-param>
            <param-name>listingsparam-name>
            <param-value>falseparam-value>
        init-param>
        <load-on-startup>1load-on-startup>
    servlet>

◉默认情况下,无法通过通过http://localhost:8080/欢迎页面中的ManagerApp、HostManager、ServerStatus按钮进入到管理页面,要想访问这些页面则需要在conf/tomcat-users.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="admin-gui"/>
  <role rolename="manager-gui"/>
  <role rolename="manager-script"/>
  <role rolename="manager-jmx"/>
  <role rolename="manager-status"/>
  <user username="admin" password="admin" roles="admin-gui,manager-script,manager-jmx,manager-status,manager-gui"/>

tomcat-users>

如果需要在非宿主机上访问,还需再修改webapps/manager/META-INF/content.xml文件和webapps/host-manager/META-INF/content.xml文件中的value节点的allow属性(代表可访问的ip):


  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="\d+\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />

◉tomcat中可以运行多个web项目,其部署方式有如下几种:

a.在webapps中直接创建web项目目录,该目录在需要包含一个WEB-INF子目录,子目录下包含一个该项目的web.xml配置文件,格式如下:

xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0" metadata-complete="true">

  <display-name>web项目显示的名称display-name>
  <description>
     Web项目描述
  description>
web-app>

b.在webapps文件夹之外创建web项目路径,该目录同样需要包含一个WEB-INF子目录,子目录下包含一个该项目的web.xml配置文件,然后在conf/server.xml中的Host节点下增加Context 节点,代码如下:

xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  GlobalNamingResources>
  <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">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      Realm>

      <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="/static" docBase="D:\static" reloadable="true" crossContext="true">Context>

       <Context path="/web1" docBase="H:\web\web1" />
      Host>
    Engine>
  Service>
Server>

◉在访问web项目或者静态资源时,常需要通过localhost:8080/web/index.html格式来访问,如果我们想去掉虚拟路径,直接通过localhost:8080/index.html来访问,则可以在conf/server.xml文件对应web项目的Context节点中修改path为”/”即可,但是要保证访问的资源是唯一的,不与其他web项目资源冲突,不然可能会报错。

◉如果我们部署的web项目是jsp动态应用程序,则在第一次访问jsp程序时,tomcat会先将jsp文件转换为.java程序代码(存放在work目录中),再编译为.class字节码文件(存放在work目录中),再用*.class字节码文件执行输出,因此首次访问jsp页面加载比较慢。

◉Idea开发工具与tomcat整合实现项目在tomcat中运行和调试:

tomcat服务的原理和使用

tomcat服务的原理和使用

tomcat服务的原理和使用

四、Tomcat的WebSocket功能

Websocket是HTML5新增的协议,它的目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,比如说,服务器可以在任意时刻发送消息给浏览器。

为什么传统的HTTP协议不能做到websocket实现的功能?

这是因为HTTP协议是一个请求–响应协议,请求必须先由浏览器发给服务器,服务器才能响应这个请求,再把数据发送给浏览器。换句话说,浏览器不主动请求,服务器是没法主动发数据给浏览器的。
这样一来,要在浏览器中搞一个实时聊天,或者在线多人游戏的话就没法实现了,只能借助Flash这些插件。也有人说,HTTP协议其实也能实现啊,比如用轮询或者comet。轮询是指浏览器通过JavaScript启动一个定时器,然后以固定的间隔给服务器发请求,询问服务器有没有新消息。这个机制的缺点一是实时性不够,二是频繁的请求会给服务器带来极大的压力。
Comet本质上也是轮询,但是在没有消息的情况下,服务器先拖一段时间,等到有消息了再回复。这个机制暂时地解决了实时性问题,但是它带来了新的问题︰以多线程模式运行的服务器会让大部分线程大部分时间都处于挂起状态,极大地浪费服务器资源。另外,一个HTTP连接在长时间没有数据传输的情况下,链路上的任何一个网关都可能关闭这个连接,而网关是我们不可控的,这就要求comet连接必须定期发一些ping数据表示连接正常。

websocket的特点:

◉websocket的发起方必须是浏览器,请求方式为ws://开头。

◉请求头connection: Upgrade和请求头upgrade: websocket表示这个连接将要被转换为 websocket 连接。

◉sec-Websocket-Key是用于标识这个连接,是一个BASE64编码的密文,要求服务端响应一个对应加密的sec-web$ocket-Accept头信息作为应答。

◉sec-websocket-version指定了websocket的协议版本。

◉HTTP101状态码表明服务端已经识别并切换为websocket协议,sec-Websocket-Accept是服务端与客户端一致的秘钥计算出来的信息。

tomcat7.0.5以后开始支持websocket,实现了java WebSocket的标准规范,java WebSocket应用由一系列的WebSocketEndpoint组成,Endpoint是java对象,表示Websocket连接的一端。我们可以通过编程或注解的方式实现Endpoint功能。Endpoint实例在Websocket握手时创建,并在客户端与服务端链接过程中有效,最后在连接关闭时结束。在Endpoint接口中明确定义了与其生命周期相关的方法,规范实现者确保生命周期的各个阶段调用实例的相关方法。

五、tomcat配置文件解读

1、\conf\server.xml配置文件主要是用于配置服务器信息,内容说明如下:

xml version="1.0" encoding="UTF-8"?>

<Server port="8005" shutdown="SHUTDOWN">

  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />

  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <GlobalNamingResources>

    <Resource name="UserDatabase"
              auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />

  GlobalNamingResources>

  <Service name="Catalina">

    <Connector port="8080"
               protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

      <Connector port="8009"
               protocol="AJP/1.3"
               redirectPort="8443" />

    <Engine name="Catalina" defaultHost="localhost">

      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"  resourceName="UserDatabase"/>
      Realm>

      <Host name="localhost"
            appBase="webapps"
            unpackWARs="true"
            autoDeploy="true">

         <Alias>www.localhost.comAlias>

          <Valve className="org.apache.catalina.valves.AccessLogValve"
               directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />

           <Context docBase="D:/myweb" path="/myApp" >

           Context>
      Host>

    Engine>

     <Executor name="tomcatThreadPool"
             namePrefix="catalina-exec-"
             maxThreads = "500"
             minSpareThreads = "20"
             maxSpareThreads = "50"
             maxIdleTime = "60000"
             maxQueueSize = "Integer.MXA_VALUE"
             threadPriority="5"
             className="org.apache.catalina.core.standardThreadExecutor"
             prestartminSpareThreads="false" />

  Service>

Server>

2、web.xml文件主要是用于配置web应用的信息,该文件主要包含conf/web.xml默认配置文件和具体web项目下WEB-INF/web.xml定制配置文件,配置说明如下:

xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0"
metadata-complete="true">

<description>web项目描述description>
<display-name>显示的web项目名称,该名称将会显示在tomcat管理界面中display-name>

<icon>
    <small-icon>/images/small.gifsmall-icon>
    <large-icon>/images/large.girlarge-icon>
icon>

<context-param>
    <param-name>param_nameparam-name>
    <param-value>param_valueparam-value>
context-param>

<session-config>
    <session-timeout>30 session-timeout>
    <cookie-config>
        <name>cookienamename>
        <domain>wwev .itcast.cncomain>
        <path>/path>
        <comment>session cookiecomnent>
        <http-only>truehttp-only>
        <secure>false secure>
        <max-age>3600max-age>
    cookie-config>
    <traaking-mode>COOKIE traaking-mode>
session-config>

<filter>
    <filter-name>struts2filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterfilter-class>
filter>

<filter-mapping>
    <filter-name>struts2filter-name>
    <url-pattern>/*url-pattern>
filter-mapping>

<servlet>
    <servlet-name>ServletNameservlet-name>
    <servlet-class>xxxpackage.xxxServletservlet-class>
    <init-param>
        <param-name>参数名称param-name>
        <param-value>参数值param-value>
    init-param>
servlet>

<servlet-mapping>
    <servlet-name>ServletNameservlet-name>
    <url-pattern>/aaa/xxxurl-pattern>
servlet-mapping>

<listener>
    <listener-class>org.springframework.web.context.contextLoaderListenerlistener-class>
listener>

<welcome-file-list>
    <welcome-file>index.htmlwelcome-file>
    <welcome-file>index.xhtmlwelcome-file>
    <welcome-file>index.htmwelcome-file>
    <welcome-file>index.jspwelcome-file>
welcome-file-list>

<error-page>
    <error-code>404error-code>
    <location>/error404.jsplocation>
error-page>
<error-page>
    <exception-type>java.lang.Exceptionexception-type>
    <location>/except.jsplocation>
error-page>

web-app>

3、tomcat的管理配置,主要用于tomcat本身提供的两个管理功能host-manager、manager,host-manager用于管理虚拟主机,manager用于管理web应用。tomcat管理配置文件主要是tomcat-users.xml文件和\webapps\host-manager\WEB-INF\manager.xml。常用的权限配置已经在前一节讲过,此处不在讨论。

五、tomcat集群

使用nginx+tomcat可以实现tomcat集群部署,利用nginx的负载均衡功能实现,实现高可用。集群使用一台nginx反向代理服务器,2台以上tomcat服务器,其架构如下:

tomcat服务的原理和使用

Original: https://www.cnblogs.com/zqhIndex/p/16154107.html
Author: 我若安好,便是晴天
Title: tomcat服务的原理和使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612375/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • innobackupex备份源码解析

    目前MySQL的物理备份大多数采用xtrabackupex进行,其备份过程如下图所示,这里通过解析 xtrabackup 的源码来详细看看其是如何进行备份的,xtrabackup …

    数据库 2023年6月9日
    0104
  • python使用sys.path添加临时环境变量

    直接上代码: 1 # -*- coding: gbk -*- 2 import sys 3 4 sys.path.append(‘H:\project_py\jiJin’) # 把…

    数据库 2023年6月11日
    087
  • 【StoneDB】从库如何规避不支持的DML和DDL

    (以下情况仅针对StoneDB 1.0版本不支持的部分DML和DDL操作,StoneDB 2.0及以上版本将无需此类操作)在主从复制中,主库的任何更新都将同步到从库。如果从库不想重…

    数据库 2023年5月24日
    091
  • 类加载器及其加载原理

    概述 在之前的文章”类的加载流程”讲了一个Class文件从加载到卸载整个生命周期的过程,并且提到”非数组类在加载阶段是可控性最强的”…

    数据库 2023年6月11日
    0108
  • 会计学包含的两种程序设计思想

    下班路上坐地铁的时候看了一本会计学的书,目前看了50多页。过程中,发现会计学和程序设计在思想上有惊人的相似之处。今天举两个例子做说明。 CR设计和账簿 CR设计介绍 CR设计就是只…

    数据库 2023年6月6日
    090
  • Mysql 连续时间分组

    该方案不限于本例的连续时间,还可以应用于其他连续组。 [En] The scheme is not limited to the continuous time of this e…

    数据库 2023年5月24日
    078
  • 百万数据 mysql count(*)优化

    Original: https://www.cnblogs.com/sunshine-blast/p/16272978.htmlAuthor: 魁哥2020Title: 百万数据 …

    数据库 2023年5月24日
    081
  • SpringBoot 集成 JSP

    导致我写这个博客的原因是 在SpringBoot支持的模板引擎thymeleaf 下 前台页面仅支持HTML 可能用一些其他的前端框架 1、我们首先在IDEA中搭建一个项目,搭建项…

    数据库 2023年6月9日
    0134
  • Tomcat解压war包错误

    最近一个项目由于需要频繁发布,我又懒得把项目的war包和同名文件夹一起复制,一般发布war包等待war包自动解压来发布站点,当发布了39次时,war包解压异常最显著的信息是原来解压…

    数据库 2023年6月9日
    065
  • Java学习-第一部分-第三阶段-项目实战:满汉楼项目

    满汉楼项目 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 注意:笔记内容仅为实现该项目的基本后端功能,并不会实…

    数据库 2023年6月11日
    0105
  • 力扣数据库题目182查找重复的电子邮箱

    力扣数据库题目182查找重复的电子邮箱 题目 编写一个 SQL 查询,查找 Person 表中所有重复的电子邮箱。 示例: +—-+——&#82…

    数据库 2023年6月9日
    083
  • Asp.Net Core 发布和部署( MacOS + Linux + Nginx )

    在上篇文章中,主要介绍了 Dotnet Core Run 命令,这篇文章主要是讲解如何在Linux中,对 Asp.Net Core 的程序进行发布和部署。 有关如何在 Jexus …

    数据库 2023年6月11日
    0110
  • 从 KeyStore 中获取 PublicKey 和 PrivateKey

    KeyStore(译:密钥存储库) 代表用于加密密钥和证书的存储设施。 KeyStore 管理不同类型的 entry(译:条目)。每种类型的 entry 都实现了 KeyStore…

    数据库 2023年6月14日
    0104
  • Variable used in lambda expression should be final or effectively final

    java的lambda表达式里不能出现变量,必须是final修饰的,但是可以让变量在定义时候计算【新函数】出结果,这样就不算变量了。可以使用lambda表达式,不再报错。例如 bo…

    数据库 2023年6月9日
    094
  • MYSQL事务篇(高级篇)

    1.事务介绍: 一般是指要做的或所做的事情。 在计算机 术语 中是指访问并可能更新数据库中各种 数据项 的一个程序 执行单元 (unit) 2.数据库事务具有ACID四大特性 。 …

    数据库 2023年5月24日
    077
  • 用相对定位实现简单的图片边框阴影效果

    实现阴影效果方法有很多,一般复杂一点的外发光式的阴影都使用png作为背景图片来实现阴影,今天做的这个比较简单,阴影是纯色的,所以可以直接使用背景颜色,图片的位移一下就能使图片产生阴…

    数据库 2023年6月11日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球