上图,就知道Tomcat在JAVA容器界是多么重要。html
Tomcat是一个开箱即用的软件,配置java环境变量便可把Tomcat进程运行起来,但要投入生产环境,有哪些须要注意的呢?前端
调JVMjava
垃圾收集器对比与应用场景:web
配置链接器(有三种链接器供选择)redis
protocol=”HTTP/1.1”
protocol=”org.apache.coyote.http11.Http11NioProtocol”
protocol=”org.apache.coyote.http11.Http11AprProtocol”
下面是三者之间对比:算法
配置模版:sql
推荐使用JavaMelody 可以监测Java或Java EE应用程序服务器,并以图表的方式显示:Java内存和Java CPU使用状况,用户Session数量,JDBC链接数, 和http请求、sql请求、jsp页面与业务接口方法(EJB三、Spring、 Guice)的执行数量,平均执行时间,错误百分比等。图表能够按天,周,月,年或自定义时间段查看。数据库
下载地址:
https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/javamelody/javamelody-1.48.0.jar apache
配置web.xml:segmentfault
<filter> <filter-name>monitoring</filter-name> <filter-class>net.bull.javamelody.MonitoringFilter</filter-class> </filter> <filter-mapping> <filter-name>monitoring</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>net.bull.javamelody.SessionListener</listener-class> </listener>
http://host/context/monitoring
Tomcat的高可用官方目前是3种方案:
官方给的集群方案。
高可用涉及面比较广,须要根据本身业务状况设计对应的方案,推荐两个连接能够详细研究:
https://tomcat.apache.org/tomcat-8.0-doc/cluster-howto.html
https://segmentfault.com/a/1190000009591087
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" Server =" " redirectPort="8443" />
安全启动进程,试想有人在请求中加<% System.exit(1); %>,后果是很严重的。
官方建议tomcat正确启动姿式,
./startup.sh -security
参考连接:https://tomcat.apache.org/tomcat-6.0-doc/security-manager-howto.html
推荐使用HTTPS协议,若是tomcat直接对外访问就加一个HTTPS吧,若是前端有负载均衡器,负载均衡器使用HTTPS,tomcat放在一个安全的内网使用http也可;
为Cookie设置HttpOnly属性
推荐tomcat启动使用单独的普通用户,避免黑客攻击后致使整个服务器沦陷;
在部署生产环境时,去除tomcat默认的应用和页面,避免存在安全风险,删除$tomcat/webapps目录下全部文件便可;
改变Tomcat的shutdown端口和命令,假如默认的8005端口对外网访问,能够直接经过远程将运行的tomcat关闭,很危险,建议修改server.xml
<Server port="8867" shutdown="NOTGONNAGUESS">
替换默认的404,403,500页面,和避免异常报错暴露在页面
在web.xml文件下添加到</web-app>以前
<error-page> <error-code>404</error-code> <location>/error.jsp</location> </error-page> <error-page> <error-code>403</error-code> <location>/error.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/error.jsp</location> </error-page> <error-page> <exception-type>java.lang.Exception</exception-type> <location>/error.jsp</location> </error-page>
当咱们的java应用比咱们预期的要慢的时候,咱们就须要用到thread dumps,而后分析它们并知道他们的瓶颈或阻塞的线程等信息,而后针对性的优化从而提示整个系统的性能。
首先咱们了解2个概念;
了解java线程背景信息
线程同步:
为了解决同时访问资源,一个线程须要在访问共享资源时使用线程同步。Java中使用monitor做为线程同步,每一个对象都有一个monitor,一个monitor只能被一个线程拥有。假如其余线程得到这个monitor须要进入等待队列,等待释放;
线程状态:
线程类型:
获取Java堆栈
jps -v #获取java进程PID jstack -F 31336 > dump.log #强制dump出线程堆栈(不一样版本,获取方式不同)
【注】:线程堆栈是某一时刻的堆栈快照,为了分析线程状态改变,须要提取5-10次,每5秒dump一次。
Head dump是JVM某个时刻的内存快照,能够帮助咱们分析内存泄露和分析java应用的内存使用状况。Heap dump一般市存储2进程hprof文件,咱们打开和分析须要用jhat 或者JVisualVM等其余工具。
jmap -F -dump:live,format=b,file=/tmp/dump.hprof 12587 #dump时间比较长
jhat /tmp/dump.hprof 12587
GC叫作垃圾收集,正常的垃圾回收是对整个JVM健康起着重要做用,若是回收不及时,会致使GC频繁,GC时间过长,严重状况可能致使OOM,严重影响业务正常。下面介绍怎么开启gc日志,命令行查看gc,经常使用gc的含义。
-XX:+PrintGCDetails -Xloggc:/opt/tmp/myapp-gc.log #这个支持java 8 -Xlog:gc*:file=/opt/tmp/myapp-gc.log #这个支持java 9
有下面的参数适合于java 8能够选择性开启:
-XX:+DisableExplicitGC #开发想本身调用垃圾回收,在生产环境中不建议开发调用:System.gc() or Runtime.getRuntime().gc() -XX:+PrintGCDetails #默认是禁用的,能够打印更加详细的垃圾回收信息 -XX:+PrintGCApplicationStoppedTime #默认是禁用的,这个选项表明在GC过程当中,应用pause时间 -XX:+PrintGCApplicationConcurrentTime #默认是禁用的,这个选项表明在GC过程当中,应用running时间 -XX:+PrintGCDateStamps #打印每一个gc的日期和时间 -Xloggc:gclog.log #gclog.log是gc日志的具体路径,全部gc日志记录在这个文件 -XX:+UseGCLogFileRotation #假如gc日志达到指定的大小,会开启自动轮换 -XX:NumberOfGCLogFiles=5 #默认是1,轮换日志的数目 -XX:GCLogFileSize=2000k #指定gc日志的大小,当达到这个大小后会轮换一次
jps -v #获取java进程PID jstat –gc PID 1000 #PID是jvm的进程号
输出内容解释:
S0C #显示当前Survivor 0区的大小
S1C #显示当前Survivor 1区的大小
S0U #显示当前使用Survivor 0区的大小
S1U #显示当前使用Survivor 1区的大小
EC #显示E区的大小
EU #显示已使用E区的大小
OC #显示old区的大小
OU #显示已经使用的old区
PC #显示permanent区的大小
PU #显示已经使用的permanent区大小
YGC #young区发生gc的次数
YGCT #在young区累计的时间
FGC #full gc发生的次数
FGCT #full gc累计占有时间
GCT #gc累计消耗时间
详细的能够见下面:
https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html
做者:连接:https://www.jianshu.com/p/355ee06c3d2b