美文网首页
第二十二章:Tomcat

第二十二章:Tomcat

作者: chenkang | 来源:发表于2019-11-19 20:20 被阅读0次

    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

    相关文章

      网友评论

          本文标题:第二十二章:Tomcat

          本文链接:https://www.haomeiwen.com/subject/snvgictx.html