Tomcat 常規配置並通過zabbix 監控 jvm狀態


一:jdk和tomcat基礎

apache有兩種方式運行php,一是使用模塊,二是使用fastcgi

nginx也可以通過fastcgi處理動態請求,也可以轉發至tomcat

tomcat監控主要是監控JVM,優化主要是外部和內部,內部的有最大空閑,最小空閑等

J2EE:java的企業版和嵌入式

J2SEE:java的標准版

JME2:手機版的java

jdk和jre:jdk是一個開發工具包,一般會包含jre,jre僅是一個java運行環境,sdk是一個開發工具 

tomcat 下載地址:

http://tomcat.apache.org/download-80.cgi

jdk下載地址:

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

 

二:通過saltstack 批量安裝jdk和tomcat,並配置環境變量:

1、salt客戶端:

yum install salt-minion -y

vim  /etc/salt/minion

master: 192.168.10.205 #salt 服務器的地址

/etc/init.d/salt-minion  start

 

2、salt 服務端:

yum install salt-minion -y

vim  /etc/salt/master

file_roots: #指定工作目錄
  base:
    - /srv/salt

cd /srv/

mkdir salt

/etc/init.d/salt-master  restart

salt-key  -A

cd /srv/salt/

[root@node5 salt]# mkdir jdk tomcat

[root@node5 salt]# vim  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

[root@node5 salt]# mkdir  jdk/files

[root@node5 salt]# cp  /root/jdk-8u77-linux-x64.tar.gz  jdk/files/

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

[root@node5 salt]# mkdir  tomcat/files

[root@node5 salt]# cp /root/apache-tomcat-8.0.33.tar.gz  tomcat/files/

[root@node5 salt]# vim top.sls 

base:
  '*':
    - tomcat.install

 

執行即結果:
[root@node5 salt]#  salt "*" state.highstate

 

三:客戶端驗證:

 

server.xml ,對服務和引擎的配置文件:

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context path="" reloadable="true" docBase="/opt/apache-tomcat-6.0.37/webapps/mobile/" />

 

tomcat-users.xml web管理,不建議打開:

[root@node6 tomcat]# vim conf/tomcat-users.xml 

  <role rolename="manager-gui"/>
  <role rolename="admin-gui"/>
  <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>

 四:tomcat安全規范:

1.telnet管理端口保護

1、<Server port="8005" shutdown="SHUTDOWN">  #將端口和 命令改了,或不啟用,因為telnet到本端口可以使用默認SHUTDOWN將tomcat關閉。
 #例如:
[root@node6 tomcat]# ss -tnl | grep 8080 
LISTEN     0      100                      :::8080                    :::*     
[root@node6 tomcat]# telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'
SHUTDOWN #會將tomcat服務停止
Connection closed by foreign host.
[root@node6 tomcat]# ss -tnl | grep 8080 

 2.ajp連接端口保護

#更改ajp的端口,在8000-8999之間,如不使用ajp可以禁用

3.禁用管理端

#可以刪除webapp里面的所有默認目錄文件

4.降權啟動

#使用非root啟動tomcat

5.文件列表訪問控制

#conf/web.conf文件中default部分listing的配置必須為false,false為不能列出目錄文件,true為允許,默認為false

6.版本信息隱藏

 

7.server header重寫

#在server.conf中的http部分加入 server=“xxx”,隱藏tomcat包頭息信息
<Connector port="8080" protocol="HTTP/1.1" server="webserver"
 connectionTimeout="20000" redirectPort="8443" />

 

8.啟停腳本權限回收

#將啟動和關閉的腳本權限改為744

9.訪問日志格式規范

 

 

五:tomcat監控:

tomcat監控主要是監控jvm,JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用於計算設備的規范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。

jps命令:是jdk包里面的,只顯示java進程

  -m輸出傳遞給main方法的參數,如果是內嵌的JVM則使出為null

  -l 輸出應用程序主類的完整包名,或者是應用程序JAR文件的完整路徑

  -v 輸出傳給JVM的參數

jstack:jstack用於打印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息,如果是在64位機器上,需要指定選項"-J-d64",Windows的jstack使用方式只支持以下的這種方式:

如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java stack和native stack的信息,從而可以輕松地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還可以附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息, 如果現在運行的java程序呈現hung的狀態,jstack是非常有用的

jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP

1)、options: 
executable Java executable from which the core dump was produced.
(可能是產生core dump的java可執行程序)
core 將被打印信息的core dump文件
remote-hostname-or-IP 遠程debug服務的主機名或ip
server-id 唯一id,假如一台主機上多個遠程debug服務 
2)、基本參數:
-F當’jstack [-l] pid’沒有相應的時候強制打印棧信息
-l長列表. 打印關於鎖的附加信息,例如屬於java.util.concurrent的ownable synchronizers列表.
-m打印java和native c/c++框架的所有棧信息.
-h | -help打印幫助信息
pid 需要被打印配置信息的java進程id,可以用jps查詢.

 JVM 故障排除:

