TomCat 基础学习

Tomcat

1.JVM介绍

JVM是Java Virtual Machine(Java虚拟机)的缩写

Java虚拟机本质是就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。Java语言的可移植性正是建立在Java虚拟机的基础上。任何平台只要装有针对于该平台的Java虚拟机,字节码文件(.class)就可以在该平台上运行。这就是“一次编译,多次运行”。

2.Tomcat介绍

a.什么是Tomcat

Tomcat和我们此前学习的 Nginx 类似,也是一个Web服务器。

b.Tomcat与Nginx有什么区别?

tomcat是一个java版的web服务器

Nginx仅支持静态资源,而Tomcat则支持Java开发的 jsp 动态资源和静态资源。 Nginx适合做前端负载均衡,而Tomcat适合做后端应用服务处理。 通常情况下,企业会使用 Nginx+tomcat 结合使用,由Nginx处理静态资源,Tomcat处理动态资源。

3.Tmcat快速安装

机器名                  ip地址                  软件包

tomcat01           10.0.0.11                tomcat+nfs

tomcat02           10.0.0.12               tomcat+nfs

lb01                   10.0.0.5                nginx+mariadb+redis+nfs

安装方法1:

rpm -ivh jdk-8u102-linux-x64.rpm

mkdir /app -p

tar xf apache-tomcat-8.0.27.tar.gz -C /app

/app/apache-tomcat-8.0.27/bin/startup.sh

安装方法2:

#适合debian和ubuntu等其他linux发行版

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

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile

source /etc/profile

mkdir /app/

tar xf apache-tomcat-8.0.27.tar.gz -C /app

/app/apache-tomcat-8.0.27/bin/startup.sh

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

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配置文件

核心配置文件: /app/apache-tomcat-8.0.27/conf/server.xml 

一个tomcat实例一个server

一个server中包含多个Connector,Connector的主要功能是接受、响应用户请求。

service的作用是:将connector关联至engine(catalina引擎)

一个host就是一个站点,类似于nginx的多站点

context类似于nginx中location的概念

Tomcat中的Connector配置讲解

7.Tomcat部署zrlog

#编辑配置文件

vim  /app/apache-tomcat-8.0.27/conf/server.xml

<Host name="blog.oldqiang.com"  appBase="/html"

unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

              prefix="blog.oldqiang.com_access_log" suffix=".txt"

              pattern="%h %l %u %t "%r" %s %b" />

      </Host>


#重启生效

/app/apache-tomcat-8.0.27/bin/shutdown.sh

/app/apache-tomcat-8.0.27/bin/startup.sh

mv ROOT.war /html

8.配置tomcat basic认证

<web-app> 

