tomcat深入了解

tomcat是Apache 服务器的扩展,属于Apache的一部分。但是tomcat运行时,它实际上作为一个与Apache 独立的进程单独运行的。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合

下被普遍使用,是开发和调试JSP 程序的首选
Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功

能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。
1.启动tomcat:apache-tomcat-8.5\bin\startup 关闭:apache-tomcat-8.5\bin\shutdown (双击即可)
2.部署项目位置:
通过eclipse 来部署的项目通常都在apache-tomcat-8.5下新建一个wtpwebapps;里面包含一个root文件和你部署的项目
手动配置的话 都是把编译好的项目或者.war文件 丢在apache-tomcat-8.5\webapps里面即可 在启动tomcat就可以访问
网页地址:localhost:8080/项目名。。。


3.修改你访问地址,把localhost改成你想要的访问地址
 直接修改tomcat里conf里server.xml里的<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">把其中localhost改成你想的域名 肯定没有效果的你得修改
C:\WINDOWS\system32\drivers\etc\hosts文件,在最下面加上:
 127.0.0.1       localhost
 127.0.0.1       xxxxxx(修改你想要的域名)

 然后再去<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">把localhost改成你先才加的域名关闭tomcat  重启tomcat再去网页访问   绝逼可以啦


4.使用tomcat 主要的还是配置server.xml里的一些参数 但是我们的先了解它的构造 才可以更清晰的去使用它的配置
  tomcat主要配置构成

<?xml version="1.0" encoding="UTF-8"?>
 <!--Server 顶级元素 port:监听Tomcat的shutdown命令端口号.用于终止服务器运行;shutdown:终止Tomcat服务器运行时,发给Tomcat服务器shutdown监听端口的字符串 -->
 <Server port="8005" shutdown="SHUTDOWN">
  <!--都是监听 输出应用的server和OS等信息 可注释-->
  <Listener className="org.apache.catalina.startup.VersionLoggerListener"/>
  <!--加载APR  及初始化 -->
  <Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/>
  <!--监听内存泄露 -->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
  <!-- 作用于全局资源,保证 JNDI 对资源的可达性,比如数据库-->
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>

  <!-- 定义JNDI(Java 命名和目录接口)资源,其允许 Java 软件客户端通过名称搜寻和查找数据。 
       定义了一个名称为 UserDatabase 的 JNDI,通过”conf/tomcat-users.xml“得到了一个用于用户授权的内存数据库。
   你也可以定义其它全局化JNDI资源来实现连接池,比如 MySQL 数据库。-->
  <GlobalNamingResources>
    <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
  </GlobalNamingResources>

   <!--接受所有直接由Tomcat服务器接收的web客户请求 如果是<Service name="Apache">则是处理所有由Apahce服务器转发过来的Web客户请求
       一个 Service 可以连接一个或多个 Connectors 到一个引擎。默认配置定义了一个名为“Catalina”的 Service ,连接了两个 Connectors:HTTP 和 AJP 到当前的引擎-->
  <Service name="Catalina">
  
     <!--connectionTimeout:在链接获得同意之后,获得请求 URI line(请求信息)响应的最大等待时间毫秒数。默认为20秒 port:端口号 
  protocol:处理 HTTP 请求,使得 Tomcat 成为了一个 HTTP 服务器 redirectPort:把 SSL 请求重定向到 TCP 的8443端口-->
    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
<!--AJP/1.3:Apache JServ Protocol connector 处理 Tomcat 服务器与 Apache HTTP 服务器之间的交互 
  可以将 Tomcat 和 Apache HTTP 服务运行在一起,Apache HTTP 服务器处理静态请求和 PHP;Tomcat 服务器负责处理 Java Servlet/JSP 。
  可以参阅“Tomcat 与 Apache 协同工作如何配置”。-->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>

