一、jdk和tomcat基础
1、web应用对比 apache: 两种方式运行php,一是用模块,二是用fastcgi nginx: 通过fastcgi处理动态请求,也可转发到tomcat 2、tomcat介绍 tomcat 下载地址: http://tomcat.apache.org/download-80.cgi tomcat 的监控主要是监控JVM 3、Java的版本介绍 J2EE: java企业版和嵌入式 J2SEE: java标准版 JME2: java手机版 jdk: 一个开发工具包,包含jre jre: 仅是一个java运行环境 jdk下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
二、批量安装配置jdk和tomcat
主机名 | IP | 软件 |
node1 | 192.168.1.11 | salt-master、salt-minion、jdk、tomcat |
node2 | 192.168.1.12 | salt-minion、jdk、tomcat |
1、安装配置saltstack
1、salt 服务端 # yum install salt-master salt-minion -y # vim /etc/salt/master file_roots: #指定工作目录 base: - /srv/salt # vim /etc/salt/minion master: 192.168.1.11 #salt 服务器的地址 # cd /srv/ && mkdir salt #创建salt目录 # /etc/init.d/salt-master start # /etc/init.d/salt-minion start 2、salt 客户端 # yum install salt-minion -y # sed -i '/#master/amaster: 192.168.1.11' minion #salt 服务器的地址 # /etc/init.d/salt-minion start
2、认证和编写配置文件
1、认证客户端 # salt-key #查看salt-minion状态 # salt-key -A -y #将salt-minion加入管理 # salt '*' test.ping #测试 2、创建JDK、Tomcat以及安装软件files目录,做到解耦 # cd /srv/salt # mkdir -p jdk/files # mkdir -p tomcat/files # cp jdk-8u77-linux-x64.tar.gz jdk/files/ # cp apache-tomcat-8.0.33.tar.gz tomcat/files/ 3、编写配置文件 1) 编写jdk的sls模块 # vim /srv/salt/jdk/install.sls jdk-install: file.managed: - name: /usr/local/src/jdk-8u77-linux-x64.tar.gz - source: salt://jdk/files/jdk-8u77-linux-x64.tar.gz - user: root - group: root - mode: 755 cmd.run: - name: cd /usr/local/src/ && tar xvf jdk-8u77-linux-x64.tar.gz && mv jdk1.8.0_77 /usr/local/jdk && chown -R root.root /usr/local/jdk -R - unless: test -d /usr/local/jdk - require: - file: jdk-install jdk-conconfig: file.append: - name: /etc/profile - text: - export JAVA_HOME=/usr/local/jdk - export PATH=$JAVA_HOME/bin:$PATH - export PATH=$TOMCAT_HOME/bin:$PATH 2) 编写tomcat的sls模块 # vim /srv/salt/tomcat/install.sls include: - jdk.install tomcat-install: file.managed: - name: /usr/local/src/apache-tomcat-8.0.33.tar.gz - source: salt://tomcat/files/apache-tomcat-8.0.33.tar.gz - user: root - group: root - mode: 755 cmd.run: - name: cd /usr/local/src && tar xvf apache-tomcat-8.0.33.tar.gz && mv apache-tomcat-8.0.33 /usr/local/tomcat && chown -R root.root /usr/local/tomcat - unless: test -d /usr/local/tomcat - require: - file: tomcat-install tomcat-config: file.append: - name: /etc/profile - text: - export TOMCAT_HOME=/usr/local/tomcat 3) 编写topfile总入口的sls模块 # vim /srv/salt/top.sls base: '*': - tomcat.install
3、执行代码并检查客户端状态
1、执行 # salt '*' state.highstate #执行salt高级状态
2、检查是否安装成功(客户端node2) # ls /usr/local/jdk/ # ls /usr/local/tomcat/ # source /etc/profile # java -version # /usr/local/tomcat/bin/version.sh #查看tomcat状态
三、tomcat安全规范
1、telnet管理端口保护 # vim server.xml <Server port="8055" shutdown="dfhsdh"> #修改关闭端口号(最好8000~8099),关闭指令 2、ajp连接端口保护 # vim server.xml <Connector port="8099" protocol="AJP/1.3" /> #修改ajp端口号,若不用可禁用 3、禁用管理端 # rm /conf/tomcat-users.xml #删除默认文件,重启会自动生成 # rm /webapps/* #删除webapps下默认的目录和文件 # vim server.xml #应用根目录修改到安装目录以外 <Context path="" docBase="/app/tomcat/" debug="0" reloadable="false" crossContext="true"/> 4、降权启动 # chown -R test.test /home/test/tomcat # su - test $ ./tomcat/bin/startup.sh #非root启动tomcat 5、文件列表访问控制 # vim web.xml <init-param> <param-name>listings</param-name> <param-value>false</param-value> #false:不列出目录文件 </init-param> 6、版本信息隐藏 # vim web.xml #修改conf/web.xml或WEB-INF/web.xml <error-page> <error-code>401</error-code> #重定向403、404、500到指定页面 <location>/WEB-INF/jsp/401.jsp</location> </error-page> <error-page> <error-code>403</error-code> #避免错误时,暴露版本信息 <location>/WEB-INF/jsp/403.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/WEB-INF/jsp/404.jsp</location> </error-page> 7、server header重写 # vim server.xml #server=xxx,隐藏tomcat包头信息 <Connector port="8080" protocol="HTTP/1.1" server="webserver" connectionTimeout="20000" redirectPort="8443" /> 8、启停脚本权限回收 # chmod -R 744 tomcat/bin/* #防止其他用户有起停线上Tomcat 9、访问日志格式规范 # vim server.xml #开启Referer和User-Agent记录,出现安全问题,根据日志排查 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t %r %s %b %{Referer}i %{User-Agent}i %D" resolveHosts="false"/> 10、访问限制 # vim server.xml #设置ip的白名单 <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.*,192.168.2.*" deny=""/> <Valve className="org.apache.catalina.valves.RemoteHostValve" allow="www.test.com,*.test.com" deny=""/>
四、tomcat性能优化
1、外部优化(系统优化、jvm优化)
1、jps命令 介绍: 类似linux的ps命令,显示Java进程 # jps #仅显示进程id,主类名 # jps -q #仅显示进程id # jps -l #显示完全的包名,主类名,jar完全路径名 # jps -v #显示jvm参数 # jps -m #显示主函数(main)传入的参数 2、Jstack命令(查看线程) 介绍: 打印指定的java进程ID、core file、远程调试服务的Java堆栈信息 pid #java的进程号 executable #产生core dump的java可执行程序 core #打印core文件 remote-hostname-or-ip #远程debug服务器的名或IP server-id: #唯一id,若一台主机上有多个远程debug服务 # jstack -l #列出长列表,关于锁的附加信息(不常用) # jstack -F #强制列出栈信息,无响应时用(不常用) # jstack -m #混合模式列出堆栈信息(java和native c/c++) 3、Jmap命令(查看内存) 列出某个java进程(pid)内存的所有对象的情况 # jmap -dump #生成Java堆转储快照 # jmap -finalizerinfo #显示正等候回收的对象的信息 # jmap -heap #显示Java堆详细信息 # jmap -histo #显示堆中对象的统计信息 # jmap -permstat #显示持久代对象信息 # jmap -clstats #显示类加载器信息 # jmap -F #当没有响应时,强制模式 # jmap -J #传递参数给jmap启动的jvm 4、jstat命令(性能分析) 查看类装载,内存,垃圾收集,gc相关信息 # jstat -option -t #option:参数选项,-t:显示系统的时间 # jstat -option -h #指定输出多少行后,输出一次表头 # jstat -option vmid #进程的pid # jstat -option interval #间隔时间,单位:秒 # jstat -option count #统计的次数 # jstat -class #显示加载class的数量,及所占空间等信息 # jstat -compiler #显示JIT编译器编译过的方法、耗时等相关信息 # jstat -gc #显示堆状况,包括eden区、survivor区(s0,s1)、老年代、永久代等 # jstat -gccapacity #显示各个代的容量以及使用情况 # jstat -gcmetacapacity #显示metaspace的大小 # jstat -gcnew #显示新生代信息 # jstat -gcnewcapacity #显示新生代大小和使用情况 # jstat -gcold #显示老年代和永久代的信息 # jstat -gcoldcapacity #显示老年代的大小 # jstat -gcutil #显示垃圾收集信息的百分比 # jstat -gccause #显示垃圾回收的相关信息,并显示最后一次和当前gc原因 # jstat -gcpermcapacity #显示永久代大小和使用情况 # jstat -printcompilation #输出JIT编译的方法信息
2、内部优化
1、禁用DNS查询,调整线程数,压缩 # vim server.xml <Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000" acceptCount="300" maxThreads="300" maxProcessors="1000" minProcessors="5" useURIValidationHack="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="d:/tomcat2/conf/shnlap93.jks" keystorePass="aaaaaa" /> 2、参数说明 protocol="HTTP/1.1" #协议类型(BIO(阻塞型IO),NIO,NIO2,APR) minSpareThreads="100" #最小空闲线程数 maxSpareThreads="500" #最大空闲线程数 enableLookups="false" #禁用DNS查询 disableUploadTimeout="true" #上传的超时时间(开启长时间连接) connectionTimeout="20000" #超时时间 acceptCount="700" #队列中的请求数 maxThreads="600" #最大线程数 maxProcessors="1000" #最大处理的线程数 useURIValidationHack="false" #是否开启对URL的检查 compression="on" #开启压缩 compressionMinSize="2048" #超过2k大小才压缩 maxConnections="1000" #指定时间内,接受和处理的最大连接数 maxHttpHeaderSize="8192" #请求和响应的HTTP头的最大大小 maxPostSize="10485760" #post请求提交最大大小 acceptorThreadCount="8" #Acceptor线程个数(CPU数),接受连接的线程数 allowTrace="false" #是否跟踪请求转发过程 SSLEnabled="true" #是否启用SSL通信 scheme="https" #协议的名字 secure="true" #是否使用安全模式通信 clientAuth="false" #是否要验证客户端证书 maxKeepAliveRequest="100" #最大保持活跃的连接数 threadPriority="5" #JVM中请求处理线程优先级
五、JVM 故障排除
1、jps命令(查看Java的pid)
# jps -lvm #获取java的PID
2、jstack命令(导出堆栈信息)
# jstack 9213 > 9213.txt #导出占用CPU高的线程堆栈信息
3、top命令(查看CPU占用高的线程)
# top -H -p 9213 #查看进程的那个线程占用CPU过高
4、将线程的PID转换为16进制
# echo "obase=16; 9235" | bc #将线程高的PID转换为16进制
5、查找线程堆栈信息
# vim 9213.txt #查找转换为16进制的线程PID,找到对应的线程栈
6、分析负载较高的线程栈都是什么业务操作,优化程序并处理问题
六、通过zabbix监控jmx
1、原理
1、zabbix通过zabbix_java_gateway的management的API去查询,主机的java的具体情况,主机端要开启jmx的远程连接 2、zabbix_java_gateway可以安装在任何一台机器
2、下载安装包(要和zabbix server版本一致)
# wget http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-java-gateway-2.2.9-1.el6.x86_64.rpm # wget http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-2.2.9-1.el6.x86_64.rpm # yum localinstall *.rpm -y
3、修改配置文件并启动
1、修改配置文件
# grep '^[a-zA-Z]' /etc/zabbix/zabbix_java_gateway.conf LISTEN_IP="0.0.0.0" #监听的IP LISTEN_PORT=10052 #监听的端口 PID_FILE="/var/run/zabbix/zabbix_java.pid" #pid保存路径 START_POLLERS=5 #默认启动监听jmx的线程数,修改为监控的jmx数量
2、启动服务
# /etc/init.d/zabbix-java-gateway start #启动服务
4、配置zabbix Server
# vim zabbix_server.conf JavaGateway=JavaGateway= 127.0.0.1 #java gateway的地址 JavaGatewayPort=10052 StartJavaPollers=5
5、开启远程连接(所有的tomcat主机端)
# vim catalina.sh CATALINA_OPTS=" -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=10052 #jmx监听的端口,要和jmx服务端一直 -Dcom.sun.management.jmxremote.ssl=false #不开启ssl服务 -Dcom.sun.management.jmxremote.authenticate=false #不开启认证 -Djava.rmi.server.hostname=192.168.0.201" #tomcat自己的ip地址
6、重启服务
# ./catalina.sh stop && sleep 5 && ./catalina.sh start #重启tomcat # /etc/init.d/zabbix_server restart
7、配置编译安装zabbix_server
1、编译安装的zabbix时,添加--enabled-java选项 2、修改配置文件 # grep "^[a-Z]" /usr/local/zabbix/sbin/zabbix_java/settings.sh LISTEN_IP="0.0.0.0" LISTEN_PORT=10052 PID_FILE="/tmp/zabbix_java.pid" 3、启动服务 # /usr/local/zabbix/sbin/zabbix_java/startup.sh #启动java gateway服务
8、导入jmx监控模板
9、在zabbix界面添加对tomcat的监控
10、应用模板
11、堆内存使用状况
12、线程状态