1.JVM基本介绍
Java业务都是运行在Java虚拟机上的,Java虚拟机简称为jvm
2.为什么Java需要jvm虚拟机?
Java是可以跨平台,只需要将源代码进行一次编译,能够在多处运行
jvm是由jre提供(Java的运行环境)
3.tomcat与nginx有什么区别?
nginx仅支持静态资源解析,而tomcat支持解析Java开发的web应用,还支持解析静态资源(效率不高)
通常情况下,企业会常用nginx+tomcat结合,由nginx处理静态资源,tomcat处理动态资源
4.tomcat快速安装
安装java环境:
jdk:
jre
jvm
运行java项目
[root@web01 ~]# yum install java -y
[root@web01 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.39/bin/apache-tomcat-9.0.39.tar.gz
[root@web01 ~]# mkdir /soft
[root@web01 ~]# tar xf apache-tomcat-9.0.39.tar.gz -C /soft/
[root@web01 ~]# ln -s /soft/apache-tomcat-9.0.39/ /soft/tomcat
[root@web01 ~]# /soft/tomcat/bin/startup.sh # 启动
[root@web01 ~]# /soft/tomcat/bin/shutdown.sh # 停止
#端口8080 对外提供服务的端口
#端口8005 关闭tomcat端口
[root@web01 ~]# netstat -lntp |grep java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 6867/java
tcp6 0 0 :::8080 :::* LISTEN 6867/java
#以systemctl方式管理tomcat服务
[root@web01 ~]# vim /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat Server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/soft/tomcat/bin/startup.sh
ExecStop=/soft/tomcat/bin/shutdown.sh
[Install]
WantedBy=multi-user.target
# 加载tomcat 文件
[root@web01 ~]# systemctl daemon-reload
# 将tomcat加入开机自启
[root@web01 ~]# systemctl enable tomcat
tomcat相关路径作用
bin tomcat启动与停止脚本,启动前需要加载jar包
conf tomcat配置文件 server.xml
lib tomcat 依赖jar文件, 连接数据库,就需要jar支持
logs tomcat的日志文件 catalina.out
temp tomcat临时目录
webapps tomcat的默认站点路径 webapps/ROOT
work tomcat 缓存目录
tomcat运行虚拟主机:
<!--diy.etiantian.org-->
<Host name="diy.etiantian.org" appBase="/code/tomcat/diy"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="diy_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
[root@web01 ROOT]# systemctl stop tomcat
[root@web01 ROOT]# systemctl start tomcat
[root@web01 ROOT]# mkdir /code/tomcat/diy/ROOT -p
[root@web01 ROOT]# echo "tomcat-diy" > /code/tomcat/diy/ROOT/index.html
<Host >
<!--访问/tt这个uri,上/code/tt中获取资源页面-->
<Context docBase="/code/tt" path="/tt" reloadable="true"/>
</Host>
[root@web01 ROOT]# mkdir /code/tt
[root@web01 ROOT]# echo "ttttt-tomcat" > /code/tt/index.html
path: 要访问的uri /tt
docBase:具体的路径 /code/tt
组合起来: 请求域名:端口/tt --> /code/tt
5.Tomcat自带的管理页面
1.所有的管理页面,都将权限赋予给了角色,而角色的名称是固定的: manager-gui admin-gui
2.需要添加一个用户,将用户捆绑至对应的角色,这样用户就可以访问到对应的页面
[root@web01 ROOT]# vim /soft/tomcat/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="123456" roles="manager-gui,admin-gui"/>
3.由于项目默认允许127.0.0.1访问,所以配置好了角色和用户也无法正常访问:
[root@web01 ROOT]# vim /soft/tomcat/webapps/host-manager/META-INF/context.xml
[root@web01 ROOT]# vim /soft/tomcat/webapps/manager/META-INF/context.xml
默认状态,
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
修改后的状态:10\.0\.0\.\d
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.0\.0\.\d+|" />
6.Tomcat部署zrlog—博客系统 (war包: 放到tomcat目录下即可,会自动解压)
1).编写tomcat配置文件,添加一个虚拟主机
[root@web01 ROOT]# vim /soft/tomcat/conf/server.xml
<!--zrlog.etiantian.org-->
<Host name="zrlog.etiantian.org" appBase="/code/zrlog"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="zrlog_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
[root@web01 ROOT]# mkdir /code/zrlog
2)下载zrlog-war包,放入对应的站点目录
[root@web01 ROOT]# cd /code/zrlog/
[root@web01 zrlog]# rz -E
[root@web01 zrlog]# ls
ROOT.war
3)重启Tomcat服务
[root@web01 zrlog]# systemctl stop tomcat
[root@web01 zrlog]# systemctl start tomcat
4)在172.16.1.51上创建一个zrlog的库:
[root@db01 ~]# mysql -uroot -pboy123.com
MariaDB [(none)]> create database zrlog;
MariaDB [(none)]>
6.源码包–>jar包–war包的关系?
1.什么是源码包?
由开发人员编写而成。
2.什么是jar包?
由源码包编译生成的产物。
不可独立运行,被某个JAVA程序依赖而使用
可独立运行,java -jar xx.jar。 [jar直接运行的项目演示](https://gitee.com/chejiangyi/dingding-sonar)
3.什么是war包?
由源码包编译生成的产物,可直接输出至Tomcat运行 (较为广泛)
4.源码包与jar包war的关系?
1.源码包通过maven编译,编译后分为jar war两种类型。
2.war包通常直接放入tomcat运行,在war运行的过程中需要依赖 jar 包。
3.jar包又分为两种,可独立运行(直接对外提供服务)和不可独立运行(被war依赖)
7.tomcat集群(两台web节点+1台负载均衡)
[root@web02 ~]# yum install java -y
[root@web02 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.39/bin/apache-tomcat-9.0.39.tar.gz
[root@web02 ~]# mkdir /soft
[root@web02 ~]# tar xf apache-tomcat-9.0.39.tar.gz -C /soft/
[root@web02 ~]# ln -s /soft/apache-tomcat-9.0.39/ /soft/tomcat
[root@web02 ~]# /soft/tomcat/bin/startup.sh # 启动
[root@web02 ~]# /soft/tomcat/bin/shutdown.sh # 停止
web01执行
[root@web01 ~]# scp /soft/tomcat/conf/server.xml root@172.16.1.8:/soft/tomcat/conf/server.xml
[root@web01 ~]# scp /usr/lib/systemd/system/tomcat.service root@172.16.1.8:/usr/lib/systemd/system/tomcat.service
[root@web01 ~]# scp -rp /code/zrlog root@172.16.1.8:/code/
web02执行
[root@web02 ~]# systemctl daemon-reload
[root@web02 ~]# systemctl enable tomcat
Created symlink from /etc/systemd/system/multi-user.target.wants/tomcat.service to /usr/lib/systemd/system/tomcat.service.
[root@web02 ~]# systemctl start tomcat
lb执行操作:
[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_zrlog.etiantian.org.conf
upstream zrlog {
server 172.16.1.7:8080;
server 172.16.1.8:8080;
}
server {
listen 80;
server_name zrlog.etiantian.org;
location / {
proxy_pass http://zrlog;
include proxy_params;
}
}
#拓展
为tomcat日志,获取http的Header信息 (/soft/tomcat/conf/server.xml文件更改部分内容)
<!--zrlog.etiantian.org-->
<Host name="zrlog.etiantian.org" appBase="/code/zrlog"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="zrlog_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b %{User-Agent}i %{X-Forwarded-For}i" />
</Host>
8.tomcat集群配置HTTPS服务
单tomcat节点:
https://help.aliyun.com/document_detail/98576.html?spm=5176.2020520163.cas.19.387756a7o6e0zQ
nginx+tomcat集群配置方式:
[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_zrlog.etiantian.org.conf
upstream zrlog {
server 172.16.1.7:8080;
server 172.16.1.8:8080;
}
server {
listen 443 ssl;
server_name zrlog.etiantian.org;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
location / {
proxy_pass http://zrlog;
include proxy_params;
}
}
server {
listen 80;
server_name zrlog.etiantian.org;
return 302 https://$http_host$request_uri;
}
9.tomcat + nginx + redis会话保持
1.配置虚拟主机 (所有节点都需要配置):
[root@web02 ~]# vim /soft/tomcat/conf/server.xml
<!--session.etiantian.org-->
<Host name="session.etiantian.org" appBase="/code/session"
unpackWARs="true" autoDeploy="true">
</Host>
2.创建目录,编写代码(所有节点都需要配置):
[root@web02 ~]# mkdir /code/session/ROOT -p
[root@web02 ~]# vi /code/session/ROOT/index.jsp
<body>
<%
//HttpSession session = request.getSession(true);
System.out.println(session.getCreationTime());
out.println("<br> web01 SESSION ID:" + session.getId() + "<br>");
out.println("Session created time is :" + session.getCreationTime()
+ "<br>");
%>
</body>
3.负载均衡配置:
[root@lb01 conf.d]# cat proxy_session.etiantian.org.conf
upstream session {
server 172.16.1.7:8080;
server 172.16.1.8:8080;
}
server {
listen 80;
server_name session.etiantian.org;
location / {
proxy_pass http://session;
include proxy_params;
}
}
4.接入 TomcatClusterRedisSessionManager ( 参考官方地址: https://github.com/ran-jit/tomcat-cluster-redis-session-manager )
1.解压zip包
[root@web01 ~]# unzip tomcat-cluster-redis-session-manager.zip
2.拷贝jars到tomcat的/lib目录中
[root@web01 ~]# cp tomcat-cluster-redis-session-manager/lib/* /soft/tomcat/lib/
3.拷贝conf下的redis.properties文件,到tomcat的conf文件
[root@web01 ~]# cp tomcat-cluster-redis-session-manager/conf/redis-data-cache.properties /soft/tomcat/conf/
4.将配置文件中连接redis地址修改为如下地址即可
[root@web01 ~]# vim /soft/tomcat/conf/redis-data-cache.properties
redis.hosts=172.16.1.51:6379
5.添加如下两行至tomcat/conf/context.xml (添加在</Context> 上一行 )
[root@web01 ~]# vim /soft/tomcat/conf/context.xml
<Valve className="tomcat.request.session.redis.SessionHandlerValve" />
<Manager className="tomcat.request.session.redis.SessionManager" />
6.支持tomcat会话的项目(自行练习)
https://gitee.com/mail_osc/wangmarket