1Tomcat的缺省端口是多少,怎么修改?

默认端口为8080,可以通过在tomcat安装包conf目录下,service.xml中的Connector元素的port属性来修改端口。


2Tomcat 有哪几种Connector 运行模式(优化)?

有三种,这三种模式的不同之处如下:
BIO:一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7版本或更低版本中,在Linux系统中默认使用这种方式。
NIO:利用Java的异步IO处理,可以通过少量的线程处理大量的请求。Tomcat8.0.x中默认使用的是NIO。Tomcat7必须修改Connector配置来启动。
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000" redirectPort="8443"/>

APR:即Apache Portable Runtime,从操作系统层面解决io阻塞问题。Tomcat7Tomcat8Win7或以上的系统中启动默认使用这种方式。


3Tomcat有几种部署方式?

利用Tomcat的自动部署:把web应用拷贝到webapps目录(生产环境不建议放在该目录中)。
Tomcat在启动时会加载目录下的应用,并将编译后的结果放入work目录下。
使用Manager App控制台部署:在tomcat主页点击“Manager App” 进入应用管理控制台,可以指定一个web应用的路径或war文件。
修改conf/server.xml文件部署:在server.xml文件中,增加Context节点可以部署应用。
增加自定义的Web部署文件:在conf/Catalina/localhost/路径下增加 xyz.xml文件,内容是Context节点,可以部署应用。


4Tomcat容器是如何创建servlet类实例?用到了什么原理?

当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对 xml文件进行解析,并读取Servlet注册信息。
然后,将每个应用中注册的servlet类都进行加载,并通过 反射的方式实例化(有时候也是在第一次请求时实例化)。
Servlet注册时配置load-on-startup如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。

5Tomcat如何优化?

Tomcat作为Web服务器,它的处理性能直接关系到用户体验,下面是几种常见的优化措施:

5.1杂项配置


5.2线程数优化

找到<Connector port="8080" protocol="HTTP/1.1">,增加maxThreadsacceptCount属性(使acceptCount大于等于maxThreads),如下:
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443"acceptCount="500" maxThreads="400" />
其中:

5.3使用线程池优化

server.xml中增加executor节点,然后配置connectorexecutor属性,如下:
<Executor name="tomcatThreadPool" namePrefix="req-exec-"maxThreads="1000" 
  minSpareThreads="50"maxIdleTime="60000"/><Connector port="8080" protocol="HTTP/1.1"executor="tomcatThreadPool"/>
其中:

备注:
Tomcat并发用户量大的时候,单个JVM进程确实可能打开过多的文件句柄,这时会报java.net.SocketException:Too many open files错误。
可使用下面步骤检查:

5.4附:JVM相关参数

-Xms:虚拟机初始化时的最小堆内存。
-Xmx:虚拟机可使用的最大堆内存。
-Xms与-Xmx设成一样的值,避免JVM因为频繁的GC导致性能大起大落
-XX:MaxNewSize:新生代占整个堆内存的最大值。
另外还有方法区参数调整(注意:JDK版本)、垃圾收集器等优化。


6Tomcat的常用配置有哪些?

备注:本题的答案内容基于Tomcat10

6.1server.xml


标签名

属性名

作用

Server

port

指定Tomcat监听的关闭端口号,默认为8005。



shutdown

指定关闭命令字符串,默认为SHUTDOWN。

Service

name

此服务的显示名称,主要用于在日志中进行标识服务。

Connector

port

指定连接器监听的端口号,对于HTTP协议通常是8080。



protocol

指定使用的协议,如HTTP/1.1AJP/1.3。



connectionTimeout

客户端连接超时时间(毫秒)。



redirectPort

在需要重定向到SSL时使用的端口号。

Engine

name

引擎的名称,默认主机名为localhost。



defaultHost

默认主机名。

Host

name

虚拟主机的名称。



appBase

Web应用的基本目录。



unpackWARs

如果设置为true,则Tomcat会自动解压WAR文件。



autoDeploy

如果设置为true,则Tomcat会自动部署应用。

Context

docBase

Web应用的文档基础路径。



path

Web应用的上下文路径。



reloadable

如果设置为true,则支持热部署。

Realm

className

指定Realm类的全限定名。

GlobalNamingResources

resourceName

资源名称。



type

资源类型,如javax.sql.DataSource。



description

资源描述。



factory

工厂类名。



pathname

资源路径名。

Valve

className

指定阀门类的全限定名。

AccessLogValve

directory

访问日志目录。



prefix

日志文件前缀。



suffix

日志文件后缀。



pattern

日志格式模式。

Listener

className

指定监听器的类名。

6.2context.xml


标签名

属性名

作用

Context

path

指定Web应用的访问路径。



docBase

Web应用的文件系统路径或WAR文件路径。



reloadable

如果设置为true,Tomcat将在运行时监视Web应用的变化并自动重新加载。

WatchedResource



指定Tomcat应监视的资源文件,如果这些文件发生变化,将触发应用重新加载。

Resource

name

资源的名称,用于JNDI查找。



auth

认证类型,通常为Container。



type

资源的类型,例如javax.sql.DataSource。



driverClassName

JDBC驱动类名。



url

数据库URL。



username

数据库用户名。



password

数据库密码。



maxActive

连接池支持的最大连接数。



maxIdle

连接池中最多可空闲的连接数。



maxWait

连接池中连接用完时,新的请求等待时间(毫秒)。