Tomcat
一、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的一个特殊类)
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核心组件
- 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.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 管理虚拟主机