Tomcat(一)

Apache架构模型

Prefork

定义:Prefork是一种多进程模型,服务器在启动时会创建多个子进程,每个子进程都可以独立处理客户端的请求。
优点:
    进程间相互独立,一个进程崩溃不会影响其他进程。
    适合长连接和持久连接的处理。
缺点:
    资源消耗大,每个进程都需要独立的内存空间和资源。
    进程间通信(IPC)复杂,上下文切换开销较大。
适用场景:适合连接数不是特别多,但每个连接都需要消耗较多资源的场景。

Worker

定义:Worker指的是在服务器中负责处理实际工作的进程或线程。在Prefork模型中,每个子进程都是一个Worker;在多线程模型中,每个线程也是一个Worker。
优点:
    可以根据负载动态调整Worker的数量,提高资源利用率。
    相对于多进程模型,多线程模型的上下文切换和通信开销较小。
缺点:
    线程安全问题需要特别注意,不当的同步可能导致竞态条件或死锁。
    单个线程的崩溃可能影响整个进程的稳定性。
适用场景:适合需要大量并发处理,但每个连接处理相对简单快速的场景。

Event

定义:Event驱动模型是一种非阻塞I/O模型,服务器通过事件通知机制来异步处理I/O操作,通常与多线程或协程结合使用。
优点:
    高效地处理大量并发连接,尤其是对于短连接和非持久连接。
    资源消耗相对较低,因为不需要为每个连接创建独立的进程或线程。
    非阻塞I/O可以提高I/O操作的响应速度。
缺点:
    编程模型相对复杂,需要合理设计事件处理逻辑。
    对于长连接和持久连接的处理不如Prefork模型直观。
适用场景:适合需要处理大量并发短连接,且每个连接处理相对简单快速的场景。

总结梳理与对比

资源消耗:Prefork > Worker > Event。Prefork由于每个连接都需要独立的进程,资源消耗最大;Worker通过多线程可以减少资源消耗;Event模型通过非阻塞I/O和事件通知机制,可以在较少的资源消耗下处理大量并发连接。
适用场景:Prefork适合连接数不多但每个连接需要较多资源的场景;Worker适合需要大量并发处理的场景;Event适合处理大量并发短连接的场景。

JDK

Java SE API:Java基础类开发接口

JRE:Java运行时环境,包含JVM+Java核心类库

JDK:Java软件开发工具包。JDK包含JRE

安装

官网下载地址:https://www.oracle.com/java/technologies/downloads/

----------------------------------------二进制安装
[root@wenzi ~]#ls
jdk-11.0.19_linux-x64_bin.tar.gz
[root@wenzi ~]#tar -xf jdk-11.0.19_linux-x64_bin.tar.gz -C /usr/local/
[root@wenzi ~]#cd /usr/local/
[root@wenzi local]#ln -s jdk-11.0.19/ jdk
[root@wenzi local]#vim /etc/profile.d/jdk.sh
#!/bin/bash
export JAVA_HOME=/usr/local/jdk/
export PATH=$JAVA_HOME/bin:$PATH
[root@wenzi local]#. /etc/profile.d/jdk.sh
[root@wenzi local]#java -version
java version "11.0.19" 2023-04-18 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.19+9-LTS-224)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.19+9-LTS-224, mixed mode)
[root@wenzi local]#jps		#列出在你的 Java 虚拟机(JVM)上运行的所有 Java 进程
1591 Jps

Tomcat

介绍

Tomcat是一个免费的、开放源代码的Web应用服务器,属于轻量级应用服务器。它是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。Tomcat在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。

安装

安装Tomcat前需要先配置JDK

官方下载地址:https://tomcat.apache.org/download-80.cgi

----------------------------------------二进制安装
[root@wenzi ~]#ls
apache-tomcat-9.0.75.tar.gz  jdk-11.0.19_linux-x64_bin.tar.gz
[root@wenzi ~]#tar -xf apache-tomcat-9.0.75.tar.gz -C /usr/local/
[root@wenzi ~]#ln -s /usr/local/apache-tomcat-9.0.75 /usr/local/tomcat
[root@wenzi ~]#echo 'PATH=/usr/local/tomcat/bin:$PATH' > /etc/profile.d/tomcat.sh
[root@wenzi ~]#. /etc/profile.d/tomcat.sh
[root@wenzi ~]#catalina.sh version
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk/
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
Server version: Apache Tomcat/9.0.75
Server built:   May 4 2023 13:04:05 UTC
Server number:  9.0.75.0
OS Name:        Linux
OS Version:     5.15.0-92-generic
Architecture:   amd64
JVM Version:    11.0.19+9-LTS-224
JVM Vendor:     Oracle Corporation

