学习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监控模板
9、在zabbix界面添加对tomcat的监控
10、应用模板
11、堆内存使用状况
12、线程状态
学习Tomcat(一)的更多相关文章
- 烂泥:学习tomcat之通过shell批量管理多个tomcat
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 公司的业务是使用tomcat做web容器,为了更有效的利用服务器的性能,我们一般部署多个 ...
- Tomcat学习—Tomcat的简介和目录以及配置文件介绍(Windows环境)
tomcat学习(8) 版权声明:本文为博主原创文章,未经博主允许不得转载. 今天学习TOMCAT,主要学习的是Tomcat的目录结构,配置文件! 1:Tomcat简介 Tomcat 服务器是一个免费 ...
- 学习Tomcat(六)之类加载器
通过前面的文章我们知道,Tomcat的请求最终都会交给用户配置的servlet实例来处理.Servlet类是配置在配置文件中的,这就需要类加载器对Servlet类进行加载.Tomcat容器自定义了类加 ...
- nginx简单学习(tomcat)
一.负载均衡的简单配置 1.下载nginx 2.tomcat*2 配置不同的端口用于正常启动,在jsp中<%= session.getId()%>可以查看jSessionId,tomcat ...
- 学习tomcat(一)----用IDEA调试tomcat源码
一直在使用tomcat,但却不怎么熟悉tomcat的"运作流程",今天就 参照参考文章进行了代码搭建(代码的github在文末),并修改了一些操作.学习下tomcat的" ...
- JavaWeb学习-Tomcat
打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:
- [Java Web学习]Tomcat启动时报war exploded: Error during artifact deployment
报错:Artifact FirstWeb:war exploded: Error during artifact deployment. See server log for details. SEV ...
- 学习Tomcat动态加载JSP的Class类
今天在修改项目一个JSP文件时,突然想到Tomat是怎么实现动态实时加载JSP编译后的class类的? 查了半天资料,看了很多文章,终于明白是怎么回事了:ClassLoader,当tomcat发现js ...
- Linux服务器学习----tomcat 服务配置实验报告(一)
一.实验目的 1. 掌握 tomcat 服务的搭建 二.实验内容 1. 搭建一台缓存 tomcat 服务器 三.实验环境1. tomcat 服务器 centos7 对应主机 ip 为 10.10.64 ...
- 学习Tomcat(一)之容器概览
Tomcat是Apache软件基金会的一个顶级项目,由Apache.Sun和其它一些公司及个人共同开发,是目前比较流行的Web服务器之一.Tomcat是一个开源的.小型的轻量级应用服务器,具有占用系统 ...
随机推荐
- win7重装系统过程关机 电脑开机黑屏 硬盘无法识别 无法使用u盘启动
问题:win7重装系统中强制重启导致硬盘无法识别,开机后无法选择使用u盘启动盘启动,电脑黑屏,将硬盘拆掉可以使用u盘启动,使用SATA转接口在win7中有反应但无法识别 无法识别原因:重装系统过程中断 ...
- linux-noshell的模式
转至:https://blog.csdn.net/ifubing/article/details/95509981 noshell 创建两个用户,一个直接创建,一切按默认的来 另一个创建时指定一下no ...
- idea教程--使用mave创建普通java项目
1.点击箭头所示的"Create New Project"选项 2.勾选图示所示的"Create From Archetype"复选框,在下面的下拉选项中我们选 ...
- Python:GUI库tkinter(一)
学习自: Python GUI 编程(Tkinter) | 菜鸟教程 TkDocs_官方文档 1.几个常用的Python GUI库 tkinter:Python的标准Tk GUI工具包的接口. wxP ...
- 01_c语言再学习_基础部分(1)
目录: 1.编译基础 2.c语言关键字 3.c语言数据类型 4.二进制/8进制/16进制 5.计算机内存数值存储方式:sizeof/原码/反码/补码 6.c语言中的字符和字符串 7.c语言中的数组和字 ...
- Python 中的深浅拷贝
Python 中的深浅拷贝 参考文献:https://blog.csdn.net/lnotime/article/details/81194633 参考文献:https://blog.csdn.net ...
- 初识python(2)
目录 引言 数据类型 字典 集合 元组 布尔值 用户交互 格式化输出 运算符 增量赋值 链式赋值 交叉赋值 解压赋值 逻辑运算符 成员运算符 身份运算符 引言 小伙伴们昨天已经讲了一点python的数 ...
- ASP.NET Core 6框架揭秘实例演示[16]:内存缓存与分布式缓存的使用
.NET提供了两个独立的缓存框架,一个是针对本地内存的缓存,另一个是针对分布式存储的缓存.前者可以在不经过序列化的情况下直接将对象存储在应用程序进程的内存中,后者则需要将对象序列化成字节数组并存储到一 ...
- LabVIEW,控件快捷菜单,温度转换
目前正在自学LabVIEW,深感困难重重,我将偶尔发表一些自己的收获,自认为算是干货了, 搜到这篇随笔的朋友们或多或少遇到了些许困难,希望这能帮助到你们. 内容:练习使用LabVIEW中的控件快捷菜单 ...
- jarvisoj_level3
自己的第一篇博客 *其实很早就想写博客了但是自己安全学的比较晚而且也很菜,现在虽然还是比较菜但是也是有一些心得的 *第一个问题什么是ctf,根据某度来说:CTF(Capture The Flag)中文 ...