Tomcat 服务安装 是一个java虚拟机 # yum install jdk-8u231-linux-x64.rpm \\ rpm包安装 需先下载到当前目录 # rpm -ivh jdk-8u231-linux-x64.rpm \\ 或者使用rpm-ivh安装 # rpm -ql jdk1.8 /usr/java/jdk1.8.0_231-amd64/ \\ 安装路径 /usr/java/latest \\ 链接到 安装路径 表示最新版 /usr/java/default \\ 链接到 latest # vim /etc/profile.d/java.sh \\ 把java的运行环径境输出给系统 能找到 需要配置环境变量 新建 export JAVA_HOME=/usr/java/latest \\ 定义变量指明安装路径 对于java而已所有内容都放在一个JAVA_HOME变量 \\ 很多应用程序都会去找这个变量 把这个变量对应的值当做java的查找路径 export PATH=$JAVA_HOME/bin:$PATH \\ 把java自己bin路径 定义成变量PATH # . /etc/profile.d/java.sh \\ 重读此文件 # java -version \\ 可以看到版本等信息 如果看到与之版本相同说明JDK环境配置成功 默认会有1.8其他版本的安装 # tar zxf apache-tomcat-8.5.50.tar.gz -C /usr/local \\ 二进制包安装 # cd /usr/local # mv apache-tomcat-8.5.50/ tomcat # vim /etc/profile.d/tomcat.sh \\ 创建环境变量 export CATALINA_HOME=/usr/local/tomcat \\ tomcat自己的运行需要一个CATALINA_BASE的环境变量来指明自己位于什么路径之下 export PATH=$CATALINA_HOME/bin:$PATH \\ 并且也要输入环境变量到搜索路径中去 # . /etc/profile.d/tomcat.sh \\ 重读此脚本 # version.sh \\ 可以直接运行 /usr/local/tomcat/bin/ 下的脚本 可看到tomcat版本号 # catalina.sh version \\ 亦可以使用catalina调用 当做传递个参数即可 # configtest.sh \\ 检查有没有语法错误的 # catalina.sh --help \\ 查询catalina怎么用 run 在当前窗口中直接运行 start 在另外的窗口中运行 stop 停止服务 stop n 等待多长时间停止 默认5秒 stop -force 强制停止服务 configtest 测试文件的语法 version 显示当前tomcat的版本号 start -security 使用安全管理器启动 # catalina.sh start \\ 启动tomcat http://192.168.10.15/8080 可以访问tomcat页面 同时监听8009 # ss -tnlp \\ 监听8080端口 会发现是java监听8080端口 而不是tomcat # vim /usr/local/tomcat/conf/server.xml \\ 主配置文件 ① 在默认路径添加一个测试应用程序 # cd /usr/local/tomcat/webapps # mkdir -pv teo/{lib,classes,EB-INF,META-INF} \\ 如果自己没有创建web.xml context.lxml 会去conf/目录下继承默认配置 # vim teo/index.jsp \\ 创建jsp测试页 浏览器访问 http://192.168.10.15:8080/teo/index.jsp <%@ page language="java" %> <%@ page import="java.util.*" %> JSP Test Page <% out.println("Hello,World."); %> # tree /usr/local/tomcat \\ 应用程序运行时 会到 work/的转为java文件最后编译成.class文件运行 # vim work/Catalina/localhost/teo/org/apache/jsp/index_jsp.java \\ 会把jsp文件转换为java代码 ② 配置不同的路径 定义一个虚拟主机Host # mkdir -pv /data/www/webapps # cd /data/www/webapps # mkdir -pv teo15/{lib,classes,EB-INF,META-INF} # mkdir -pv janice/{lib,classes,EB-INF,META-INF} # vim teo/index.jsp \\ 创建第一个主页面 访问路径 192.168.10.15:8080 <%@ page language="java" %> <%@ page import="java.util.*" %> JSP Test Page <% out.println("Hello,World."); %> # vim janice/index.jsp \\ 创建第二个jsp页面 可以到网上复制jsp代码测试 访问页面192.168.10.15:8080/janice # vim /usr/local/tomcat/conf/server.xml \\ 主配置文件 \\ 详见注解04 # catalina.sh stop # catalina.sh start # ss -tnlp \\ 8080被java监控 同时监听8009 ③ tomcat自带的应用程序 使用web应用程序管理及web虚拟主机管理 \\ 开启此功能需要修改配置文件 # vim /usr/local/tomcat/webapps/manager/META-INF/context.xml # vim /usr/local/tomcat/webapps/host-manager/META-INF/context.xml # vim /usr/local/tomcat/conf/tomcat-users.xml \\ 配置上用户名和密码 \\ 开启 Manager App 应用程序管理 \\ 开启 Host Manager 虚拟主机管理 # catalina.sh stop # catalina.sh start 访问 http://192.168.10.15:8080 --> Manager App Tomcat Web应用程序管理者 --> Host Manager 虚拟主机管理 ④ 常用 组合 ❶ LNMT: 使用nginx 反向代理到tomcat 可实现动静分离 # yum install epel-release # yum install nginx # vim /etc/nginx/nginx.conf \\ 反向代理给tomcat 可实现动静分离 java程序有的是jsp结尾有的是do结尾 location ~* \.(jsp|do)$ { \\ ~模式匹配 *不区分字符大小写 \.转意. jsp或者do结尾 $行尾牟定 proxy_pass http://www.teo15.com:8080; \\ 动态内容 反向代理到teo15 以teo15访问 } # systemctl restart nginx ❷ LAMT: 使用httpd 反向代理到tomcat 动静分离一般不使用httpd # yum install httpd # httpd -M \\ 显示所有模块 proxy_module \\ 反向代理 主模块 proxy_module_http \\ 子模块1 基于http协议 反向代理 使用此模块 proxy_module_ajp \\ 子模块2 基于ajp协议 反向代理 使用此模块 # vim /etc/httpd/conf/httpd.conf \\ 编辑httpd主配置文件 # DocumentRoot "/var/www/html" \\ 注释掉 配置反向代理有可能会出错 ServerName www.teo12.com \\ 随便起个名字 否则语法会警告 # vim /etc/httpd/conf.d/www.teo12.com \\ 自己创建虚拟主机 实现反向代理功能 \\ 虚拟主机 监听在所有端口的80端口 ServerName www.teo12.com \\ 虚拟主机名字 ProxyVia On \\ 加首部 说明由此主机反向代理过去的 可以不添加为Off ProxyRequests Off \\ 同时支持正想代理 使用反向 必须要显示关闭正向代理 ProxyPreserveHost On \\ 基于主机名的虚拟主机 把主机名会带到后端 \\ 代理模块 允许哪些用户使用 Require all granted \\ 允许所有人访问 ProxyPass /status ! \\ 可以使status页面不代理到后端 由本机httpd响应 也可以去掉 ProxyPass / http://192.168.10.15:8080/ \\ 反向代理 /根的所有请求 到 此代理为基于http协议 # ProxyPass / ajp://192.168.10.15:8009/ \\ 此代理为基于ajp协议 如果用此 注释掉上一条 ProxyPassReverse / http://192.168.10.15:8080/ \\ 加不加无所谓 \\ 定义location 根 允许哪些人访问 Require all granted \\ 允许所有人访问 # httpd -t \\ 检查语法错误 # systemctl restart httpd # ss -tnl ❸ LNAMT: 使用nginx做负载均衡 到后端http接收请求在反向代理到同一主机的tomcat 此用法比较多 ⑤ Tomcat主配置文件详解 \\ 待补充 # vim /usr/local/tomcat/conf/server.xml \\ 主配置文件 ⑥ Tomcat的主配置文件结构 \\ 整个tomcat容器 主要任务 提供一个接口管理接口 可以启动 停止等 可以包含多个service \\ 可以有多个connector连接器 只能有一个engine \\ 作用是从客户端接收请求 提供端口 被客户端访问tomcat 接收到的请求会给engine \\ 从连接器接收来请求 并处理 \\ 可以有多个 虚拟主机 \\ 可以有多个 应用程序 \\ 可以有多个 应用程序 ❶ Connector 连接器 HTTP连接器 SSL连接器 AJP 1.3连接器 一共三种协议连接器 address 指定连接器监听的地址,默认为所有地址 即0.0.0.0 maxThreads 支持的最大并发连接数 默认为 200 port 监听的端口 默认为0 protocol 连接器使用的协议默认为HTTP/1.1 定义AJP协议时通常为AJP/1.3 redirectPort 如果某连接器支持的协议时HTTP 当接收客户端发来的HTTPS请求时 则转发至此属性定义的端口 connectionTimeout 连接超时时间 单位毫秒 默认60000 即1秒 enableLookups 反解ip地址 为主机名 默认开启 建议关闭 enableLookups="false" acceptCount 等待队列的最大长度 minSpareThreads 最小空闲线程 maxSpareThreads 最大空闲线程 ❷ Engine 引擎 defaultHost 默认引擎 name 用于日志和错误信息记录时区别不同的引擎 ❸ Host 位于Engine容器中 appBase 此Host的webapps目录 存放web应用程序的目录或归档后的WAR文件的目录路径 autoDeploy 注: ❶ tomcat官网 http://tomcat.apache.org 需登录下载 ❷ JDK官网 https://www.oracle.com/technetwork/java/javase/overview/index.html a09669461688@gmail.com Teo@1234 ❸ host 各个参数详解 host 虚拟主机 如果使用相对路径 是相对tomcat安装目录 name 属性指定虚拟主机的主机名 一个Engine中有且仅有一个Host组件的name属性与Engine组件的defaultHost属性相匹配 unpackWARs 是否将代表Web应用的WAR文件解压 如为true 解压后的文件结构运行该Web应用 如为false 直接使用WAR文件运行Web应用 appBase 属性指定Web应用所在的目录,默认值是webapps,这是一个相对路径,代表Tomcat根目录下webapps文件夹 这个里给出的绝对路径 utoDeploy="false" 关闭自动部署 ❹ Context 各个参数详解 \\ 新增host主机 appBase设置网站根目录 注解03 \\ 访问上面的根目录 自动会映射到docBase路径上 ""什么都没有代表与上路径相同 path给定的路径不能有以/结尾 \\ /janice 代表网站根目录appBase下的janice目录为访问路径 docBase为相对于appBase的路径为实际程序路径 Context类似apache中的路径别名 如果使用相对路径 是相对host中的appBase而言 path=""什么没有代表访问的根路径 docBase路径 reloadable属性指示tomcat是否在运行时监控在WEB-INF/classes和WEB-INF/lib目录下class文件的改动. 如果值为true,那么当class文件改动时,会触发Web应用的重新加载.在开发环境下,reloadable设置为true便于调试, 但是在生产环境中设置为true会给服务器带来性能压力,因此reloadable参数的默认值为false. ❺ 各个配置文件说明 server.xml 主配置文件 contest.xml 每个webapp都可以有专用的配置文件,这些配置文件通常位于webapp应用程序目录下的web.inf目录中, 用于定义会话管理器/JDBC等 conf/context.xml是为各webapp提供默认配置 web.xml 每个webapp部署之后才能被访问 此文件则用于为所有的webapp提供默认部署相关的配置 tomcat-users.xml 用户认证的账号和密码配置文件 catalina.policy 当使用-security选项启动tomcat实例时会读取此配置文件来实现其安全运行策略 catalina.properties Java属性的定义文件用于设定类加载器路径等 以及一些JVM性能相关的调优参数 logging.properties 日志相关的配置信息 ❻ tomcat应用程序目录用途 # cd /usr/local/tomcat/webapps \\ tomcat应用程序 # yum install tree \\ 可以查看某一目录的树状结构 # tree /usr/local/tomcat/webapps/manager \\ webapp 组织结构 包含有servlet代码文件 JSP页面文件 类文件部署描述符文件等 WEB-INF: 当前webapp的私有资源目录通常存放当前webapp自用的web.xml; META-INF: 当前webapp的私有资源目录通常存放当前webapp自用的context.xml; classes: 此webapp的私有类 lib: 此webapp的私有类 被打包为jar格式类 index.jsp: webapp的主页 .war webapp war文件 war归档 .jar EJB的类 .rar 资源适配器 .ear 企业级应用程序 实例 session cluster 会话 集群 前端Nginx/Apache反代 + 负载均衡 到后端两台Tomcat服务器 + Memcached session id 保持 1 两台Tomcat服务器配置 # tar zxf apache-tomcat-8.5.50.tar.gz -C /usr/local \\ 只安装了tomcat jdk使用了系统自带的 # cd /usr/local/ # mv apache-tomcat-8.5.50/ tomcat # vim /etc/profile.d/tomcat.sh export CATALINA_HOME=/usr/local/tomcat export PATH=$CATALINA_HOME/bin:$PATH # catalina.sh version # vim /etc/profile.d/tomcat.sh export CATALINA_HOME=/usr/local/tomcat export PATH=$CATALINA_HOME/bin:$PATH # vim /usr/local/tomcat/conf/server.xml \\ 修改或添加 以下代码 ↓ 修改默认主机 jvmRoute 唯一标识 \\ 前端是httpd服务器中可以用到 第二台TomecatB \\ 添加Host 主机 # catalina.sh configtest \\ 检查语法 # mkdir -p /data/logs # mkdir -pv /data/webapps/ROOT/{lib,classes,META-INF,WEB-INF} # vim /data/webapps/ROOT/index.jsp \\ 新建 仅为测试页代码 <%@ page language="java" %> TomcatA

TomcatA.teo10.com

<% session.setAttribute("teo10.com","teo10.com"); %>
Session ID<%= session.getId() %>
Created on <%= session.getCreationTime() %>
# catalina.sh start \\ 启动 # ss -tnl \\ 8080 8009被监听 访问teo13.com.8080 需修改hosts文件 2.1 ① 使用apache反向代理到后端tomcat服务器 使用负载均衡 \\ 实现为第一种方法基于http协议 # yum install httpd # httpd -M \\ 可以看到 所有模块 proxy_balancer_module (shared) \\ 此模块能实现 负载均衡功能 # vim /etc/httpd/conf/httpd.conf \\ 主配置文件 #DocumentRoot "/var/www/html" \\ 注释掉 中心主机 选项 # cd /etc/httpd/conf.d # vim vhosts.conf \\ 自定义虚拟主机 增加配置文件 Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED \\ session绑定需加 BalancerMember http://192.168.10.12:8080 loadfactor=10 route=TomcatA \\ 后端TomcatA特有的标识 BalancerMember http://192.168.10.13:8080 loadfactor=10 route=TomcatB ProxySet stickysession=ROUTEID \\ 基于session绑定需要加 ServerName www.teo10.com ProxyVia On ProxyRequests Off ProxyPreserveHost On Require all granted ProxyPass / balancer://lbcluster1/ ProxyPassReverse / balancer://lbcluster1/ Require all granted # httpd -t # systemctl restart httpd # ss -tnl \\ http://192.168.10.10/index.jsp 访问测试 2.1 ② 使用apache反向代理到后端tomcat服务器 使用负载均衡 \\ 第二种方法 使用agp协议 需修改的代码如下 其余与httpd均相同 BalancerMember agp://192.168.10.12:8009 loadfactor=10 route=TomcatA BalancerMember agp://192.168.10.13:8009 loadfactor=10 route=TomcatB 2.2 使用nginx反向代理到后端tomcat服务器 使用负载均衡 # yum install nginx # vim /etc/nginx/nginx.conf upstream tomserver{ ip_hash; server teo12.com:8080; server teo13.com:8080; } location ~* \.(jsp|do)$ { \\ 只把动态页面反向代理到后端tomcat服务器 proxy_pass http://tomserver; } # systemctl restart nginx # ss -tnl \\ http://192.168.10.10/index.jsp 注: 使用Apache反向代理到后端Tomcat 可以有以下三种方案 ❶ apache mod_proxy mod_proxy_http mod_proxy_balancer \\ 可以提供负载均衡功能 tomcat http connector \\ http连接器 ❷ apache mod_proxy mod_proxy_ajp mod_proxy_balancer \\ 可以提供负载均衡功能 tomcat ajp connector \\ 前两种 只做反代 负载均衡需借助其他模块 ❸ apache \\ 第三种很少使用 没做实验 在第38天视频01最后十分钟和视频02 mod_jk \\ 又能做反代 又能负载均衡 tomcat ajp connector 3 做 保持会话信息 两台Tomcat服务器配置 \\ 基于http协议 如果基于agp同上修改协议及端口即可 # vim server.xml \\ 添加到Host里即可 详见注解 ❷ # cp /usr/local/tomcat/conf/web.xml /data/webapps/ROOT/WEB-INF/ \\ 复制此配置文件到此程序下只有此程序生效 直接改全局生效 # vim /data/webapps/ROOT/WEB-INF/web.xml \\ 为需要使用session cluster的webaaps开启 session distribution功能 \\ 倒数第二行添加即可 # catalina.sh stop # catalina.sh configtest \\ 检测语法 # catalina.sh start # ss -tnl \\ http://192.168.10.10 刷新测试 可以保持会话 # tail /usr/local/tomcat/logs/catalina.out \\ 两点同时启动 可以查看日志此节点有另外一个节点的ip 注 ❶ 此为tomcat8.5的cluster文档 各个版本的配置不一样 需要注意 其他版本参考其他文档 帮助文档地址 https://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html ❷ 详解 4 Tomcat节点 把会话保存在memcached上 已实现session server功能 \\ 基于1 2实验 memcached 缓存 session id 实现 Tomcat session 保持 ❶ 基于以上实验 一台 Nginx/Apache 做负载均衡 反代到后端 两台Apache服务器的80端口在反代到8080端口的Tomcat服务器 暂时配置两台Memcached服务器与两台后端服务器为同一服务器 ❷ 两台Tomcat服务器配置 关键配置 到此网站下载五个包 https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration 代码托管站点 https://repo1.maven.org/maven2/de/javakaffee/msm/ https://repo1.maven.org/maven2/net/spy/spymemcached/ https://repo1.maven.org/maven2/javolution/javolution/5.5.1/ memcached-session-manager-2.3.2.jar memcached-session-manager-tc8-2.3.2.jar msm-javolution-serializer-2.1.1.jar spymemcached-2.12.3.jar javolution-5.5.1.jar # cd /usr/local/tomcat/lib # rz \\ 五个包 导入到此目录下 对于编译安装的Tomcat # vim /usr/local/tomcat/conf/server.xml # catalina.sh configtest # catalina.sh start \\ 访问 192.168.10.10 测试 ❸ 两台Memcached 服务器配置 \\ 仅仅为此实验使用 关于Memcached详细资料参见 相关章节 # yum install memcached # systemctl restart memcached # netstat -tunlp \\ tcp udp 的11211端口都被监听 # memcached-tool 127.0.0.1 \\ 显示 工作状态信息 配合 访问 192.168.10.10 测试 JVM java虚拟机 ❶ 性能监控工具 ❶ 垃圾回收器: 新生代回收: Minor GC 老年代回收: Major GC (FULL GC) ❷ 堆内存空间的调整参数 -Xmx: 新生代和老年代总共可用的最大空间 -Xms: 二者初始空间 -XX:NewSize 新生代初始空间 -XX:MaxNewSize 新生代最大空间 -XX:MaxPermSize 持久代最大空间 -XX:PermSize 持久代初始空间 ❸ 调整tomcat虚拟机 java虚拟机 内存大小 CATALINA_OPTS 仅对启动运行tomcat实例的java虚拟机有效 JAVA_OPTS 对本机上的所有java虚拟机有效 # export CATALINA_OPTS="-Xmx256m" \\ 待测试 ❹ 问题 OutOfMemoryError 内存不足 内存泄漏 线程死锁 锁竞争(lock Contention) Java消耗过多的CPU ❺ 工具 jps (java virtual machine process status tool) jps主要监控jvm进程状态信息 # yum install java-1.8.0-openjdk-devel \\ 此包有jps命令 # jps \\ 显示当前主机 运行的所有java进程 101746 Bootstrap 36086 Jps # jps 101746 \\ 查看某一进程 # jps -m -l -v \\ 显示启动这一java虚拟机的类是什么 或 程序是什么 -m 输出传入main方法的函数 -l 类型 程序名 显示main类或jar的完全限定名称 -v 显示启动此java虚拟机传递的参数 jstack 查看某个java进程内的线程堆栈信息 # jstack 101746 \\ 可以java进程 内存分配等情况 用于发现问题 可给程序员排错 -l 输出 完整的锁信息 \\ 到底是哪段代码产生了锁 导致了问题 做程序调优 -m 混合模式 即会输出java堆栈及C/C++堆栈信息 jmap # jmap 101746 \\ 查看堆 内存 哪个堆占用哪段内存 -heap 详细堆内存空间使用状态信息 -histo:live 详细显示出每一个java堆的内存对象 jhat # jhat 101746 \\ 堆内存 分析工具 jstat # jstat -options \\ 查看有哪些选项 # jstat -gc 101746 \\ 查看垃圾回收器的相关内容 内存相关统计信息 S0C S1C S0U S1U C 表示容量 U 表示已用量 S 表示 存活区 EC EU eden伊甸园 区域的容量和已用量 OC OU O老年代区 PC PU P持久代区 YGC YGT Y新生代的GC次数和耗时 FGC FGCT 老年代的GC次数和耗时 GCT GC总耗时 GC 主要做了清理对象,整理内存的工作。Java堆分为新生代和老年代,采用了不同的回收方式。 jconsole # jconsole \\ 图形化工具 需要windos安装相应程序 查看内存相关参数 网络工具 tcpdump 网络嗅探器 嗅探网络报文 nc tcp和udp连接和监听的工具 可以扮演浏览器 扮演web服务器 扮演网络文件传输工具 功能强大 黑客工具 网络中的瑞士军刀 nmap 端口扫描器 探测 ncat 由nmap包提供 山寨版nc 混杂模式 promisc 无论它们传输的报文目标mac是不是本机都给它拿过来 ① tcpdump -i 接口 -w 保存至文件中 -A 仅ASCII码格式显示 -X 仅十六进制和ASCII码格式显示 -XX 仅显示链路层的首部信息 -v 显示详细信息 -vv 更详细信息 -r 读取文件 进行分析 配合-w使用 # tcpdump -i ens33 \\ 在ens33上的所有通信 # tcpdump -i ens33 tcp dst port 80 \\ tcp协议目标端口是80 # tcpdump -i ens33 tcp port 80 \\ 源端口或目标端口是80 # tcpdump -i ens33 host 192.168.10.13 \\ 抓取和主机192.168.10.1之间的通信 # tcpdump -i ens33 host 192.168.10.10 and host 192.168.10.13 \\ 抓取两个主机之间的通信 使用and # tcpdump -i ens33 host 192.168.10.10 or host 192.168.10.13 \\ 抓取两个主机的通信 使用or # tcpdump -i ens33 host 192.168.10.12 and \(192.168.10.10 or 192.168.10.13\) \\ 抓取 10.12 和 这两个主机任何一个通信的包 host 主机 dst 目标 port 端口 tcp tcp协议 src 源 src and dst 目标和源 ② tshark 抓包工具 ③ wireshark 最好用的网络抓包工具 非常强大 # yum install wireshark # yum install wireshark-gnome \\ 图形化工具 ④ nc/ncat # yum install nmap-ncat ❶ 传输文件 # nc -l 2233 > /data/soft/a.png \\ 服务器 接收文件 临时端监听2233端口 等待a.png文件的传输 只执行一次传输 # nc 192.168.10.12 2233 < /data/vpn.png \\ 客户端 传递文件 传递给服务器端 vpn.png 文件 端口随便 无需加密解密 # nc -l 2233 < /data/soft/a.png \\ 服务器 传递文件 最好使用 上一种 # nc 192.168.10.12 2233 > /data/b.png \\ 客户端 接收文件 ❷ 传输文件夹 # nc -l 2233 | tar zxvf - \\ 服务端 接收文件 在解打包 管道后面必须是 - 不能是其他文件名 # tar cfz - * | nc 192.168.10.12 2233 \\ 客户端 发送文件 打包当前文件夹所有文件 发送 ❸ nc扫描器 有问题 需要重新找资料 ❹ 聊天 # nc -l 2233 \\ 服务器端 监听端口 # nc 192.168.10.12 2233 \\ 客户端 连接端口 打字即可 -s 源ip ⑤ # ps -ef | grep java