<security-constraint> <web-resource-collection> <web-resource-name>test</web-resource-name> <url-pattern>/admin/login/*</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>

# 添加系统角色

vim /app/apache-tomcat-8.0.27/conf/tomcat-users.xml

<role rolename="manager-gui"/>

<role rolename="test100"/>

<user username="tomcat" password="123456" roles="manager-gui,test100"/>

#重启tomcat生效

9.Nginx+Tomcat集群架构实战

#nginx负载均衡配置

[root@lb01 ~]# cat /etc/nginx/nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include      mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    upstream tomcat {

      server 10.0.0.11:8080;

      server 10.0.0.12:8080;

    }

    server {

        listen      80;

        server_name  localhost;

        location / {

          proxy_pass http://tomcat;

          proxy_set_header Host $host;

          proxy_set_header X-Real-IP $remote_addr;

        }

    }

}

#解决访问日志源ip丢失问题

vim /app/apache-tomcat-8.0.27/conf/server.xml

pattern="%{X-Real-IP}i %l %u %t "%r" %s %b" />

重启生效

/app/apache-tomcat-8.0.27/bin/shutdown.sh

/app/apache-tomcat-8.0.27/bin/startup.sh

10.tomcat+nfs实现文件共享

#lb01安装nfs

yum install nfs-utils.x86_64 -y

创建共享目录并设置权限

mkdir /data

vim /etc/exports

/data 10.0.0.0/24(rw,sync,no_root_squash,no_all_squash)

重启服务

systemctl restart rpcbind

systemctl restart nfs

systemctl enable nfs

#tomcat01和tomcat02

下载nfs软件

yum install nfs-utils -y

查看权限并创建挂载目录,进行挂载

showmount -e 10.0.0.5

mkdir /html/ROOT/attached

mount -t nfs 10.0.0.5:/data /html/ROOT/attached

11.nginx缓存

#http模块增加

proxy_cache_path /opt/nginx/cache levels=1:2 keys_zone=one:10m;

#location

location ~ ..(gif|jpg|png|css|js|woff|flv|ico|swf)(.) {

proxy_cache one;

          proxy_cache_key $uri;

          proxy_cache_valid 200 302 1h;

          proxy_cache_valid 301 1d;

          proxy_cache_valid any 1m;

          expires 30d;

          add_header    Nginx-Cache  "$upstream_cache_status";

          proxy_pass http://tomcat;

          proxy_set_header Host $host;

          proxy_set_header X-Real-IP $remote_addr;

        }

12.Nginx+Tomcat集群实现全栈Https

# 配置文件

[root@lb01 ~]# cat /etc/nginx/nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include      mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    #proxy_cache_path /opt/nginx/cache levels=1:2 keys_zone=one:10m;

    proxy_cache_path /opt/nginx/cache  keys_zone=one:10m;

    upstream tomcat {

      server 10.0.0.11:8080;

      server 10.0.0.12:8080;

    }

server {

listen443ssl;

   server_name blog.oldqiang.com;

   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_protocols TLSv1 TLSv1.1 TLSv1.2;

   ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

   ssl_prefer_server_ciphers on;

   location / {

         proxy_pass http://tomcat;

proxy_set_header Host$host;

proxy_set_header X-Real-IP$remote_addr;

   }

    location  ~   ^.*\.(js|css|ico|gif|jpg|jpeg|png)$ {

         proxy_cache one;

proxy_cache_key$uri;

add_header     Nginx-Cache"$upstream_cache_status";

proxy_cache_valid2003041h;

proxy_cache_valid4041m;

         proxy_pass http://tomcat;

proxy_set_header Host$host;

proxy_set_header X-Real-IP$remote_addr;

       }

}

   server {

listen80;

       server_name  localhost;

       location / {

return302https://blog.oldqiang.com$request_uri;

       }

   }

}

13.使用maven编译java程序

#安装配置maven

wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven- / . . /binaries/apache-maven- 3.6.3-bin.tar.gz

 tar xf apache-maven- 3.6.3-bin.tar.gz -C /usr/local/ ln -s /usr/local/apache-maven- 3.6.3/usr/local/maven 

#文件结尾添加两行

vim /etc/profile

export M_HOME=/usr/local/maven

export PATH=${M_HOME}/bin:$PATH

source /etc/profile

#验证 

mvn -v

#配置maven仓库

vim /usr/local/maven/conf/settings.xml

<mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>

#清理并打包 

mvn clean package

14.使用redisson实现session共享

vim /app/apache-tomcat-8.0.27/conf/context.xml

<Manager className="org.redisson.tomcat.RedissonSessionManager"

configPath="${catalina.base}/conf/redisson.conf" readMode="MEMORY" updateMode="DEFAULT"/>

 vim  /app/apachetomcat-8.0.27/conf/redisson.conf 

"singleServerConfig":{  

 "idleConnectionTimeout":10000,  

 "connectTimeout":10000,   

 "timeout":3000,   

 "retryAttempts":3,  

 "retryInterval":1500,    

"password":null,  

 "subscriptionsPerConnection":1,   

 "clientName":null,    

"address": "redis://10.0.0.5:6379",   "subscriptionConnectionMinimumIdleSize":1,  "subscriptionConnectionPoolSize":50,   "connectionMinimumIdleSize":32,   

 "connectionPoolSize":64,   

"database":0,   "dnsMonitoringInterval":5000 },

 "threads":0, 

"nettyThreads":0, 

"codec":{   "class":"org.redisson.codec.JsonJacksonCodec" }, 

"transportMode":"NIO"

 }

#准备两个jar包

#下载

https://github.com/redisson/redisson/tree/master/redisson-tomcat

/app/apache-tomcat-8.0.27/lib/redisson-all-3.14.0.jar 

/app/apache-tomcat-8.0.27/lib/redisson-tomcat-8-3.14.0.jar

#重启tomcat生效

15.Tomcat监控

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.11

 -Dcom.sun.management.jmxremote.port= 12345

-Dcom.sun.management.jmxremote.ssl=false

 -Dcom.sun.management.jmxremote.authenticate=false" 

a:安装zabbix-java-gateway, 10052

b:配置重启zabbix-java-gateway 

START_POLLERS=5

 c:配置重启zabbix-server 

JavaGateway=127.0.0.1

JavaGatewayPort= 10052

StartJavaPollers=5

 d:zabbix-web添加jmx监控

16.Tomcat性能优化

内存参数

堆内存: 新生代 eden survivor  老年代tenured 非堆内存: metaspace  codecache  编译区 gc垃圾回收:  回收次数越少越好,回收时间越短越好 设置: 最大堆内存==最小堆内存 新生代内存满了,触发的gc,局部gc 老年代内存满了,触发的gc,全局gc 调优: 新生代:老年代的:1:4

jvm 内存溢出如何排查? 

vim /app/apache-tomcat-8.0.27/bin/catalina.sh

JAVA_OPTS="$JAVA_OPTS -server -Xms512m -Xmx512m -Xss256k  

-XX:+HeapDumpOnOutOfMemoryError 

-XX:HeapDumpPath=/usr/heapdump 

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps

 -Xloggc:/tmp/heap_trace.txt -XX:NewSize=m 

-XX:MaxNewSize=128m"

使用MAT分析

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容