Tomcat

4 minute read

一、Web Container

A web container (also known as a servlet container) is the component of a web server that interacts with Java servlets. A web container is responsible for managing the lifecycle of servlets, mapping a URL to a particular servlet and ensuring that the URL requester has the correct access-rights.

web 容器是与JAVA Servlet交互的web服务器组件。

A web container handles requests to servlets, JavaServer Pages (JSP) files, and other types of files that include server-side code. The Web container creates servlet instances, loads and unloads servlets, creates and manages request and response objects, and performs other servlet-management tasks.

A web container implements the web component contract of the Java EE architecture. This architecture specifies a runtime environment for additional web components, including security, concurrency, lifecycle management, transaction, deployment, and other services.

web容器是实现JAVA EE体系结构的web组件

web Container 融合了JDK、Servlet、JSP等众多JAVA2EE所拥有的企业级类库后,所提供的一个容器。

  • jsp是Servlet的前端,提供翻译器,将jsp代码转换成Servlet代码,再由java编译,最终运行在JVM虚拟机上。 (java 2 ee的一个特殊类)
  • JDK
  • Servlet (java 2 ee的一个特殊类)

java

jsp –> jasper –> servlet –> complie –> bytecodes –> jvm

二、Web Container实现

  • 商业实现:
    • WebSphere(IBM)
    • WebLogic(Oracle)
    • Oc4j
    • Glassfish
    • Geronimo
    • JOnAS
    • JBoss
  • 开源实现
    • Tomcat
    • jetty (轻量高效)
    • resin (不可商业使用)

三、开源JDK

  • Apache Harmony
  • OpenJDK
    • https://developers.redhat.com/products/openjdk/download/?sc_cid=701f2000000RWTnAAO
  • SunJDK

四、tomcat简介

Sun公司创建了第一个Servlet(类)容器,即Java Web Server,但是JWS只是为了演示Servlet的相应功能,所以很不稳定,于此同时,ASF创建了JServ项目,一个能与apache(httpd)整合起来的servlet容器1999年,Sun将JWS捐给了ASF,于是两个项目合二为一,即Tomcat前身,第一个tomcat版本是Tomcat3.0系列,而发布于2001年的Tomcat4.0是在此基础上进行了重新设计和实现,其代码项目命名为catalina。

Java SE包含了Java二进制程序(如JVM和Java字节码编译器)和JAVA的核心代码库,而Java EE标准则包含了一组适用于创建企业级WEB 应用程序的API。Java EE建立在JAVA SE的基础上,并依赖于JAVA SE才能正常工作。

JAVA 2 EE包含了多个独立的API,Servlet和JSP就是其中的两个,而JAVA EE中著名的API:

  • EJB(Enterprise JavaBeans): JAVA相关的诸多高级功能的实现,如RMI(Remote Method Invocation),对象/关系映射,跨越多个数据源的分布式事务等;
  • JMS(Java Message Service): 高性能异步消息服务,实现JAVA EE应用程序与非JAVA程序的“透明”通信;
  • JMX(Java Management Extensions): 在程序运行时对其进行交互式监控和监管的机制;
  • JTA(Java Transaction API):允许应用程序在自身的一个或多个组件中平滑地处理错误的机制;
  • JAVAMail : 通过工业标准的POP SMTP IMAP协议发送和接受邮件的机制。

Tomcat仅实现Servlet和JSP,JMX,所以是JAVA 2 EE平台的不完整实现

Tomcat是由Apache软件基金会属下Jakarta项目开发的Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全局管理和Tomcat阀等。由于Tomcat本身也内含了HTTP服务器,因此也可以视作单独的Web服务器。但是,不能将Tomcat和Apache HTTP服务器混淆,Apache HTTP服务器是用C语言实现的HTTPWeb服务器;这两个HTTP web server不是捆绑在一起的。Apache Tomcat包含了配置管理工具,也可以通过编辑XML格式的配置文件来进行配置。

tomcat

五、tomcat核心组件

  • Catalina : serblet container
  • Coyote : HTTP connector (web服务)
  • Jasper : JSP Engine
  • tomcat开发语言:JAVA

