zoukankan      html  css  js  c++  java
  • 学习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/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监控模板

     zbx_export_templates.xml

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

    10、应用模板

    11、堆内存使用状况

     12、线程状态

       

  • 相关阅读:
    将"089,0760,009"变为 89,760,9
    单向循环链表
    双链表复习
    【C语言】scanf()输入浮点型数据
    【C语言】一元二次方程(求实根和虚根)
    输入一个三位正整数,输出百位数,十位数,个位数
    输入身份证号,输出出生日期
    比较四个数的大小
    比较三个数的大小
    比较两个数的大小
  • 原文地址:https://www.cnblogs.com/wuhg/p/10271640.html
Copyright © 2011-2022 走看看