最近公司又在搞安全监控,针对tomcat关于AJP端口存在的漏洞要求升级指定版本或关闭该端口重启服务,小编所在的部门关于tomcat外置服务器AJP端口早已关闭,得益于前技术总监的优化建议。

以下是关于前技术总监关于tomcat优化的建议,拿小本本记下的内容:

1.关闭AJP端口8009

在tomcat前再使用web服务器时,即便tomcat提供的都是静态资源文件,情况都要比直接使用http连接差的多,如果确实有需要集成前置服务器,走AJP协议要比http协议性能更好。通常前置服务器有nginx做静态伺服器和反向代理足矣,无需使用AJP,不用的资源直接关掉即可。

2.关闭access_log

外置tomcat服务器server.xml中会输出access_log日志,基本没有什么价值,可以关闭了。springboot中内置的tomcat默认就是关闭access_log的。

<Valve className="org.apache.catalina.valves.AccessLogValve" 
directory="logs"  prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />

3.关闭无用的servlet

有些无用的servlet配置也可以去掉,例如未使用jsp可以关掉相关的配置。

<servlet>
  <servlet-name>jsp</servlet-name>
  <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
  <init-param>
    <param-name>fork</param-name>
    <param-value>false</param-value>
  </init-param>
  <init-param>
    <param-name>xpoweredBy</param-name>
    <param-value>false</param-value>
  </init-param>
  <load-on-startup>3</load-on-startup>
</servlet>

4.war包与tomcat分离开

不要直接把war包上传到webapps下发布,应该将war包放到指定的目录,并在conf/Catalina/localhost目录下添加相应的配置文件,内容如下。

<?xml version="1.0" encoding="UTF-8"?>
<Context path="" docBase="D:\demo.war" />

5.生产环境禁止启用<Context>属性的reloadable=true

reloadable是需要线程监听程序文件修改的,然后重新加载web应用,默认值是false(不同版本可能有差异),开发测试可以启用。

6.连接器connector使用线程池

server.xml文件中有注释掉的相关配置,合理设置线程池最大值,最小值,最大连接数,超时时间等,可通过jemeter进行压力测试,没有放之四海皆准的配置。namePrefix可以自定义方便标识。

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-star-"
 maxThreads="200" 
connectionTimeout="20000" minSpareThreads="10"/>

7.jsp预编译

我们知道jsp是通过servlet写出的,所以访问jsp页面会进行编译操作,jsp->java->class,提前把jsp编译成class可以减少运行时编译,当然这需要因地制宜。

8.连接器配置protocal

设置协议处理传入的流量,默认值是HTTP/1.1,tomcat会自动选择apr(如果存在相关本地库)或java nio,也可指定协议。

org.apache.coyote.http11.Http11NioProtocol -non blocking Java NIO connector
org.apache.coyote.http11.Http11Nio2Protocol -non blocking Java NIO2 connector
org.apache.coyote.http11.Http11AprProtocol -the APR/native connector.
9.合理设置JAVA_OPTS

相关设置需要结合服务器信息(内存,处理器等),可以打开gc日志,使用jemeter压测进行相应调整,适当调整各代大小减少gc。

set "JAVA_OPTS=%JAVA_OPTS% -server -Xms1024m -Xmx1024m -Xss512k -Xloggc:/star_gc.log -XX:+PrintGCDetails -XX:+UseG1GC"

10.有关session管理

如果有会话管理,可以直接使用tomcat生成的sessionId策略,无需自己再生成一套sessionId,或者实现SessionIdGenerator 定义自己的session管理,尽量减少重复性工作。