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的概念
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分析