一: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監控模板:
8、在zabbix 管理界面添加對tomcat jmx的監控:

9、應用模板:

10、等幾分之后,就會有 圖了:
堆內存使用狀況:

線程狀態:

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