启动tomcat。startup.sh 或 catalina.sh start
[root@wenzi ~]#startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk/
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
[root@wenzi ~]#ss -tnlp
LISTEN 0       1        [::ffff:127.0.0.1]:8005               *:*     users:(("java",pid=1871,fd=53))

LISTEN 0       100                       *:8080               *:*     users:(("java",pid=1871,fd=43))

查看进程,tomcat默认是以root身份启动的
[root@wenzi ~]#ps aux | grep tomcat
root        1871  1.1  4.9 2541888 97060 pts/0   Sl   21:17   0:02 /usr/local/jdk//bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start

关闭tomcat,shutdown.sh 或 catalina.sh start
[root@wenzi ~]#shutdown.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk/
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED

开启tomcat后通过端口号8080可访问默认首页
在这里插入图片描述

配置Service文件

[root@wenzi ~]#useradd -r -s /sbin/nologin tomcat
[root@wenzi ~]#vim /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/usr/local/jdk
[root@wenzi ~]#chown -R tomcat:tomcat /usr/local/tomcat/
[root@wenzi ~]#vim /lib/systemd/system/tomcat.service
[Unit]
Description=This is tomcat service
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target

[Service]
Type=forking
EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

[root@wenzi ~]#systemctl daemon-reload

文件结构

目录

  • bin:服务启动、停止等相关程序和文件
  • conf:配置文件
  • lib:库目录
  • logs:日志目录
  • webapps:应用程序,应用部署目录
  • work:jsp编译后的结果文件,建议提前预热访问。升级应用后,删除此目录数据才能更新
当启动tomcat后,访问默认首页后,可见首页文件已被编译。
[root@wenzi ~]#ls /usr/local/tomcat/work/Catalina/localhost/ROOT/org/apache/jsp/
index_jsp.class  index_jsp.java

配置文件

在tomcat安装目录的conf子目录中,有以下配置文件

  • server.xml:主配置文件
  • web.xml:每个webapp只有“部署”后才能被访问,部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置,每个web应用也可以使用专用配置来覆盖全局文件
  • context.xml:定义了所有web应用都需要加载的Context,此文件为所有的webapps提供默认配置,每个web应用也可以使用自己专属配制,它通常由专用的配置文件context.xml来定义,存放在WEB-INF/目录,覆盖全局文件
  • tomcat-users.xml:用户认证的账号和密码文件
  • catalina.policy:当使用security选项启动tomcat时,用于为tomcat设置安全策略
  • Catalina.properties:tomcat环境变量的配置,用于设定加载器路径,及一些与JVM调优相关参数
  • logging.properties:tomcat日志系统相关配置,可修改日志级别和日志路径

日志文件

catalina

catalina.out:标准输出和标准错误。包含tomcat运行自己输出的日志以及应用里向console输出的日志。此日志文件默认不会切割,需要人为切割,避免文件过大影响性能。

catalina.YYYY-MM-DD.log:tomcat自己运行的一些日志,除此还会输出到catalina.out。但应用向console输出的日志不会输出到catalina.YYYY-MM-DD.log中,它是tomcat启动、暂停时的运行日志

localhost

localhost.YYYY-MM-DD.log:主要是应用初始化(listen,filter,servlet)未处理的异常最后被tomcat捕获而输出的日志,也记录部分tomcat启动、暂停时的运行日志,没有catalina.YYYY-MM-DD.log全面

localhost_access_log.YYYY-MM-DD.txt:访问tomcat的日志,请求时间和资源,状态码都有记录

host-manager.YYYY-MM-DD.log

存放tomcat的自带的manager项目的日志信息

manager.YYYY-MM-DD.log

tomcat manager项目专有的日志文件

tomcat访问日志格式
[root@wenzi ~]#tail /usr/local/tomcat/conf/server.xml
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <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" />	#此符号&quot在html中表示双引号

      </Host>
    </Engine>
  </Service>
</Server>

查看访问日志
[root@wenzi ~]#tail /usr/local/tomcat/logs/localhost_access_log.2024-03-01.txt
192.168.28.1 - - [01/Mar/2024:00:36:02 +0800] "GET / HTTP/1.1" 200 11230

实现json格式日志。中间从 pattern="开始至/>中间无换行
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%l&quot;,&quot;authenticated&quot;:&quot;%u&quot;,&quot;AccessTime&quot;:&quot;%t&quot;,&quot;method&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;SendBytes&quot;:&quot;%b&quot;,&quot;Query?string&quot;:&quot;%q&quot;,&quot;partner&quot;:&quot;%{Referer}i&quot;,&quot;AgentVersion&quot;:&quot;%{User-Agent}i&quot;}"/>
               <!--   pattern="%h %l %u %t &quot;%r&quot; %s %b" /> -->#注释原日志格式

[root@wenzi ~]#systemctl restart tomcat.service
[root@wenzi ~]#tail -f /usr/local/tomcat/logs/localhost_access_log.2024-03-01.txt
{"clientip":"192.168.28.1","ClientUser":"-","authenticated":"-","AccessTime":"[01/Mar/2024:01:05:20 +0800]","method":"GET / HTTP/1.1","status":"200","SendBytes":"11230","Query?string":"","partner":"-","AgentVersion":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"}

格式化显示结果
{
  "clientip": "192.168.28.1",
  "ClientUser": "-",
  "authenticated": "-",
  "AccessTime": "[01/Mar/2024:01:05:20 +0800]",
  "method": "GET / HTTP/1.1",
  "status": "200",
  "SendBytes": "11230",
  "Query?string": "",
  "partner": "-",
  "AgentVersion": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
}

组件

组件分层和分类

顶级组件

Server,代表整个tomcat容器,一台主机可以启动多个tomcat实例,需要保证端口不冲突

服务类组件

Service,实现分层Engine和Connector,建立两者之间关联关系,service只能包含一个Engine

连接器组件

Connector,与HTTP(默认端口8080/tcp),HTTPS(默认端口8443/tcp)、AJP(默认端口8009/tcp)协议的连机器。AJP(Apache Jserv protocol)是一种基于tcp的二进制通讯协议

容器类

Engine、Host(虚拟主机)、Context(上下文件,解决路径映射)都是容器类组件,可嵌入其它组件,内部配置如何运行应用程序

内嵌类

可以内嵌到其它组件内,valve、logger、realm、loader、manager等

集群类

listener、cluster

Tomcat内部组成

在这里插入图片描述

Server:服务器,Tomcat运行的进程示实例,一个Server中可有多个service,但通常就一个

Service:服务,用来组织Engine和Connector的对应关系,一个service中只有一个Engine

Connector:连接器,负责客户端的HTTP,HTTPS、AJP等协议连接,一个Connector只属于某一个Engine

Engine:引擎,用来响应并处理用户请求,一个Engine可绑定多个Connector

Host:虚拟主机,可实现多虚拟主机,例如使用不同的主机投划分

Context: 应用上下文,配置特定url路径映射和目录的映射关系:url --> directory

核心组件

  • Tomcat启动一个Server进程。可以启动多个Server,即tomcat的多实例,但一般只启动一个

  • 创建一个Service提供服务。 可以创建多个Service,但-般也只创建一个;每个Service中, 是Engine和其连接器Connector的关联配置

  • 可以为这个Service提供多个连接器Connector,这些Connector使用 了不同的协议,绑定了不同的端口。其作用就是处理来自客户端的不同的连接请求或响应

  • Service内部还定义了Engine, 引擎才是真正的处理请求的入口,其内部定义多个虚拟主机Host。Engine对请求头做了分析,将请求发送给相应的虚拟主机;如果没有匹配,数据就发往Engine.上的defaultHost缺省虚拟主机;Engine上的缺省虚拟主机可以修改

  • Host义虚拟主机,虚拟主机有name名称,通过名称匹配

  • Context定义应用程序单独的路径映射和配置

<?xml version='1.0' encoding='utf-8'?>

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

  <Service name="Catalina">

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

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

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

        <Context />
      </Host>
    </Engine>
  </Service>
</Server>

Tomcat处理请求过程

在这里插入图片描述

设客户的请求为:http://localhost:8080/test/index.jsp

  1. 浏览器端的请求被发送到服务端端口8080,Tomcat进程监听在此端口上。通过侦听的HTTP/1.1 Connector获得此请求。
  2. Connector把该请求交给它所在的Service的Engine来处理, 并等待Engine的响应
  3. Engine获得请 求localhost:8080/test/index.jsp,遍历它所有虚拟主机Host
  4. Engine匹配到名为localhost的Host。 如果匹配不到,就把请求交给该Engine中的defaultHost处理
  5. localhost Host获得请求/test/index.jsp, 匹配它所拥有的所有Context
  6. Host匹配到路径为/test的Context
  7. path=/test的Context获得请求index.jsp, 在它的mapping table中寻找对应的servlet
  8. Context匹配到URL PATTERN为* . jsp的servlet, 对应于JspServlet类构造HttpServletRequest对象和HttpServletResponse对象, 作为参数调用spServlet的doGet或doPost方法。

Java应用部署

根目录结构

特殊变量

CATALINA_HOME:指Tomcat安装的根路径

CATALINA_BASE:指特定的Tomcat实例在运行时配置的根路径。如果在一台tomcat中配置多个Tomcat实例,可用CATALINA_BASE属性。如后面tomcat配置多网站时使用的启动脚本ins.sh中设定的export CATALINA_BASE=“/usr/local/tomcat/webapp1”

当CATALINA_HOME和CATALINA_BASE两个属性同时存在且两者路径不同,则CATALINA_HOME路径包含的是静态资源,例如.jar文件,或者二进制文件;CATALINA_BASE路径包含的是配置文件、log日志文件、部署的应用程序和其它运行时所需的资源。

Tomcat中默认网站根目录是$CATALINA_BASE/webapps/

在Tomcat中部署主站应用程序和其它应用程序,与nginx不同

在nginx中

假设在nginx中部署2个网站应用eshop、forum,若网站根目录是/data/www/html,部署位置如下:eshop解压缩所有文件放到/data/www/html/目录下,forum的文件放到/data/www/html/forum/下,则网站链接有如下对应关系:

http://localhost/ 对应eshop的应用,即/data/www/html/

http://localhost/forum/ 对应forum的应用,即/data/www/html/forum

在tomcat中

Tomcat中默认网站根目录是 C A T A L I N A B A S E / w e b a p p s / , CATALINA_BASE/webapps/, CATALINABASE/webapps/CATALINA_BASE/webapps/下的每一个目录都对应一个web应用;在tomcat的webapps目录中有个非常特殊的目录ROOT,它就是网站默认根目录。

若将eshop的文件放在 C A T A L I N A B A S E / w e b a p p s / R O O T 中, f o r u m 的文件放到 CATALINA_BASE/webapps/ROOT中,forum的文件放到 CATALINABASE/webapps/ROOT中,forum的文件放到CATALINA_BASE/webapps/forum目录中,则网站链接有如下对应关系:

http://localhost/ 对应eshop,即$CATALINA_BASE/webapps/ROOT/

http://localhost/forum/ 对应forum,即$CATALINA_BASE/webapps/forum/

若同时存在 C A T A L I N A B A S E / w e b a p p s / R O O T / f o r u m 和 CATALINA_BASE/webapps/ROOT/forum和 CATALINABASE/webapps/ROOT/forumCATALINA_BASE/webapps/forum,仍以$CATALINA_BASE/webapps/forum优先生效

每一个虚拟主机都可以使用appBase指令配置自己的站点目录,使用appBase目录下的ROOT目录作为主站目录。

JSP WebApp目录结构

$CATALINA_BASE/webapps下面的每个目录对应的WebApp,可能有以下子目录,但下面子目录是非必须的

  • 主页配置:默认按以下顺序查找主页文件 index.html,index.htm、index.jsp
  • WEB-INF/:当前目录WebApp的私有资源路径,通常存储当前应用使用的web.xml和context.xml配置文件
  • META-INF/:类似于WEB-INF,也是私有资源的配置信息,和WEB-INF/目录一样浏览器无法访问
  • classes/:类文件,当前webapp需要的类
  • lib/:当前应用依赖的jar包

主页设置

修改全局配置的默认主页文件

默认情况下 tomcat 会在$CATALINA_BASE/webapps/ROOT/目录下按index.html、index.htm、index.jsp 次序查找文件,找到第一个则进行显示。

[root@wenzi ~]#tail  /usr/local/tomcat/conf/web.xml
...
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>	#可手动修改文件及顺序
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

WebApp的专用配置文件
针对主站点根目录设置专用配置文件
[root@wenzi ~]#vim /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml
<web-app xmlns="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_4_0.xsd"
  version="4.0"
  metadata-complete="true">

  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>
#########新增内容  
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
#########
</web-app>

针对特定APP目录设置专用配置文件

现有网站web1

[root@wenzi ~]#cp -a webapps/ROOT/WEB-INF/   webapps/web1/
[root@wenzi ~]#echo "This is web1" > /usr/local/tomcat/webapps/web1/test.html
[root@wenzi ~]#echo "index.html" > /usr/local/tomcat/webapps/web1/index.html
[root@wenzi ~]#echo "index.htm" > /usr/local/tomcat/webapps/web1/index.htm
[root@wenzi ~]#echo "test.html" > /usr/local/tomcat/webapps/web1/test.html
[root@wenzi ~]#tree /usr/local/tomcat/webapps/web1/
/usr/local/tomcat/webapps/web1/
├── WEB-INF
│   └── web.xml
├── index.htm
├── index.html
└── test.html
[root@wenzi ~]#vim /usr/local/tomcat/webapps/web1/WEB-INF/web.xml
<web-app xmlns="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_4_0.xsd"
  version="4.0"
  metadata-complete="true">

  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>
#########新增内容  
    <welcome-file-list>
        <welcome-file>test.html</welcome-file>	#默认访问test.html
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
#########
</web-app>

[root@wenzi ~]#chown -R tomcat:tomcat /usr/local/tomcat/webapps/web1/
[root@wenzi ~]#curl http://192.168.28.60:8080/web1/
test.html

总结
  • webApp的专有配置优先于系统的全局配置
  • 修改系统的全局配置文件,需要重新启动服务生效
  • 修改 webApp的专有配置,无需重启即可生效

应用部署

WebApp应用归档格式
  • .war:WebApp打包,类zip格式文件,通常包括一个应用的所有资源,比如jsp,html,配置文件等
  • .jar:EJB类文件的打包压缩类zip格式文件,,包括很多的class文件, 网景公司发明
  • .rar:资源适配器类打包文件,目前已不常用
  • .ear:企业级WebApp打包,目前已不常用

传统应用开发测试后,通常打包为war格式,这种文件部署到Tomcat的webapps目录下,并默认会自动解包和部署上线。

#关键配置
<Host name="localhost"  appBase="webapps"     unpackWARs="true"     autoDeploy="true">
	虚拟主机名			从webapps目录加载web应用   自动解压找到的war包	     自动部署找到的web应用
部署方式

将webapp的源文件放置到目标目录,通过web.xml和context.xml文件中配置的路径就可以访问该webapp,通过类加载器加载其特有的类和依赖的类到JVM上,即:最终用户可以通过浏览器访问该应用

一、自动部署

Tomcat一旦发现多了一个web应用APP.war包,默认会自动把它解压缩,加载并启动起来

二、手动部署

冷部署:将webapp放到指定目录,才去启动Tomcat服务

热部署:Tomcat服务不停止,需要依赖manager、ant脚本等工具

三、反部署

停止webapp运行,并从JVM上清除已加载的类,从tomcat应用目录移除部署的文件

常见配置

8005安全配置
  • 8005:主要用于接收SHUTDOWN命令以关闭Tomcat服务器,且默认配置为仅允许本地访问。
  • 8009:通常用于AJP(Apache JServ Protocol)连接,允许Tomcat与其他HTTP服务器(如Apache或Nginx)进行集成。旧版本有,新版本无
  • 8080:Tomcat的默认HTTP连接端口

其中8005管理功能建议禁用,方法:

  • 将SHUTDOWN改为一串复杂度极高的字符串实现
  • 设置port为0,系统将自动使用随机端口
  • 设置port为-1无效端口,将关闭此功能。
配置文件 conf/server.xml
<Server port="8005" shutdown="SHUTDOWN">
显示指定http服务器版本信息
配置文件 conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
                connectionTimeout="20000"
                redirectPort="8443"
                maxParameterCount="1000"
                Server="MyServer"
                />

其它配置

conf/server.xml中可配置Service、Connector、Engine、Host等

一、Service配置

通常一个Server实例配置一个Service,name属性相当于该Service的ID

<Service name="Catalina">

二、连接器配置

redirectPort,如果访问HTTPS协议,自动转向这个连接器。但大多数时候,Tomcat并不会开启HTTPS,因为Tomcat往往部署在内部,HTTPS性能较差

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

三、引擎配置

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

四、默认虚拟主机

指向内部定义某虚拟主机。缺省虚拟主机可以改动,默认localhost

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
多虚拟主机配置
说明

name:必须是主机名,用主机名来匹配
appBase:当前主机的网页根目录,是相对于 $CATALINA_HOME ,也可以使用绝对路径
unpackWARs:是否自动解压war格式
autoDeploy:热部署,自动加载并运行应用

-------------------------------配置新增虚拟主机
vim conf/server.xml
#新增第一台虚拟主机
<Host name="www.web1.com"  appBase="/data/webapps1" unpackWARs="true" autoDeploy="true">
#可配置单独日志
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="web1_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />	#此符号&quot在html中表示双引号
</Host>

#新增第二台虚拟主机
<Host name="www.web2.com"  appBase="/data/webapps2" unpackWARs="true" autoDeploy="true">
#可配置单独日志
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="web2_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />	#此符号&quot在html中表示双引号
</Host>

-------------------------------准备虚拟主机的数据目录
mkdir -pv /data/webapps{1,2}/ROOT
chown -R tomcat:tomcat /data/webapps{1,2}/
echo "This is web1" > /data/webapps1/ROOT/index.html
echo "This is web2" > /data/webapps2/ROOT/index.html
改端口为80

修改conf/server.xml文件

<Connector port="80" protocol="HTTP/1.1"
	connectionTimeout="20000"
	redirectPort="8443"
	maxParameterCount="1000"
/>

修改Service文件中tomcat程序执行身份,因为非root用户不可使用特权端口(1024以下的端口);

tomcat默认使用root用户运行进程,将以下内容注释掉

[Service]
#User=tomcat
#Group=tomcat

也可以通过iptables实现端口重定向或DNAT

iptables -t nat -A PREROUTING -p tcp --dport 80 --j REDIRECT --to-port 8080
Context配置
Context作用

路径映射:将url映射至指定路径,而非使用appBase下的物理目录,实现虚拟目录功能

应用独立配置,例如单独配置应用日志、单独配置应用访问控

映射路径
添加在<Host>...</Host>中间
#映射指定路径
<Context path="/test" docBase="/data/test" reloadable="true" />

#映射站点的根目录
<Context path="/" docBase="/data/website" reloadable="true" />

#还可以添加日志等独立的配置
<Context path="/test" docBase="/data/test" reloadable="true" >
  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

               
prefix="localhost_test_log" suffix=".txt"

               
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Context>

path:指的是访问的URL路径,如果path与appBase下面的子目录同名,context的docBase路径优先级更高

docBase:可以是磁盘文件的绝对路径,也可以是相对路径(相对于Host的appBase)

reloadable:true表示如果WEB-INF/classes或META-INF/lib目录下.class文件有改动,就会将WEB应用重新加载。生产环境中,建议使用false来禁用

实现过程
cp -r ~/projects/myapp /data/myapp-v1
cd /data
ln -s myapp-v1 test
#使用软链接,方便后期版本升级或回滚。若是升级,将软链接指向myapp-v2,重新启动;若是回滚,将软链接指向上一个版本,重新启动
value组件

可以定义日志

<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" />

可以根据客户端远程IP地址进行限制访问

禁止所有以10.0.0.开头的IP访问
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
deny="10\.0\.0\.\d+"/>

path:指的是访问的URL路径,如果path与appBase下面的子目录同名,context的docBase路径优先级更高

docBase:可以是磁盘文件的绝对路径,也可以是相对路径(相对于Host的appBase)

reloadable:true表示如果WEB-INF/classes或META-INF/lib目录下.class文件有改动,就会将WEB应用重新加载。生产环境中,建议使用false来禁用

##### 实现过程

```bash
cp -r ~/projects/myapp /data/myapp-v1
cd /data
ln -s myapp-v1 test
#使用软链接,方便后期版本升级或回滚。若是升级,将软链接指向myapp-v2,重新启动;若是回滚,将软链接指向上一个版本,重新启动
value组件

可以定义日志

<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" />

可以根据客户端远程IP地址进行限制访问

禁止所有以10.0.0.开头的IP访问
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
deny="10\.0\.0\.\d+"/>
  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值