六、tomcat核心概念

  • Tomcat Instance 运行中的tomcat进程(java进程)
  • Server 一个tomcat实例
  • Service 用于将connector关联至engine组件,一个service只能包含一个engine组件和一个或多个connector组件。
  • Engine Tomcat的核心组件,用于运行jsp或service代码
  • Connector 接入并解析用户请求,将请求映射为Engine中运行的代码;之后,将运行结果构建成响应报文。
  • Host 类似httpd中的虚拟机
  • Context 上下文,定义一个独立的程序webapp,单独部署管理

注意:每个组件都是有”类”来实现,有些组件的实现还不止一种。

  • 顶级类组件: server
  • 服务类组件: service
  • 容器类组件: 可部署webapp的组件,engine host context
  • 被嵌套类组件: valve logger realm
<server>
    <service>
        <connector />
        <connector />
        ...
        <engine>
            <host>
                <context />
                ...
            </host>
            ...
        </engine>
    </service>
</server>

七、tomcat运行模式

  • standalone:通过内置的web server(http connector)来接收客户端请求。
  • proxy:由专门的web server服务客户端的http请求
    • in-process 部署于同一主机
    • network 部署域不同主机

tomcat

八、安装

官网:tomcat.apache.org

部署前提jdk:JAVA SE

  • Oracle JDK (Centos 6 采用)
  • OpenJDK (Centos 7 以后采用OpenJDK)(红帽提供的一定是稳定版本)

部署Tomcat,一定不要使用最新版,使用经过生产环境广泛验证的稳定版本

8.1 JDK

yum安装

# cd /etc/yum.repos.d/
# cp CentOS-AppStream.repo CentOS-AppStream.repobk
# vim CentOS-AppStream.repo
[AppStream]
name=CentOS-$releasever - AppStream
baseurl=http://mirrors.aliyun.com/centos/$releasever/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

# yum list all | grep openjdk
java-1.8.0-openjdk.x86_64                            1:1.8.0.252.b09-2.el8_1                           AppStream 
java-1.8.0-openjdk-accessibility.x86_64              1:1.8.0.252.b09-2.el8_1                           AppStream 
java-1.8.0-openjdk-demo.x86_64                       1:1.8.0.252.b09-2.el8_1                           AppStream 
java-1.8.0-openjdk-devel.x86_64                      1:1.8.0.252.b09-2.el8_1                           AppStream 
java-1.8.0-openjdk-headless.x86_64                   1:1.8.0.252.b09-2.el8_1                           AppStream 
java-1.8.0-openjdk-javadoc.noarch                    1:1.8.0.252.b09-2.el8_1                           AppStream 
java-1.8.0-openjdk-javadoc-zip.noarch                1:1.8.0.252.b09-2.el8_1                           AppStream 
java-1.8.0-openjdk-src.x86_64                        1:1.8.0.252.b09-2.el8_1                           AppStream 
java-11-openjdk.x86_64                               1:11.0.7.10-1.el8_1                               AppStream 
java-11-openjdk-demo.x86_64                          1:11.0.7.10-1.el8_1                               AppStream 
java-11-openjdk-devel.x86_64                         1:11.0.7.10-1.el8_1                               AppStream 
java-11-openjdk-headless.x86_64                      1:11.0.7.10-1.el8_1                               AppStream 
java-11-openjdk-javadoc.x86_64                       1:11.0.7.10-1.el8_1                               AppStream 
java-11-openjdk-javadoc-zip.x86_64                   1:11.0.7.10-1.el8_1                               AppStream 
java-11-openjdk-jmods.x86_64                         1:11.0.7.10-1.el8_1                               AppStream 
java-11-openjdk-src.x86_64                           1:11.0.7.10-1.el8_1                               AppStream 

# yum install java-1.8.0-openjdk
# java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
# 注意是OpenJDK  mixed mode
# which java
/usr/bin/java
# ls -l /usr/bin/java 
lrwxrwxrwx. 1 root root 22 6月   8 18:00 /usr/bin/java -> /etc/alternatives/java
# ls -lrt /etc/alternatives/java
lrwxrwxrwx. 1 root root 73 6月   8 18:00 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el8_1.x86_64/jre/bin/java

rpm安装

# rpm -ivh 
# rpm -ql jdk
#vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH

#. /etc/profile.d/java.sh

tomcat

# yum info tomcat  检查    base源
# yum list all |grep tomcat

# tar xf apache-tomcat-8.5.55.tar.gz -C /usr/local
# cd /usr/local/
# ln -sv apache-tomcat-8.5.55/ tomcat
# cd tomcat

