一、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/a\master: 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监控模板

zbx_export_templates.xml

9、在zabbix界面添加对tomcat的监控

10、应用模板

11、堆内存使用状况

12、线程状态

最新文章

  1. 【分布式】Zookeeper与Paxos
  2. charles抓包工具
  3. error C4996: &#39;fopen&#39;: This function or variable may be unsafe.
  4. 深入浅出Redis01安装
  5. Eclipse launch failed.Binary not found解决方案
  6. AngularJS 整理资料
  7. python学习之-成员信息增删改查
  8. JSON入门之二:org.json的基本用法
  9. cxgrid学习
  10. 【原创】快应用QuickApp--HelloWorld体验
  11. 【English】20190429
  12. 南邮攻防训练平台逆向maze
  13. C++ 属性类
  14. mysql5.6做单向主从复制Replication
  15. leetcode1028
  16. 《剑指offer》第五十七题(为s的连续正数序列)
  17. servlet实现商品商场项目
  18. Linux及Windows系统配置JDK环境变量
  19. 安装cnpm
  20. [转]Outlook HTML渲染

热门文章

  1. 一键生成的BI智能数据看板谁不爱?
  2. Python:Python2和3不同print汉字方式
  3. 【python】GUI笔记
  4. MATLAB神经网络应用设计【1】
  5. laravel7 ajax H-ui框架添加数据至数据库
  6. 常用的公共 DNS 服务器 IP 地址
  7. 背包四讲 (AcWing算法基础课笔记整理)
  8. 2022年官网下安装MySQL最全版与官网查阅方法
  9. JDK8的 CHM 为何放弃分段锁
  10. Activemq特性之持久化--LevelDB特性