1.JVM介绍
JVM是Java Virtual Machine(Java虚拟机)的缩写
Java虚拟机本质是就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。Java语言的可移植性正是建立在Java虚拟机的基础上。任何平台只要装有针对于该平台的Java虚拟机,字节码文件(.class)就可以在该平台上运行。这就是“一次编译,多次运行”。
2.Tomcat介绍
a.什么是Tomcat
Tomcat和我们此前学习的 Nginx 类似,也是一个Web服务器。
b.Tomcat与Nginx有什么区别?
Nginx仅支持静态资源,而Tomcat则支持Java开发的 jsp 动态资源和静态资源。
Nginx适合做前端负载均衡,而Tomcat适合做后端应用服务处理。
通常情况下,企业会使用 Nginx+tomcat 结合使用,由Nginx处理静态资源,Tomcat处理动态资源。
3.Tomcat快速安装
方法1:
rpm -ivh jdk-8u102-linux-x64.rpm
mkdir /app
tar xf apache-tomcat-8.0.27.tar.gz -C /app
/app/apache-tomcat-8.0.27/bin/startup.sh
方法2:
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
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
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实例一个server
一个server中包含多个Connector,Connector的主要功能是接受、响应用户请求。
service的作用是:将connector关联至engine(catalina引擎)
一个host就是一个站点,类似于nginx的多站点
context类似于nginx中location的概念
Tomcat中的Connector配置讲解
Tomcat配置文件解读
7.Tomcat部署zrlog
先下载zrlog的war包,放到tomcat的webapps目录下面,tomcat会自动解压运行
8.配置tomcat的basic认证
vim /app/apache-tomcat-8.0.27/webapps/ROOT/WEB-INF/web.xml
<web-app>
......
<security-constraint>
<web-resource-collection>
<web-resource-name>test</web-resource-name>
<url-pattern>/*</url-pattern>#设置匹配uri跳出basic认证
</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集群架构实战
1.分离数据库
[root@xixi WEB-INF]# cat /app/apache-tomcat-8.0.27/webapps/ROOT/WEB-INF/db.properties
#This is a database configuration file
#Mon Nov 18 10:38:22 CST 2019
driverClass=com.mysql.cj.jdbc.Driver
user=zrlog
password=123456
jdbcUrl=jdbc\:mysql\://10.0.0.102\:3306/zrlog?characterEncoding\=UTF-8&allowPublicKeyRetrieval\=true&useSSL\=false&serverTimezone\=GMT
将文件里面数据库的路径改成分离出来机器的ip
2.配置nginx作为负载均衡
1.配置nginx源,安装nginx
yum -y install nginx
2.配置nginx配置文件,我这里直接配置的nginx的主配置文件
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream java {
server 10.0.0.100:8080;
server 10.0.0.101:8080;
}
server {
listen 80;
server_name http://jpress.etiantian.org;
root html;
index index.html index.htm;
location / {
proxy_pass http://java;
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;
}
}
}
10.Nginx+Tomcat集群实现全栈Https
1.首先要获取证书文件
2.配置nginx配置文件
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream tom {
server 10.0.0.100:8080;
server 10.0.0.101:8080;
}
server {
listen 443 ssl;
server_name blog.oldqiang.com;
ssl_certificate ssl_key/1_blog.oldqiang.com_bundle.crt;
ssl_certificate_key ssl_key/2_blog.oldqiang.com.key;
location / {
proxy_pass http://tom;
proxy_set_header Host $http_host;
}
}
server {
listen 80;
server_name blog.oldqiang.com;
return 302 https://$server_name$request_uri;
}
}
11.nginx+tomcat的动静分离,以及读写分离
1.动静分离,我们将静态请求交给擅长的nginx处理
在nginx配置文件中加上
location ~.*\.(png|jpg) {
root /data;
我们写入图片还是在tomcat机器上,但是网站访问找图片就是直接到nginx负载这台机器上去寻找。所以我们可以做一个lsyncd实时同步或者nfs挂载。
我这里用的是nfs挂载,首先分别在tomcat和nginx负载上安装nfs-utils服务,在tomcat配置nfs配置文件
[root@xixi WEB-INF]# cat /etc/exports
/app/apache-tomcat-8.0.27/webapps/ROOT/attached/image 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
[root@xixi ~]# showmount -e 10.0.0.100
Export list for 10.0.0.100:
/app/apache-tomcat-8.0.27/webapps/ROOT/attached/image 172.16.1.0/24
[root@xixi ~]# mount -t nfs 172.16.1.100:/app/apache-tomcat-8.0.27/webapps/ROOT/attached/image /data/attached/image/
这样我们就可以实现动静分离了
2.读写分离
[root@xixi ~]# 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 write {
server 10.0.0.100:8080;
}
upstream read {
server 10.0.0.100:8080;
server 10.0.0.103:8080;
}
server {
listen 443 ssl;
server_name blog.oldqiang.com;
ssl_certificate /root/nginx/1_blog.oldqiang.com_bundle.crt;
ssl_certificate_key /root/nginx/2_blog.oldqiang.com.key;
location / {
if ($request_method = POST ) {
proxy_pass http://write;
}
proxy_pass http://read;
proxy_set_header Host $http_host;
}
location ~.*\.(png|jpg) {
root /data;
}
}
server {
listen 80;
server_name blog.oldqiang.com;
return 302 https://$server_name$request_uri;
}
server {
listen 80;
server_name www.weixu.com;
location / {
proxy_pass http://read;
proxy_set_header Host $http_host;
}
}
}
这里我们需要设置两个资源池,然后在location哪里做个判断就可以了。
12.tomcat的多站点配置
1.配置tomcat的配置文件
vim /app/apache-tomcat-8.0.27/conf/server.xml
</Host>
<Host name="www.weixu.com" appBase="webapps2"
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>
根据需求添加域名,生成站点目录1.
13.maven编译Java项目
1.安装二进制maven
可以去清华园下载apache-maven-3.6.1-bin.tar.gz
2.解压maven包
tar xf apache-maven-3.6.1-bin.tar.gz -C /usr/local
ln -s /usr/local/apache-maven-3.6.1 /usr/local/maven
3.配置maven的环境变量
vim /etc/profile
export M2_HOME=/usr/local/maven
export PATH=${M2_HOME}/bin:$PATH
source /etc/profile
4.下载java项目的源码
下载SpringBootWeb.tar.gz,解压
5.编译java项目
1.cd SpringBootWeb
为了加速maven编译速度
2.vim /usr/local/maven/conf/settings.xml
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
3.mvn package 打包
mvn clean package 先清理缓存文件,在打包
4.将打包好的文件放到tomcat的站点目录下就可以访问页面了
14.tomcat的监控
1.安装zabbix机器
2.在zabbix机器上安装监控java的程序
#安装zabbix-java-gateway
yum install zabbix-java-gateway.x86_64 -y
#配置zabbix-server和zabbix-java-gateway
vim /etc/zabbix/zabbix_java_gateway.conf
START_POLLERS=5
vim /etc/zabbix/zabbix_server.conf
JavaGateway=127.0.0.1
JavaGatewayPort=10052
StartJavaPollers=5
#启动服务
systemctl restart zabbix-java-gateway.service
systemctl restart zabbix-server.service
3.在需要监控的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.72
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"
4.自定义监控java监控项
可以在windows上安装jdk


根据这里的取值设置自定义监控项
随便找一个模板监控克隆

15.Tomcat性能优化
年轻代: 年轻代内存满了,就会触发年轻代 内存回收,局部,存活下的对象存到年老代
年老代: 年老代内存满了,就会触发全局 内存回收,全部
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: 持久代最大内存
tomcat优化参考
网友评论