学习Tomcat(一)

一、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、线程状态

   

posted on 2019-01-15 14:18  五光十色  阅读(276)  评论(0编辑  收藏  举报

导航