Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day51】—— tomcat

2021-12-31 15:10:01 浏览数 (1)

车票

  • 面试题1:tomcat的端口是多少,在哪修改的?
    • 追问1:tomcat改过Https协议吧,说一下步骤
    • 追问2:tomcat常用的端口如:8005、8009、8080、8443,请简述一下各端口的作用
  • 面试题2:tomcat的优化方式都有哪些?
  • 面试题3:tomcat有几种部署方式?
    • 追问1:tomcat容器是如何创建servlet类实例?用到了什么原理?
  • 每日小结

  本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识集合容器并发编程JVMSpring全家桶MyBatis等ORMapping框架MySQL数据库Redis缓存RabbitMQ消息队列Linux操作技巧等。

  tomcat问题在面试中遇到的频率虽然不高,但一般问到了你就蒙了,这是很伤的。今天通过一篇文章我们走一篇tomcat常问面试题,希望对你有用~

面试题1:tomcat的端口是多少,在哪修改的?

tomcat缺省端口是8080;

修改tomcat 端口;

  1. 找到tomcat目录下的conf文件夹;
  2. 进入conf文件夹找到server.xml文件
  3. 打开server.xml文件
  4. 在server.xml文件里面找到Connector 标签,把port=“8080”,改成需求端口即可。
代码语言:javascript复制
<Connector port="8080" redirectPort="8443" connectionTimeout="20000" protocol="HTTP/1.1"/>

追问1:tomcat改过Https协议吧,说一下步骤

  如果tomcat服务需要修改成Https协,需要有以下几步:

1、生成SSL证书,证书一般由公司购买;当然,老板不想花钱也可以我们程序员自己生成一个自签名的证书;

2、修改tomcat/conf/Server.xml,首先将下方这行注释掉:

代码语言:javascript复制
<!-- <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> -->

然后将Http协议配置改为Https协议配置即可:

https协议:

代码语言:javascript复制
<Connector port="8080" protocol="HTTP/1.1" SSLEnabled="true" 
   maxThreads="150" scheme="https" secure="true" 
   clientAuth="false" sslProtocol="TLS"  
   keystoreFile="D:tomcatapache-tomcat-7.0.79bintest.keystore" keystorePass="123456" URIEncoding="utf-8"/>

http协议:

代码语言:javascript复制
<Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" URIEncoding="utf-8"/>

也可以参考以下博文了解详情:《https协议配置》

追问2:tomcat常用的端口如:8005、8009、8080、8443,请简述一下各端口的作用

  • 8005 ==> 8005端口是关闭tomcat进程所用
代码语言:javascript复制
<Server shutdown="SHUTDOWN" port="8005">
  • 8009 ==> HTTP等反向代理tomcat时就可以使用ajp协议反向代理到该端口
  • 8080 ==>默认的HTTP监听端口
代码语言:javascript复制
<Connector port="8080" redirectPort="8443" connectionTimeout="20000" protocol="HTTP/1.1"/>
  • 8443 ==> 默认的HTTPS监听端口。(默认关闭)

面试题2:tomcat的优化方式都有哪些?

  tomcat默认参数是为开发环境制定,而不是生产环境,尤其是内存和线程的配置,默认都很低,容易成为性能瓶颈。这个问题是问tomcat这块儿的高频问题,大家可以留意一下,在实际工作中也可以投入使用。

tomcat内存优化

  • linux修改TOMCAT_HOME/bin/catalina.sh,在前面加入
代码语言:javascript复制
JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai"
  • windows修改TOMCAT_HOME/bin/catalina.bat,在前面加入
代码语言:javascript复制
set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m

  这里将最大堆内存配置为:1024m,实际生产环境中,还是按照服务器具体硬件配置进行优化。

tomcat 线程优化

代码语言:javascript复制
<Connector port="80" protocol="HTTP/1.1" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" acceptCount="700"
connectionTimeout="20000" redirectPort="8443" />
  • maxThreads=“600” ///最大线程数
  • minSpareThreads=“100”///初始化时创建的线程数
  • maxSpareThreads=“500”///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
  • acceptCount=“700”//指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理

  这里是http connector的优化,如果使用apache和tomcat做集群的负载均衡,并且使用ajp协议做apache和tomcat的协议转发,那么还需要优化ajp connector。

禁用DNS查询

  DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。

enableLookups如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址。

设置session过期时间

confweb.xml中通过参数指定:(单位为分钟)

代码语言:javascript复制
<session-config>   
    <session-timeout>180</session-timeout>     
</session-config> 

面试题3:tomcat有几种部署方式?

war包部署(常用)

  War包部署和Web目录部署是一样的,是不过是war包是经过压缩的而已,只要将war包拷贝到tomcat的目录下即可,不用解压。如果没有修改server配置文件,那么就拷贝到webapps目录下。

通过Context描述文件部署

1、在tomcat中的conf目录下的server.xml文件中,在节点中添加一个context,具体为:

代码语言:javascript复制
<Context Path="/test"Docbase="E:workPlace-2019test" Debug="0" Reloadable="True"></Context>

2、增加自定义的Web部署文件。

  在conf/Catalina/localhost/ 路径下增加 demo.xml文件,内容是Context节点,可以部署应用。xml文件和上方写法相同。

追问1:tomcat容器是如何创建servlet类实例?用到了什么原理?

  当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过反射的方式实例化。

  有时候也是在第一次请求时实例化,在servlet注册时加上如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。

每日小结

  今天我们复习了面试中常问的tomcat相关问题,今天的内容你做到心中有数了么?对了,如果你的朋友也在准备面试,请将这个系列扔给他,如果他认真对待,肯定会感谢你的!!好了,今天就到这里,学废了的同学,记得在评论区留言:打卡。,给同学们以激励。

0 人点赞