1、jps獲取java進程的PID

2、jstack $PID >> xx.txt 導出占用CPU比較高的進程線程棧

3、top -H -p $PID  #查看對應進程的那個線程占用CPU過高

#這里假如其中一個線程ID 為9235的CPU使用率高

4、echo  "obase=16;$PID"|bc #將線程較高的的PID轉換為16進制並在輸出,是因為步驟2是16進制的

#9235的16進制為2413

5、在第二步導出的xx.txt中查找轉換為16進制的線程PID,找到對應的線程棧

[root@node6 tomcat]# vim  9213.txt  #找到相對應的16進制2413即可

6、分析負載較高的線程棧都是什么業務操作,優化程序並處理問題。

 zabbix監控tomcat:

從Zabbix 2.0開始,軟件包中自帶了一個用於監控JMX應用的程序,稱為"Zabbix Java GateWay",非常方便使用其來監控JMX

 

六:tomcat優化:

外部調優:

操作系統:

JVM:

代理-Nginx:

 

內部調優:

禁用DNS查詢:

調整線程數:

壓縮

 

七:通過zabbix監控jmx

通過java tomcat gateway: zabbix 想知道某主機的java 具體使用情況,需要去zabbix java gateway詢問,然后java gateway通過management的API去應用程序查詢,然后應用程序需要開啟jmx的遠程連接,查詢到結果之后將結果保存並參會給zabbix server展示,因此zabbix必須要通過java gateway進行協助,zabbix 可以配置啟動多個探測進程,默認yum源沒有java gateway。

java gateway可以安裝在任何一台機器,即可以不和zabbix server安裝在一個主機上。

如果是使用yum 安裝的zabbix執行以下步驟,如果是編譯安裝的zabbix 跳過此步驟從3開始:

1、下載安裝包,與zabbix server版本一致:

下載地址:http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/  #注意這是2.2的版本哦,如果你是安裝的其他版本,比如2.0的版本,我是不會告訴你把2.2換成2.0就可以下載了的!

[root@zabbix ~]# wget http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-java-gateway-2.2.9-1.el6.x86_64.rpm
[root@zabbix ~]# wget  wget http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-2.2.9-1.el6.x86_64.rpm
[root@zabbix ~]# yum localinstall *.rpm -y

 2、修改配置文件:

[root@zabbix ~]# 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數量修改成一致的,這樣一次就可采集完成所有的jmx狀況

3、zabbix Server端配置文件:

JavaGateway=JavaGateway= 127.0.0.1  #java gateway的地址
JavaGatewayPort=10052
StartJavaPollers=5

4、修改tomcat的catalina.sh啟動腳本:

[root@Server1 apache-tomcat-6.0.37]# vim bin/catalina.sh
CATALINA_OPTS=" -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=10052 #jmx監聽的端口,需要和jmx服務端指定的一直 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.0.201" #tomcat 自己的主機地址

如果是編譯安裝的zabbix,請確保編譯的時候使用了--enabled-java選項,如果沒有開啟可以重新編譯即可

5、對編譯安裝zabbix 並啟用了JAVA參數的配置文件進行配置 並啟動java腳本:

[root@zabbix ~]# cd /usr/local/sbin/zabbix_java/
[root@zabbix zabbix_java]# grep  "^[a-Z]" settings.sh  #配置如下
LISTEN_IP="0.0.0.0"
LISTEN_PORT=10052
PID_FILE="/tmp/zabbix_java.pid"
[root@zabbix zabbix_java]# ./startup.sh  #啟動java監控

6、分別在tomcat 主機重新啟動 tomcat,在zabbix Server重啟zabbix

[root@Server1 bin]# ./catalina.sh  stop && eleep 5 && ./catalina.sh  start 
[root@zabbix zabbix]# /etc/init.d/zabbix_server restart

7、導入jmx監控模板:

 zbx_export_templates.xml

 8、在zabbix 管理界面添加對tomcat jmx的監控:

9、應用模板:

10、等幾分之后,就會有 圖了:

堆內存使用狀況:

 線程狀態:

注:在配置過程中,tomcat端只要在catalina.sh里面添加第四步的CATALINA_OPTS參數即可,不需要下載lib包,因為我看網上有的教程還要下載lib包,實際是不需要的。zabbix 端開啟java監聽的功能,在編譯安裝的zabbix里面使用--zabbix-java開啟,rpm安裝的要安裝zabbix-java-gateway包,此包要和zabbix server版本相對應。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM