第二十二章:Tomcat
1.JVM介绍
JVM是Java Virtual Machine(Java虚拟机)的缩写
Java虚拟机本质是就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。Java语言的可移植性正是建立在Java虚拟机的基础上。任何平台只要装有针对于该平台的Java虚拟机,字节码文件(.class)就可以在该平台上运行。这就是“一次编译,多次运行”。
2.Tomcat介绍
1.什么是Tomcat
Tomcat和我们此前学习的 Nginx 类似,也是一个Web服务器。
2.Tomcat与Nginx有什么区别?
Nginx仅支持静态资源,而Tomcat则支持Java开发的 jsp 动态资源和静态资源。
Nginx适合做前端负载均衡,而Tomcat适合做后端应用服务处理。
通常情况下,企业会使用 Nginx+tomcat 结合使用,由Nginx处理静态资源,Tomcat处理动态资源。
3.Tomcat快速安装
方法1:
rpm -ivh jdk-8u102-linux-x64.rpm -->使用rpm包去安装jdk不需要添加环境变量
mkdir /app
tar xf apache-tomcat-8.0.27.tar.gz -C /app
/app/apache-tomcat-8.0.27/bin/startup.sh
方法2:
mkdir /app/
tar xf jdk-8u60-linux-x64.tar.gz -C /app/
ln -s /app/jdk1.8.0_60 /app/jdk
sed -i.ori '$a export JAVA_HOME=/app/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
source /etc/profile
tar xf apache-tomcat-8.0.27.tar.gz -C /app
/app/apache-tomcat-8.0.27/bin/startup.sh
tomcat无法启动的几个原因
1.替换配置文件: pkill java 然后在启动
2.配置文件写错
3.虚拟主机是添加,不要修改
4.context如果写了,一定要有对应的目录,不然整体就报错
/soft/tomcat/logs/catalina.out
作者:UncleZ_strive链接:https://www.jianshu.com/p/2798f56eded0来源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
4.Tomcat启动慢解决方案
没优化之前启动时间
[root@tomcat logs]# grep 'Server startup' catalina.out
03-Aug-2019 03:15:18.225 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 591050 ms
优化之后启动时间
[root@tomcat logs]# grep 'Server startup' catalina.out
03-Aug-2019 03:15:18.225 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 591050 ms
03-Aug-2019 03:22:14.112 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 1326 ms
优化方法:
vi /usr/java/jdk1.8.0_102/jre/lib/security/java.security
securerandom.source=file:/dev/urandom
5.tomcat目录结构介绍
[root@tomcat apache-tomcat-8.0.27]# ll
total 92
drwxr-xr-x 2 root root 4096 Aug 3 03:05 bin #主要包含启动、关闭tomcat脚本和脚本依赖文件
drwxr-xr-x 3 root root 198 Aug 3 03:05 conf #tomcat配置文件目录
drwxr-xr-x 2 root root 4096 Aug 3 03:05 lib #tomcat运行需要加载的jar包
-rw-r--r-- 1 root root 57011 Sep 28 2015 LICENSE #license文件,不重要
drwxr-xr-x 2 root root 197 Aug 3 03:15 logs #在运行过程中产生的日志文件
-rw-r--r-- 1 root root 1444 Sep 28 2015 NOTICE #不重要
-rw-r--r-- 1 root root 6741 Sep 28 2015 RELEASE-NOTES #版本特性,不重要
-rw-r--r-- 1 root root 16204 Sep 28 2015 RUNNING.txt #帮助文件,不重要
drwxr-xr-x 2 root root 30 Aug 3 03:05 temp #存放临时文件
drwxr-xr-x 7 root root 81 Sep 28 2015 webapps #站点目录
drwxr-xr-x 3 root root 22 Aug 3 03:05 work #tomcat运行时产生的缓存文件
6.tomcat配置文件
核心配置文件:
tomcat核心配置文件.png
一个tomcat实例一个server
一个server中包含多个Connector,Connector的主要功能是接受、响应用户请求。
service的作用是:将connector关联至engine(catalina引擎)
一个host就是一个站点,类似于nginx的多站点
context类似于nginx中location的概念
Tomcat中的Connector配置讲解
Tomcat配置文件解读
7.Tomcat部署zrlog
1.Tomcat部署博客项目zrlog
域名: zrlog.hai.com:8080
站点目录: /code/zrlog
1.配置server.xml文件 ,新增zrlog站点在 engline
[root@web01 ~]# vim /soft/tomcat/conf/server.xml
<!--zrlog站点-->
<Host name="zrlog.hai.com" appBase="/code/zrlog"
unpackWARs="true" autoDeploy="true">
<Va0lve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="zrlog_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
2.创建站点目录,上传zrlog的war包
[root@web01 ~]# mkdir /code/zrlog
[root@web01 ~]# cd /code/zrlog/
[root@web01 zrlog]# rz ROOT.war
3.重启Tomcat服务
[root@web01 zrlog]# /soft/tomcat/bin/shutdown.sh && /soft/tomcat/bin/startup.sh && tail -f /soft/tomcat/logs/catalina.out
4.域名劫持
5.在172.16.1.51的数据库上,创建一个zrlog的库,配置授权访问用户
[root@db01 ~]# mysql -uroot -poldxu.com
MariaDB [(none)]> create database zrlog charset utf8;
<---此前配置过all用户,可以复用
MariaDB [(none)]> grant all privileges on *.* to 'all'@'%' identified by 'oldboy.com';
2.如何开启 Server Status Host Manager页面
1.配置conf/tomcat-users.xml
<role rolename="manager-gui"/>
<user username="tomcat" password="123456" roles="manager-gui"/>
2.如果访问还是403,是因为tomcat默认仅运行本地访问该管理页面,需要允许同网段主机访问
[root@web01 ~]# ll /soft/tomcat/webapps/manager/
[root@web01 ~]# ll /soft/tomcat/webapps/host-manager/
[root@es-node1 tomcat]# vim 项目目录下/META-INF/context.xml
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
#修改为
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.0\.0\.\d+" />
8.配置tomcat basic认证(可在nginx上进行配置)
1.在tomcat-users.xml文件中进行角色与用户的绑定
#vim /app/tomcat/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="test100"/> -->添加角色
<user username="tomcat" password="1" roles="manager-gui,test100"/> -->角色绑定用户去认证,需要使用用户进行basic认证--username="tomcat" password="1"
2.在站点目录下的WEB-INF的web.xml文件中添加如下内容
# vim /app/tomcat/webapps/ROOT/WEB-INF/web.xml
<web-app>
......
<security-constraint>
<web-resource-collection>
<web-resource-name>test</web-resource-name>
<url-pattern>/*</url-pattern> -->想要配置认证的目录
</web-resource-collection>
<auth-constraint>
<role-name>test100</role-name> -->认证的角色,需要绑定用户,进行认证
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Default</realm-name>
</login-config>
</web-app>
9.Nginx+Tomcat集群架构实战
1.lb服务器nginx配置文件
upstream test {
server 172.16.1.7;
server 172.16.1.8;
}
server {
listen 80;
server_name blog.oldqiang.com;
location / {
proxy_pass http://test; #nginx七层负载到后端的nginx服务器
proxy_set_header Host $host;
}
}
2.web服务器nginx配置
server {
listen 80;
server_name blog.oldqiang.com;
location / {
proxy_pass http://127.0.0.1:8080; #将负载转发过来的动态处理请求交给后端的tomcat处理
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
}
}
10.Nginx+Tomcat集群实现全栈Https
1.lb配置文件(在负载均衡上进行ssl证书的配置,进行加密与解密)
upstream test {
server 172.16.1.7;
server 172.16.1.8;
}
server {
listen 80;
server_name blog.oldqiang.com;
location / {
rewrite ^(.*) https://$server_name$1 redirect;
}
}
server {
listen 443 ssl;
server_name blog.oldqiang.com;
client_max_body_size 100m;
ssl_certificate /opt/nginx/1_blog.oldqiang.com_bundle.crt;
ssl_certificate_key /opt/nginx/2_blog.oldqiang.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://test;
proxy_set_header Host $host;
}
}
11.Nginx+tomcat动静分离
server {
listen 80;
server_name blog.oldqiang.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
}
location ~* \.(gif|jpg|jpeg)$ {
root /app/tomcat/webapps/ROOT ; #静态请求直接用nginx处理
}
}
12.tomcat配置多站点
1.在server.xml配置文件中添加一个Host
# vim /app/tomcat/conf/server.xml
<Host name="www.mysun.com" appBase="webapps" -->配置域名和根目录,重启tomcat会生成aooBase目录
unpackWARs="true" autoDeploy="true"> -->开启自动解压,自动部署
#日志的文件的配置
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt" -->日志名称
pattern="%h %l %u %t "%r" %s %b" /> -->日志的格式吧~~
</Host>
<Host name="www.myqu.com" appBase="webapps2"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="tomcat_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
13.Tomcat监控
zabbix监控tomcat
1.在tomcat实例的配置文件中配置让自己能远程被监控(重启tomcat之后会启动一个端口12345)
vim /application/apache-tomcat-8.0.27/bin/catalina.sh
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=10.0.0.72
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"
1:安装zabbix-java-gateway,10052(在tomcat上安装zabbix-java-gateway)
Zabbix本身不支持直接监控Java,在zabbix 1.8以前,只能使用Zapcat来做代理监控,而且要修改源代码,非常麻烦。所有后来为了解决这个监控问题,Zabbix和Java双方应运生成了各自的代理监控程序:zabbix 2.0以后添加了服务进程zabbix-java-gateway;Java有了JMX,全称是Java Management Extensions,即Java管理扩展。
2:配置重启zabbix-java-gateway
START_POLLERS=5 #预启动的轮询器,默认5-->如tomcat的实例多,可以根据需求去增加
3:配置重启zabbix-server
vim /etc/zabbix/zabbix_server.conf (增加如下参数)
JavaGateway=127.0.0.1 -->zabbix-java-gateway组件安装的IP地址
JavaGatewayPort=10052 -->zabbix-java-gateway组件的端口
StartJavaPollers=5 -->Java 轮询器
4:zabbix-web添加jmx监控
添加tomcat实例主机,添加模块Template App Generic Java JMX
可根据需求来删除不支持的监控项
5.自定义监控项
(借助jdk-windows组件来获取tomcat数据然后再zabbix中添加相应想要的监控项)
可以在windows上安装jdk,连接上tomcat实例的远程端口12345
image.png
image.png
根据这里的取值设置自定义监控项
随便找一个模板监控克隆
image.png
14.Tomcat性能优化
1.关于tomcat的内存回收gc
年轻代: 年轻代内存满了,就会触发年轻代 内存回收,局部,存活下的对象存到年老代
年老代: 年老代内存满了,就会触发全局 内存回收,全部
jvm 内存垃圾回收,是不可避免!
垃圾回收的次数尽可能少:增加内存的容量
垃圾回收的时间尽可能短:减少内存的容量
年轻代最小内存==年轻代最大内存
年老代最小内存==年老代最大内存
堆内存==1年轻代64M+3年老代192M 256M
非堆内存== 持久代
JAVA_OPTS="$JAVA_OPTS -server -Xms3G -Xmx3G -Xss256k -XX:PermSize=128m -XX:MaxPermSize=128m -XX:+UseParallelOldGC -XX:NewSize=1G -XX:MaxNewSize=1G"
xms:最小堆内存
Xmx:最大堆内存
-Xss 线程栈的大小
-XX:NewSize 年轻代的最小内存
-XX:MaxNewSize 年轻代的最大内存
-XX:PermSize: 持久代最小内存
-XX:MaxPermSize: 持久代最大内存
详细优化参数:
JAVA_OPTS="$JAVA_OPTS -server -Xms256m -Xmx256m -Xss256k -XX:+UseParallelOldGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heap_dump -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/tmp/heap_trace.txt -XX:NewSize=128m -XX:MaxNewSize=128m"
2.关于java的三个代
年轻代:
所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生
命周期短的对象。年轻代分三个区。一个Eden区,两个 Survivor区(一般而言)。大部分对象在
Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这
个 Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了
的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区
(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时
存在从Eden复制过来对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第
一个Survivor去过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,
Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减
少被放到年老代的可能。
年老代:
在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认
为年老代中存放的都是一些生命周期较长的对象。
持久代:
用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应
用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持
久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=进行设置。
持久代补充:持久带也称为方法区
方法区:方法区存储每一个java类的结构信息:比如运行时常量池,字段和方法数据,构造函数和普通方法的字节码内容以及类、实例、接口初始化时需要使用到的特殊方法等数据。
方法区也被称为永久代,如果不显示指定的话,GC回收的目标仅针对方法区的常量池和类型卸载
JDK8中已经把持久代(PermGen Space) 干掉了,取而代之的元空间(Metaspace)。Metaspace占用的是本地内存,不再占用虚拟机内存。
————————————————
版权声明:本文为CSDN博主「孟令杰」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jenny8080/article/details/79019538