<!--包含了 Engine、Host、Context和 Cluster 的 Tomcat 称为容器。最高级的是 Engine,最底层的是 Context。某些组件,比如 Realm 和 Valve,也可以放在容器中。-->
<!--引擎(Engine)是容器中最高级别的部分。可以包含一个或多个 Host。Tomcat 服务器可以配置为运行在多个主机名(就是Host里的name="主机名")上,包括虚拟主机。 
  Catalina 引擎 从 HTTP connector 接收 HTTP 请求,并根据请求头部信息中主机名或 IP 地址重定向到正确的主机上
  说白啦就是处理在同一个<Service>中所有<Connector>元素接收到的客户请求;
  defaultHost:默认主机名,定义了处理指向该服务器的请求所在主机的名称,但名称不是在这个文件中配置; 
  Engine 的逻辑名称,用在日志和错误信息中。当在相同的 Server 中使用多个 Service 元素时,每个 Engine 必须指定一个唯一的名称;
  其实还有些属性没有配置出来的; jvmRoute:在负载均衡场景下必须定义该参数,来保证 session affinity 可用,
  对于集群中所有 Tomcat 服务器来讲定义的名称必须是唯一的, 该名称将会被添加到生成的会话标示符中,
  因此,允许前端代理总是将特定会话转发到同一个 Tomcat 实例;   startStopThreads:Engine 在启动 Host 子元素时将会并发使用的线程数目。如果设置为0,
  将会使用 Runtime.getRuntime().availableProcessors() 的值。设置为负数,将会使用  Runtime.getRuntime().availableProcessors() + value 的值,
  如果结果小于1,将会使用 1 个线程。如果没有指定,默认值为 1 。-->
    <Engine defaultHost="localhost" name="Catalina">
   <!-- 一个 Realm(域)就是一个包含 user、password 和 role 认证(比如访问控制)的数据库。你可以在任何容器中定义 Realm ,
        例如 Engine、Host、Context 和 Cluster;
默认配置定义了一个 Catalina Engine 的 Realm(UserDatabaseRealm),对用户访问 engine 的权限进行控制。
其使用定义在 GlobalNamingResources 中,名字为 UserDatabase 的 JNDI。
      除了 UserDatabaseRealm 以外,还有:JDBCRealm(授权用户是否可以通过 JDBC 驱动链接到关系型数据库);
      DataSourceRealm(通过 JNDI 连到数据源);JNDIRealm(连接到一个 LDAP 目录)和 MemoryRealm (将 XML 文件加载到内存)。-->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      </Realm>
  <!-- 一个 Host 定义了在 Engine 下的一个虚拟机,反过来其又支持多个 Context(web 应用)。
     name:默认配置定义了一个名为 localhost 的主机;appBase:虚拟机应用的根目录。该目录是一个可能包含部署到虚拟机上 web 应用的路径名。
     也可能是一个指定的绝对路径名,或者是一个相对于 $CATALINA_BASE 目录的路径名。如果没有指定,默认会使用 webapps。
     默认的 Tomcat 安装目录的 webapps 下提供了四个 web 应用:docs、examples、host-manager 和 manager。只有 ROOT 是个例外,它用一个空字符串定义。
     也就是说,它的 URL 是  http://localhost:8080/。通常发布的web项目都在这个目录下;
     unpackWARs 属性指定了放到 webapps 目录下的 WAR-file 是否应该被解压。
     对于 unpackWARs=”false“,Tomcat 将会直接从 WAR-file 运行应用,而不解压,这可能导致应用运行变慢。
     autoDeploy 属性指定了是否自动部署放到 webapps 目录下的应用-->
      <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
   <!--Valve (阀门)作为请求的前置处理程序,可以在请求发送到应用之前拦截 HTTP 请求。可以定义在任何容器中,比如 Engine、Host、Context和 Cluster。
        默认配置中,AccessLogValve 会拦截 HTTP 请求,并在日志文件中创建一个日志切入点 -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log" suffix=".txt"/>
        
<!--它由Context接口定义.是使用最频繁的元素.每个<Context元素代表了运行在虚拟主机上的单个Web应用.一个<Host>可以包含多个<Context>元素.每个web应用有唯一
            的一个相对应的Context代表web应用自身.servlet容器为第一个web应用创建一个 
            docBase:web项目布置的路径 path:web项目访问入口 reloadable:Tomcat服务器在运行状态下会监视在WEB-INF/classes和Web-INF/lib目录CLASS文件的改运.
如果监视到有class文件被更新,服务器自重新加载Web应用-->
<Context docBase="D:\tomcat-Test\apache-tomcat-8.5\webapps\A-Run" path="/A-Run" reloadable="true" />
  </Host>
    </Engine>
  </Service>

</Server>

注意;

   service的定义主要是为了关联connector和container容器;其中connector主要负责浏览器发过来的请求,创建一个request和response与请求端交互数据;然后会产生一个线程来处理这个请求,并把产生的request和response传给处理这个请求的线程;那么处理这个请求线程的事就交给container容器啦。(一个container对应多个connector)那么container容器怎么处理请求的呢;就是交给他的4个子容器啦:Engine-Host-wrapper

 


 


 


 


 

 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页