Tomcat之简介
1. JDK JRE JVM的区别
JDK
JDK是Java开发工具包,是Sun Microsystems针对Java开发员的产品。
JDK中包含JRE,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。
JDK是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。
①SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。
②EE(J2EE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE。
③ME(J2ME),micro edition,主要用于移动设备、嵌入式设备上的java应用程序,从JDK 5.0开始,改名为Java ME。
JRE
是运行基于Java语言编写的程序所不可缺少的运行环境。也是通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用。
JRE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,这些是运行Java程序的必要组件。
与大家熟知的JDK不同,JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户。
JVM
就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。
也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机(相当于中间层)间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
只有JVM还不能成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而jre包含lib类库。
JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
所有的程序只要有java虚拟机的支持,那么就可以实现程序的执行,并且不同的操作系统上会有不同版本的jvm。
我是这样理解的,jvm相当于一个容器,放到不同的操作系统中,因为编写的Java程序经过编译后生成的字节码可以被JVM识别,JVM为程序运行屏蔽了底层操作系统的差异

2. Serverlet与Tomcat
Servlet从广义上讲是Sun公司提供的一门用于开发动态Web资源的技术,而狭义上指的是实现了javax.servlet.Servlet接口的类的统称。Servlet接口很简单,只有init、getServletConfig、service、getServletInfo和destroy这5个方法,它们构成了实现Servlet功能的规范。像Spring的DispatcherServlet,都是一种具体的Servlet。
当然了,光有Servlet这一个类可没什么用,它没有main方法,不能独立运行,就像光有子弹没有枪,子弹的价值就发挥不出来。要想实现Servlet的功能,就必须有一个Servlet容器。
Servlet容器,也叫做Servlet引擎,是web服务器的一部分,用于接收网络请求,把请求转发给对应的Servlet,并把Servlet处理的结果返回给网络。
它是web服务器和Servlet之间的媒介。
它建立服务端socket、监听端口、创建流。
它管理着Servlet的生命周期,如加载部署Servlet,实例化初始化Servlet,调用Servlet方法(处理业务),以及销毁Servlet。
Tomcat就是一个独立运行的Servlet容器。
Tomcat组织结构图

3. JAVA体系结构
1. JAVA编程语言
2. JAVA Class文件格式
3. JAVA API
4. JAVA VM
4. JVM的核心组成部分
class loader
执行引擎
5. JAVA编程语言的特性
面向对象,多线程,结构化错误处理
垃圾回收,动态链接,动态扩展
6. JVM运行时区域 运行为多个线程
方法区 用于存放被虚拟机加载的常亮,静态变量,持久代
堆 jvm管理的内存中最大的一部分,线程共享,新生代和老年代
java栈 线程私有,存放线程自己的局部变量信息
PC寄存器 线程独占的内存空间
本地方法栈
7. Tomcat的核心组件
catalina: servlet container
Coyote: http connection
Jasper: JSP Engine
8. Tomcat实例
server 一个tomcat实例
service 用于将connector关联至engine组件,一个service只能包含一个engine组件和一个或多个connector组件
engine tomcat的核心组件,用于运行jsp或servlet代码
connector 接入并解析用户请求,将请求映射为Engine中运行的代码,之后,将运行结果构建成响应报文。
host 类似httpd的虚拟主机
context 类似httpd的alias别名
9. Tomcat组件分类
顶级类组件 server
服务类组件 service
容器类组件 engine,host,context
连接器组件 connector
被嵌套类组件 valve,realm,logger
10. Tomcat的server.xml模板
<Server>
<Listener />
<GlobaNamingResources>
</GlobaNamingResources>
<Service>
<Connector /> 可以有多个
<Engine> 只能有一个
<Logger />
<Realm />
<host> 可以有多个
<Logger /> 可以有多个
<Context /> 可以有多个
</host>
</Engine>
</Service>
</Server>
11. Tomcat的运行模式
standalone 使用tomcat内置的web container接收客户端请求
proxy 由专门的web server为处理客户端请求
同一主机
不同主机
12. Tomcat的目录结构
1. bin: tomcat服务器启动和关闭脚本文件,有windows和linux脚本。
2. conf: tomcat服务器的各种配置文件
3. lib: tomcat服务器所有可以访问的jar包
4. logs: tomcat服务器的日志文件
5. temp: tomcat服务器运行时的临时文件
6. webapps: tomcat服务器自带的两个web应用,admin和manager,用来管理tomcat的web服务。
7. work: tomcat服务器中jsp经过编译后生成的servlet。
13. Tomcat配置文件
1. server.xml
tomcat最重要的配置文件。定义了tomcat的体系结构,包括连接器端口、连接数,集群,虚拟目录,访问日志等。
2. web.xml
默认文件的设置
3. context.xml
全局context的配置文件,包括JNDI(Java Naming and Directory Interface,Java命名和目录接口)等信息的配置
4. tomcat-user.xml
Tomcat管理员身份配置文件,关键是设置管理员的账户和密码
5. logging.properties
Tomcat日志配置文件,可以修改默认Tomcat日志路径和名称
6. catlina.policy
7. catlina.properties
JAVA属性的定义文件,用于设定类加载器路径等,以及一些JVM性能调优的参数。
14. Tomcat开启与关闭
[java@ceshi ~]$ /usr/local/tomcat/tomcat-log/bin/catalina.sh --help Using CATALINA_BASE: /usr/local/tomcat/tomcat-log Using CATALINA_HOME: /usr/local/tomcat/tomcat-log Using CATALINA_TMPDIR: /usr/local/tomcat/tomcat-log/temp Using JRE_HOME: /usr Using CLASSPATH: /usr/local/tomcat/tomcat-log/bin/bootstrap.jar:/usr/local/tomcat/tomcat-log/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 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?
15. Java Webapp的组织结构
有特定的组织形式,层次型的目录结构,主要包含了servlet代码文件,jsp页面文件,类文件,部署描述符文件等;
/usr/local/tomcat/webapps/app1/
/: webapp的根目录
WEB-INF: 当前webapp的私有资源目录,通常存放当前webapp自用的web.xml;
META-INF: 当前webapp的私有资源目录,通常存放当前webapp自用的context.xml;
classes: 此webapp的私有类
lib: 此webapp的私有类,被打包为jar格式类
index.jsp: 此webapp的主页
webapp归档格式
.war webapp
.jar EJB的类
.rar 资源适配器
16. 部署webapp的操作
deploy
自动部署
手动部署
冷部署 把webapp放到指定目录,然后启动tomcat
热部署 不停止tomcat的前提下部署
部署工具 manager ant tcd
undeploy 反部署
stop 停止,不向用户提供服务
start 启动处于停止状态的webapp
redeploy 重新部署
17. Tomcat自带的应用程序
manager webapp管理工具
host-manager Virtual Hosts管理工具
ROOT 根目录
docs 文档
examples 例子
18. Tomcat的server.xml详解
<Server>
<Listener />
<GlobaNamingResources>
</GlobaNamingResources
<Service>
<Connector />
<Connector />
<Engine>
<Logger />
<Realm />
<host>
<Logger />
<Context />
</host>
</Engine>
</Service>
</Server>
19. Tomcat各个元素的详解
<Server>元素
它代表整个容器,是Tomcat实例的顶层元素.由org.apache.catalina.Server接口来定义.它包含一个<Service>元素.并且它不能做为任何元素的子元素.
<!-- 一个“Server”是一个提供完整的JVM的独立组件,它可以包含一个或多个
“Service”实例。服务器在指定的端口上监听shutdown命令。
注意:一个“Server”自身不是一个“Container”(容器),因此在这里你
不可以定义诸如“Valves”或者“Loggers”子组件
-->
<!-- 启动Server
在端口8005处等待关闭命令
如果接受到"SHUTDOWN"字符串则关闭服务器
-->
测试:
telnet localhost 8005
输入:SHUTDOWN
结果:关闭tomcat
<Server port="8005" shutdown="SHUTDOWN" debug="0">
1>className指定实现org.apache.catalina.Server接口的类.默认值为org.apache.catalina.core.StandardServer
2>port指定Tomcat监听shutdown命令端口.终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令.该属性是必须的.
3>shutdown指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串.该属性必须设置
<Service>元素
该元素由org.apache.catalina.Service接口定义,它包含一个<Engine>元素,以及一个或多个<Connector>,这些Connector元素共享用同一个Engine元素
<!-- 一个“Service”是一个或多个共用一个单独“Container”(容器)的“Connectors”
组合(因此,应用程序在容器中可见)。通常,这个容器是一个“Engine”
(引擎),但这不是必须的。
注意:一个“Service”自身不是一个容器,因此,在这个级别上你不可定义
诸如“Valves”或“Loggers”子组件。
-->
<!-- Tomcat的Standalone Service
Service是一组Connector的集合
它们共用一个Engine来处理所有Connector收到的请求
-->
<Service name="Catalina">
<Service name="Apache">
第一个<Service>处理所有直接由Tomcat服务器接收的web客户请求.
第二个<Service>处理所有由Apahce服务器转发过来的Web客户请求 .
1>className 指定实现org.apahce.catalina.Service接口的类.默认为org.apahce.catalina.core.StandardService
2>name定义Service的名字
<Connector>元素
由Connector接口定义.<Connector>元素代表与客户程序实际交互的给件,它负责接收客户请求,以及向客户返回响应结果.
<!-- 一个“Connector”(连接器)代表一个请求被接收和应答所需要的端点。每个连
接器通过相关的“Container”(容器)处理请求。
默认情况下,一个非SSL的HTTP/1.1的连接器被绑定在端口8080。你也可以通过
根据后面的使用说明并取消第二个连接器入口的注释,在端口8443上建立一个
SSL HTTP/1.1的连接器。开放SSL支持需要下面几步(参见Tomcat 5文档中怎样
配置SSL的说明以取得更多的详细信息):
* 如果你的JDK是1.3或1.3以前的版本,下载安装JSSE 1.0.2或以后版本,并放
置JAR文件到“$JAVA_HOME/jre/lib/ext”目录下。
* 带一个“changeit”的口令值执行:
%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA (Windows)
$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA (UNIX)
来生成它自己的证书私钥。
默认情况下,当一个web应用程序调用请求时,DNS查询是可行的。这将对性能造
成一些不利的影响,因此,你可以将“enableLookups”设置为“false”来关闭DNS
查询。当DNS查询被关闭时,request.getRemoteHost()将返回包含远程客户IP地
址的字符串。
-->
<!-- Coyote HTTP/1.1 Connector
className : 该Connector的实现类是org.apache.coyote.tomcat4.CoyoteConnector
port : 在端口号8080处侦听来自客户browser的HTTP1.1请求.如果把8080改成80,则只要输入http://localhost/即可
protocol:设定Http协议,默认值为HTTP/1.1
minSpareThreads: 该Connector先创建5个线程等待客户请求,每个请求由一个线程负责
maxSpareThread:设定在监听端口的线程的最大数目,这个值也决定了服务器可以同时响应客户请求的最大数目.默认值为200
acceptCount : 当现有线程已经达到最大数75时,为客户请求排队.当队列中请求数超过100时,后来的请求返回Connection refused错误
redirectport : 当客户请求是https时,把该请求转发到端口8443去
enableLookups:如果设为true,表示支持域名解析,可以把IP地址解析为主机名.WEB应用中调用request.getRemoteHost方法返回客户机主机名.默认值为true
connectionTimeout:定义建立客户连接超时的时间.如果为-1,表示不限制建立客户连接的时间
allowTrace:是否允许HTTP的TRACE方法,默认为false
emptySessionPath:如果设置为true,用户的所有路径都将设置为/,默认为false。
enableLookups:调用request、getRemoteHost()执行DNS查询,以返回远程主机的主机名,如果设置为false,则直接返回IP地址。
maxPostSize:指定POST方式请求的最大量,没有指定默认为2097152。
protocol:值必须为HTTP1.1,如果使用AJP处理器,该值必须为AJP/1.3
proxyName:如这个连接器正在一个代理配置中被使用,指定这个属性,在request.getServerName()时返回
redirectPort:如连接器不支持SSL请求,如收到SSL请求,Catalina容器将会自动重定向指定的端口号,让其进行处理。
scheme:设置协议的名字,在request.getScheme()时返回,SSL连接器设为”https”,默认为”http”
secure:在SSL连接器可将其设置为true,默认为false
URIEncoding:用于解码URL的字符编码,没有指定默认值为ISO-8859-1
useBodyEncodingForURI:主要用于Tomcat4.1.x中,指示是否使用在contentType中指定的编码来取代URIEncoding,用于解码URI查询参数,默认为false
xpoweredBy:为true时,Tomcat使用规范建议的报头表明支持Servlet的规范版本,默认为false
acceptCount:当所有的可能处理的线程都正在使用时,在队列中排队请求的最大数目。当队列已满,任何接收到的请求都会被拒绝,默认值为10
bufferSize:设由连接器创建输入流缓冲区的大小,以字节为单位。默认情况下,缓存区大的大小为2048字节
compressableMimeType:MIME的列表,默认以逗号分隔。默认值是text/html,text/xml,text/plain
compression:指定是否对响应的数据进行压缩。off:表示禁止压缩、on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为off
connectionTimeout:设置连接的超时值,以毫秒为单位。默认值为60000=60秒
disableUploadTimeOut:允许Servlet容器,正在执行使用一个较长的连接超时值,以使Servlet有较长的时间来完成它的执行,默认值为false
maxHttpHeaderSize:HTTP请求和响应头的最大量,以字节为单位,默认值为4096字节
maxKeepAliveRequest:服务器关闭之前,客户端发送的流水线最大数目。默认值为100
maxSpareThreads:允许存在空闲线程的最大数目,默认值为50
minSpareThreads:设当连接器第一次启协创建线程的数目,确保至少有这么多的空闲线程可用。默认值为4
port:服务端套接字监听的TCP端口号,默认值为8080(必须)
socketBuffer:设Socket输出缓冲区的大小(以字节为单位),-1表示禁止缓冲,默认值为9000字节
toNoDelay:为true时,可以提高性能。默认值为true
threadPriority:设JVM中请求处理线程优先级。默认值为NORMAL-PRIORITY
例:
<Connector
port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false"
redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" />
AJP连接器:
用于将Apache与Tomcat集成在一起,当Apache接收到动态内容请求时,通过在配置中指定的端口号将请求发送给在此端口号上监听的AJP连接器组件。
属性:
backlog:当所有可能的请求处理线程都在使用时,队列中排队的请求最大数目。默认为10,当队列已满,任何请求都将被拒绝
maxSpareThread:允许存在空闲线程的最大数目,默认值为50
maxThread:最大线程数,默认值为200
minSpareThreads:设当连接器第一次启动时创建线程的数目,确保ZZ至少有这么多的空闲线程可用,默认值为4
port:服务端套接字的TCP端口号,默认值为8089(必须)
topNoDelay:为true时,可以提高性能,默认值为true
soTimeout:超时值
例:
<!—Define an AJP1.3 Connector on port 8089-->
<Connector port=”8089” enableLookups=”false” redirectPort=”8443” protocol=”AJP/1.3” />
-->
<Connector port="8080" maxThread="50" minSpareThreads="25" maxSpareThread="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" />
<Connection port="8009" enableLookups="false" redirectPort="8443" debug="0" protocol="AJP/1.3" />
第一个Connector元素定义了一个HTTP Connector,它通过8080端口接收HTTP请求;第二个Connector元素定义了一个JD Connector,它通过8009端口接收由其它服务器转发过来的请求.
<Engine>元素
每个Service元素只能有一个Engine元素.处理在同一个<Service>中所有<Connector>元素接收到的客户请求.由org.apahce.catalina.Engine接口定义.
<!-- 一个“Engine”(引擎)代表处理每个请求的入口点(在Catalina内)。这个Tomcat
的标准独立引擎实现分析包含在请求中的HTTP头信息,并将请求传送到适当的主机
或虚拟主机上。-->
<!-- Engine用来处理Connector收到的Http请求
它将匹配请求和自己的虚拟主机,并把请求转交给对应的Host来处理
默认虚拟主机是localhost
-->
<Engine name="Catalina" defaultHost="localhost" debug="0">
1>className指定实现Engine接口的类,默认值为StandardEngine
2>defaultHost指定处理客户的默认主机名,在<Engine>中的<Host>子元素中必须定义这一主机
3>name定义Engine的名字
在<Engine>可以包含如下元素<Logger>, <Realm>, <Value>, <Host>
<Host>元素
它由Host接口定义.一个Engine元素可以包含多个<Host>元素.每个<Host>的元素定义了一个虚拟主机.它包含了一个或多个Web应用.
<!-- 定义默认的虚拟主机
注意:XML模式确认将不能与Xerces 2.2同工作。
-->
<!-- 虚拟主机localhost
appBase : 指 定虚拟主机的目录,可以指定绝对目录,也可以指定相对于<CATALINA_HOME>的相对目录.如果没有此项,默认 为<CATALINA_HOME>/webapps. 它将匹配请求和自己的Context的路径,并把请求转交给对应的Context来处 理
autoDeploy:如果此项设为true,表示Tomcat服务处于运行状态时,能够监测appBase下的文件,如果有新有web应用加入进来,会自运发布这个WEB应用
unpackWARs:如果此项设置为true,表示把WEB应用的WAR文件先展开为开放目录结构后再运行.如果设为false将直接运行为WAR文件
alias:指定主机别名,可以指定多个别名
deployOnStartup:如果此项设为true,表示Tomcat服务器启动时会自动发布appBase目录下所有的Web应用.如果Web应用 中的server.xml没有相应的<Context>元素,将采用Tomcat默认的Context
-->
<Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true">
在<Host>元素中可以包含如下子元素
<Logger>, <Realm>, <Value>, <Context>
<Context>元素
它由Context接口定义.是使用最频繁的元素.每个<Context元素代表了运行在虚拟主机上的单个Web应用.一个<Host>可以包含多个<Context>元素.每个web应用有唯一
的一个相对应的Context代表web应用自身.servlet容器为第一个web应用创建一个
<!-- Context,对应于一个Web App
path : 该Context的路径名是"",故该Context是该Host的默认Context
docBase : 该Context的根目录是webapps/mycontext/
reloadable:如果这个属性设为true, Tomcat服务器在运行状态下会监视在WEB-INF/classes和Web-INF/lib目录CLASS文件的改运.如果监视到有class文件 被更新,服务器自重新加载Web应用
useNaming:指定是否支持JNDI,默认值为了true
cookies指定是否通过Cookies来支持Session,默认值为true
-->
<Context path="" docBase="mycontext" debug="0"/>
Tomcat Server处理一个http请求的过程
假设来自客户的请求为:http://localhost:8080/wsota/wsota_index.jsp
1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得
2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应
3) Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host
4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)
5) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context
6) Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)
7) path="/wsota"的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet
8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类
9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法
10)Context把执行完了之后的HttpServletResponse对象返回给Host
11)Host把HttpServletResponse对象返回给Engine
12)Engine把HttpServletResponse对象返回给Connector
13)Connector把HttpServletResponse对象返回给客户browser
20. Tomcat连接器
HTTP连接器
<Connector port="8086" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000" acceptCount="5000" maxThreads="2000"
executor="tomcatThreadPool" enableLookups="false" redirectPort="8443" URIEncoding="UTF-8"/>
SSL连接器
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
type="RSA" />
</SSLHostConfig>
</Connector>
AJP 1.3连接器
<Connector port="9112" protocol="AJP/1.3" redirectPort="8443" />
21. Tomcat自动化部署
1. 利用saltstack进行自动化部署
mkdir -p /srv/salt
cd /srv/salt
mkdir tomcat_deploy_env
vi install.sls
内容如下:
java:
user.present:
- shell: /bin/bash
- home: /home/java
- uid: 507
- password: '$1$java$2F85crPl61NUQq5qiCTFD1'
jdk_install:
file.managed:
- name: /usr/local/src/jdk-7u60-linux-x64.rpm
- source: salt://tomcat_deploy_env/files/jdk-7u60-linux-x64.rpm
cmd.run:
- cwd: /usr/local/src/
- name: rpm -ivh jdk-7u60-linux-x64.rpm
- unless: rpm -qa |grep jdk
tomcat_install:
file.managed:
- name: /usr/local/src/apache-tomcat-7.0.53.server.noi.tar
- source: salt://tomcat_deploy_env/files/apache-tomcat-7.0.53.server.noi.tar
cmd.run:
- cwd: /usr/local/src/
- name: tar xvf apache-tomcat-7.0.53.server.noi.tar && mv apache-tomcat-7.0.53 /usr/local/tomcat-zpapi
- unless: test -d /usr/local/apache-tomcat-7.0.53
注意:要创建一个/srv/salt/tomcat_deploy_env/files目录,把对应的jdk和tomcat文件放进去。
22. Tomcat错误
1. 从tomcat7升级为tomcat8,升级成功,使用一段时间后,发现catalina.out文件有报错。
03-Jan-2020 17:28:03.811 信息 [http-nio-8080-exec-5] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header
Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:483)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
解决方法:
配置tomcat的catalina.properties
添加或者修改:
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
这种方法只适合对应的应为,如果为中文则就不行。如果有?和&这些符合那么
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}?&
1. 换用低版本的tomcat,既然你是tomcat7.0.73版本,及以上版本有这种问题,我们可以暂时的逃避这个问题,选择低版本的tomcat。
2. 用post代替get请求,上面也说过了是get请求才会有这种情况,如果方便的话,我们完全可以采用post请求来实现这个功能
3. 在前端对前端URL进行编码
如果仍然解决不了,需要在conf/server.xml文件中,添加:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000" acceptCount="5000" maxThreads="2000"
executor="tomcatThreadPool" enableLookups="false" redirectPort="443" proxyPort="443" URIEncoding="UTF-8" relaxedPathChars="|{}[]," relaxedQueryChars="|{}[],"/>
23. tomcat开启调试端口
1. 在tomcat的bin目录的startup.sh,添加一行内容:
declare -x CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=18086"
24. tomcat的日志
1. 关闭日志输出
1. 修改conf/logging.properties文件
catalina.org.apache.juli.AsyncFileHandler.level = OFF 从FINE修改为OFF,OFF为禁止
catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
2. 关闭localhost_access_log日志
注释tomcat/conf/server.xml中最下方AccessLogValue
<! -- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
-->
3. 修改tomcat/bin/catalina.sh中
if [ -z "$CATALINA_OUT" ] ; then
#CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
CATALINA_OUT=/dev/null
fi
7. tomcat安全优化
8. tomcat的监控

浙公网安备 33010602011771号