第二十二章:Tomcat

2019-11-19  本文已影响0人  chenkang

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 &quot;%r&quot; %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 &quot;%r&quot; %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 &quot;%r&quot; %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"

tomcat优化参考

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

上一篇下一篇

猜你喜欢

热点阅读