前言
tomcat基础了解
WEB应用服务器 Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,它实现了Java Servlet、JavaServer Pages (JSP)、Java Expression Language (EL)和Websocket技术,并提供了一个"纯Java"的HTTP Web服务器环境,为基于Java的Web应用程序提供运行平台。 1999年发布初始版本是Tomcat 3.0,实现了Servlet 2.2 和 JSP 1.1规范。 Tomcat 4.x发布时,内建了Catalina(Servlet容器)和 Jasper(JSP engine)等 当前 Tomcat 的正式版本已经更新到 9.0.x 版本,但当前企业中主流版本为 8.x 和 7.x
官网: http://tomcat.apache.org/
官网文档: https://tomcat.apache.org/tomcat-8.5-doc/index.html
帮助文档:
https://cwiki.apache.org/confluence/display/tomcat/
https://cwiki.apache.org/confluence/display/tomcat/FAQ
各版本区别 官方文档:https://tomcat.apache.org/whichversion.html
作用:
- Web应用部署:支持将WAR文件部署为Web应用,提供了可配置的部署策略。
- 请求处理:处理来自客户端的HTTP请求,并将其路由到正确的Servlet处理。
- Servlet生命周期管理:管理Servlet的生命周期,包括加载、初始化、服务请求、销毁等。
- 会话管理:跟踪用户会话,支持不同的会话跟踪机制,如Cookies和URL重写。
功能组件结构:
- Connector: 负责对外接收和响应请求。它是Tomcat与外界的交通枢细,监听端口接收外界请求,并将请求处理后传递给容器做业务处理,最后将容器处理后的结果响应给外界。 简单理解 是一个连接器 接收用户请求 一个service里可以有多个连接器 端口号8080 8005 8009
8009 接收AJP协议 目前很少使用 有安全漏洞 8005端口号 是管理端口 危险 关闭tomcat 建议修改成-1或者0 0是随机 -1是无效。 8080 http协议请求的端口号
Container: 负责对内处理业务逻辑。其内部由Engine、 Host、Context和wrapper 四个容器组成,用于管理和调用Servlet 相关逻辑。 context 优化配置 虚拟主机的具体设置
Service: 对外提供的Web服务。主要包含Connector 和Container 两个核心组件,以及其他功能组件。Tomcat 可以管理多个Service, 且各Service之间相互独立。 (一个service就是一个外部应用,各个service之间是相互独立的,每个service可以监听不同的端口号)
tomcat请求过程:
用户在浏览器中输入网址,请求被发送到本机端口8080, 被在那里监听的Connector 获得。
Connector 把该请求交给它所在的Service 的Engine (Container) 来处理,并等待Engine 的回应。
请求会在Engine、 Host、 Context 和wrapper 这四个容器之间层层调用,最后在Servlet 中执行对应的业务逻辑、数据存储等。
执行完之后的请求响应在Context、 Host、 Engine 容器之间层层返回,最后返回给Connector,并通过Connector 返回给客户端。
二进制安装tomcat
安装tomcat 前必须先部署JDK 目前比较主流的Tomcat是8.5.X版本,推荐从Apache官网下载二进制tomcat包进行安装,此为生产常用方式 https://tomcat.apache.org/download-80.cgi https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/
准备好jdk包 和tmocat包 (官网下载) 下载后从本地上传至终端
[root@xyy7 opt]# rpm -ivh jdk-8u291-linux-x64.rpm #安装JDK包 根据版本号
警告:jdk-8u291-linux-x64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID ec551f03: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:jdk1.8-2000:1.8.0_291-fcs ################################# [100%]
Unpacking JAR files...
tools.jar...
plugin.jar...
javaws.jar...
deploy.jar...
rt.jar...
jsse.jar...
charsets.jar...
localedata.jar...
[root@xyy7 opt]# cd /usr/java/jdk1.8.0_291-amd64/ #切换到目录
[root@xyy7 jdk1.8.0_291-amd64]# vim /etc/profile #配置文件中修改环境变量
export JAVA_HOME=/usr/java/jdk1.8.0_291-amd64
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
[root@xyy7 jdk1.8.0_291-amd64]# source /etc/profile #刷新配置文件
[root@xyy2 opt]# tar zxvf apache-tomcat-9.0.16.tar.gz #上传包之后压缩
[root@localhost tomcat]#cp -r apache-tomcat-9.0.16 /usr/local/tomcat
[root@xyy7 opt]# cd /usr/local/tomcat/
[root@xyy7 tomcat]# /usr/local/tomcat/bin/startup.sh #启动tomcat
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_201-amd64
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
#/usr/local/tomcat/bin/catalina.sh run 前台启动tomcat
#/usr/local/tomcat/bin/catalina.sh start 后台启动
[root@xyy7 tomcat]# /usr/local/tomcat/bin/shutdown.sh #关闭tomcat #catalina.sh stop 也是关闭服务
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_291-amd64
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@xyy7 tomcat]# useradd -s /sbin/nologin tomcat #添加用户tomcat
[root@xyy7 local]# chown tomcat:tomcat tomcat/ -R #修改属主 属组。
[root@xyy7 local]# cat > /usr/lib/systemd/system/tomcat.service <<EOF #修改service文件 使tomcat可以被systemd管理。
> [Unit]
> Description=Tomcat
> After=syslog.target network.target
>
> [Service]
> Type=forking
> 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
> EOF
[root@xyy7 local]# systemctl daemon-reload #重新加载service配置文件
[root@xyy7 local]# systemctl start tomcat
[root@xyy7 local]# ss -ntp | grep 80
[root@xyy7 local]# ss -ntap |grep 8080
LISTEN 0 100 :::8080 :::* users:(("java",pid=16380,fd=56))
验证:192.168.64.10:8080 Tomcat的核心分为3个部分: (1)Web容器:处理静态页面; (2)JSP容器:把jsp页面翻译成一般的 servlet (3)catalina: 是一个servlet容器,用于处理servlet
tomcat配置文件介绍
安装目录 |目录名字 |功能 | |:--| |bin |存放启动和关闭 Tomcat 的脚本文件,比较常用的是 catalina.sh、startup.sh、shutdown.sh 三个文件 | |conf |存放 Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四个文件。 | |lib |存放 Tomcat 服务器的 jar 包,一般不作任何改动,除非连接第三方服务,比如 redis,那就需要添加相对应的 jar 包 | |logs |存放 Tomcat 日志 catalina.out | |temp |存放 Tomcat 运行时产生的文件 | |webapps |存放项目资源的目录 | |work |Tomcat 工作目录,一般清除 Tomcat 缓存的时候会使用到(升级版本时注意要删除里面的缓存) |
子目录 | 文件名 | 说明 | | ------------------- | ------------------------------------------------------------ | | 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选项启动omcat时,用于为tomcat设置安全策略 | | catalina.properties | Tomcat环境变量的配置,用于设定类加载器路径,以及一些与JVM调优相关参数 | | logging.properties | Tomcat日志系统相关的配置,可以修改日志级别和日志路径等 | | | 注意配置文件对于大小写敏感 |
日志文件
参考文档: https://cwiki.apache.org/confluence/display/TOMCAT/Logging
日志格式: https://tomcat.apache.org/tomcat-9.0-doc/config/valve.html#Access_Logging
%a - Remote IP address
%A - Local IP address
%b - Bytes sent, excluding HTTP headers, or '-' if zero
%B - Bytes sent, excluding HTTP headers
%h - Remote host name (or IP address if enableLookups for the connector is
false)
%H - Request protocol
%l - Remote logical username from identd (always returns '-')
%m - Request method (GET, POST, etc.)
%p - Local port on which this request was received. See also %{xxx}p below.
%q - Query string (prepended with a '?' if it exists)
%r - First line of the request (method and request URI)
%s - HTTP status code of the response
%S - User session ID
%t - Date and time, in Common Log Format
%u - Remote user that was authenticated (if any), else '-'
%U - Requested URL path
%v - Local server name
%D - Time taken to process the request in millis. Note: In httpd %D is
microseconds. Behaviour will be aligned to httpd in Tomcat 10 onwards.
%T - Time taken to process the request, in seconds. Note: This value has
millisecond resolution whereas in httpd it has second resolution. Behaviour will
be align to httpd in Tomcat 10 onwards.
%F - Time taken to commit the response, in millis
%I - Current request thread name (can compare later with stacktraces)
%X - Connection status when response is completed:
X = Connection aborted before the response completed.
+ = Connection may be kept alive after the response is sent.
- = Connection will be closed after the response is sent.
There is also support to write information incoming or outgoing headers, cookies,
session or request attributes and special timestamp formats. It is modeled after
the Apache HTTP Server log configuration syntax. Each of them can be used
multiple times with different xxx keys:
%{xxx}i write value of incoming header with name xxx
%{xxx}o write value of outgoing header with name xxx
%{xxx}c write value of cookie with name xxx
%{xxx}r write value of ServletRequest attribute with name xxx
%{xxx}s write value of HttpSession attribute with name xxx
%{xxx}p write local (server) port (xxx==local) or remote (client) port
(xxx=remote)
%{xxx}t write timestamp at the end of the request formatted using the enhanced
SimpleDateFormat pattern xxx
tomcat组件
顶级组件 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等。以logger举例,在不同容器组件内分别定义。 集群类组件 listener、cluster |名称 |说明 | |:--| |server |服务器,Tomcat运行的进程实例,一个Server中可以有多个service,但通常就一个 | |service |服务,用来组织Engine(引擎)和Connector(连接器,端口)的对应关系,一个service中只有一个Engine | |connector |连接器,负责客户端的HTTP、HTTPS、AJP等协议连接。一个Connector只属于某一个Engine | |Engine |即引擎,用来响应并处理用户请求。一个Engine上可以绑定多个Connector | |Host |即虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分 | |Context |应用的上下文,配置特定url路径映射和目录的映射关系: url => directory |