注意1:java运行不需要管理员权限,所以生产环境java程序部署应该用普通用户权限 注意2:除非java程序要运行在小于1023的特权端口上,比如80端口才应该使用管理员权限,所以tomcat默认端口是8080

九、Tomcat目录结构

目录 说明
/bin 脚本及启动时用到的类
/conf 配置文件
/lib 额外提供类库(包括catalina.jar jasper.jar)
/logs 日志
/temp 临时
/webapps 应用程序部署目录
/work 工作目录,提供翻译成servlet文件,然后编译成类文件运行,存放路径
# cd lib/
# ls
annotations-api.jar       ecj-4.6.3.jar   servlet-api.jar     tomcat-i18n-fr.jar     tomcat-jni.jar
catalina-ant.jar          el-api.jar      tomcat-api.jar      tomcat-i18n-ja.jar     tomcat-util.jar
catalina-ha.jar           jasper-el.jar   tomcat-coyote.jar   tomcat-i18n-ko.jar     tomcat-util-scan.jar
catalina.jar              jasper.jar      tomcat-dbcp.jar     tomcat-i18n-ru.jar     tomcat-websocket.jar
catalina-storeconfig.jar  jaspic-api.jar  tomcat-i18n-de.jar  tomcat-i18n-zh-CN.jar  websocket-api.jar
catalina-tribes.jar       jsp-api.jar     tomcat-i18n-es.jar  tomcat-jdbc.jar

配置文件:

文件 说明
server.xml 主配置文件(框架)
context.xml 每个webapp都可以有专有的配置文件,这些配置文件通常位于webapp应用程序目录下的WEB-INF目录中,用于定义会话管理、JDBC等;conf/context.xml是为各webapp提供默认配置
web.xml 每个webapp“部署”之后才能被访问;此文件则用于为所有的webapp提供默认部署相关的配置;
tomcat-users.xml 用户认证的账户和密码配置文件。
catalina.policy 当使用-security选项启动tomcat实例时会读取此配置文件来实现其安全运行策略;
catalina.properties JAVA属性的定义文件,用于设定类加载器路径等,以及一些JVM性能相关的调优参数。
logging.properties 日志相关的配置信息。

十、Tomcat管理

# bin/catalina.sh --help
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Usage: catalina.sh ( commands ... )
commands:
  debug             Start Catalina in a debugger
  debug -security   Debug Catalina with a security manager
  jpda start        Start Catalina under JPDA debugger
  run               Start Catalina in the current window
  run -security     Start in the current window with security manager
  start             Start Catalina in a separate window
  start -security   Start in a separate window with security manager  读取catalina.policy,以安全方式运行
  stop              Stop Catalina, waiting up to 5 seconds for the process to end
  stop n            Stop Catalina, waiting up to n seconds for the process to end  指定时间停止
  stop -force       Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running
  stop n -force     Stop Catalina, wait up to n seconds and then use kill -KILL if still running
  configtest        Run a basic syntax check on server.xml - check exit code for result 配置测试
  version           What version of tomcat are you running?
Note: Waiting for the process to end and use of the -force option require that $CATALINA_PID is defined

# vim /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$CATALINA_HOME/bin:$PATH

# . /etc/profile.d/tomcat.sh

# 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:        /
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.5.55
Server built:   May 5 2020 22:10:54 UTC
Server number:  8.5.55.0
OS Name:        Linux
OS Version:     4.18.0-147.el8.x86_64
Architecture:   amd64
JVM Version:    1.8.0_252-b09
JVM Vendor:     Oracle Corporation

# catalina.sh configtest
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
六月 08, 2020 7:59:07 下午 org.apache.catalina.startup.VersionLoggerListener log
信息: Server.服务器版本: Apache Tomcat/8.5.55

#  catalina.sh start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.

# ss -tnl | grep 8080
LISTEN  0        100                           *:8080                  *:*      

# ss -tnlp |  grep java
LISTEN  0        100                           *:8080                  *:*       users:(("java",pid=4179,fd=54))                                                
LISTEN  0        1            [::ffff:127.0.0.1]:8005                  *:*       users:(("java",pid=4179,fd=66))                                                

# systemctl status firewalld.service
# systemctl stop firewalld.service
# systemctl disable firewalld.service

访问测试 http://192.168.11.224:8080/

  • Server Status 服务器状态
  • Manager App 管理应用
  • Host Manager 管理虚拟主机