最近公司又在搞安全监控,针对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 "%r" %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管理,尽量减少重复性工作。