1.JVM基本介绍
JAVA业务都是运行在java虚拟机上的,简称 jvm ( java virtual machine )
为什么java需要jvm虚拟机?
早期:
C语言 不支持跨域平台 (游戏)
Windows:在编译一次
MACOS:还需要编译
LINUX: 编译一次
可移植性比较的差。
JAVA: 可以做到一次编译,多处运行。
windows、linux、macos。
需要我们在操作系统上启动运行一个jvm虚拟机,这样我们将java编译好的war、jar包
在windows、linux、macos平台上运行起来。无需我们重复编译。
jvm是由谁提供的呢?
jre:java运行环境 java runtime environment,包含了jvm。
jdk:java开发环境 会包含java的运行环境 jre。(yum install java -y 会安装jdk)
如果我们只是单纯运行java代码,jre足够。 jdk。
2.Tomcat是什么,与Nginx的区别。
Tomcat是一个web服务,提供动态程序的解析(java),支持静态资源。
企业nginx+tomcat模型, nginx处理静态资源,tomcat处理动态资源(java),能加速网站的访问和降低访问的延迟。
Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
3.Tomcat安装、配置、启动
1.安装jdk
yum install java -y
2.安装Tomcat ( 下载 Tomcat、解压、启动 )
wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.34/bin/apache-tomcat-9.0.34.tar.gz
mkdir /soft
tar xf apache-tomcat-9.0.34.tar.gz -C /soft/
ln -s /soft/apache-tomcat-9.0.34/ /soft/tomcat
3.目录结构
bin 主要包含启动和关闭tomcat的脚本(启停java脚本依赖jar包文件)
conf tomcat配置文件的目录
lib tomcat运行时需要加载的jar包
logs tomcat日志存放位置
temp tomcat临时存放文件路径
webapps tomcat默认站点目录
work tomcat运行时产生的缓存文件
4.Tomcat的HTTP请求过程
用户发出一个请求,如http://tomcat.oldxu.com:8080/index.jsp
Connector发现是http/1.1协议,而且还是8080端口,于是就把请求接收后交给符合条件的Engine
Engine通过请求中的主机名tomcat.oldxu.com查找满足条件的虚拟主机(Host)
找到后就去此虚拟主机指定的appBase(代码存放的目录)最后将解析产生的结果返回给用户。
4.使用tomcat部署web服务
- 定义虚拟主机
vim /soft/tomcat/conf/server.xml
<!--站点zrlog.oldxu.com-->
<Host name="zrlog.oldxu.com" appBase="/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>
- 上传war包至指定目录
[root@web01 conf]# mkdir /zrlog
[root@web01 conf]# ll /zrlog/
总用量 11316
-rw-r--r-- 1 root root 11585583 5月 11 11:32 ROOT.war
- 重启tomcat应用
1.自动加压.war包
2.自动部署,war包 (自动生成ROOT目录)
[root@web01 conf]# /soft/tomcat/bin/shutdown.sh
[root@web01 conf]# /soft/tomcat/bin/startup.sh
- 检查是否部署ok
[root@web01 conf]# tail -f /soft/tomcat/logs/catalina.out
11-May-2020 11:33:32.577 信息 [main] org.apache.coyote.AbstractProtocol.start
开始协议处理句柄["http-nio-8080"]
11-May-2020 11:33:32.681 信息 [main] org.apache.catalina.startup.Catalina.start
Server startup in [4,035] milliseconds
配置远程数据库连接信息
MariaDB [(none)]> create database zrlog charset utf8;
MariaDB [(none)]>grant all privileges on *.* to 'all'@'%' identified by 'xxxxxx';
- 访问zrlog站点
5.使用tomcat部署多节点web服务
web1 172.16.1.7
web2 172.16.1.8
1.安装tomcat
[root@web02 ~]# yum install java -y
3.拷贝代码 (注意是在web01节点操作的)
[root@web01 ~]# scp -rp /soft root@10.0.0.8:/
[root@web01 ~]# scp -rp /zrlog root@10.0.0.8:/
4.web02操作如下
[root@web02 ~]# rm -rf /soft/tomcat/
[root@web02 ~]# ln -s /soft/apache-tomcat-9.0.34/ /soft/tomcat
5.共享静态资源。
yum install nfs-utils -y
[root@nfs ~]# cat /etc/exports
/data/blog 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/data/zrlog 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
[root@nfs ~]# mkdir /data/zrlog
[root@nfs ~]# chown -R www.www /data/zrlog/
[root@nfs ~]# systemctl restart nfs
所有web节点都需要挂载
mount -t nfs 172.16.1.31:/data/zrlog /zrlog/ROOT/attached/
6.tomcat的base的基础认证
配置Tomcat网页管理页面。 ( nginx basic auth)
vim /soft/tomcat/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="oldxu" password="123456" roles="manager-gui,admin-gui"/>
- 还需要配置该项目的访问权限,因为Tomcat默认管理页面仅允许本机访问,如果希望其他网段能正常访问,需要配置允许规则。
vim /soft/tomcat/webapps/manager/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+" />
- 为zrblog添加/admin/添加base认证
1.需要找到项目下的WEB-INF/web.xml进行配置。(了解)
[root@es-node1 tomcat]# vim /zrlog/ROOT/WEB-INF/web.xml
<web-app>
...
<security-constraint>
<!--定义资源名称以及需要认证的url-->
<web-resource-collection>
<web-resource-name>zrlog</web-resource-name>
<url-pattern>/admin/*</url-pattern>
</web-resource-collection>
<!--给对应资源关联角色名-->
<auth-constraint>
<role-name>zrlog_role</role-name>
</auth-constraint>
</security-constraint>
<!--调用BASIC方法来实现认证-->
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Default</realm-name>
</login-config>
...
</web-app>
2.配置用户名密码,关联对应的角色(多个role不要使用相同用户)
[root@es-node1 tomcat]# vim /soft/tomcat/conf/tomcat-users.xml
<role rolename="zrlog_role"/>
<user username="tomcat" password="123456" roles="zrlog_role"/>
重启tomcat
[root@es-node1 ~]# /soft/tomcat/bin/shutdown.sh && /soft/tomcat/bin/startup.sh
7.java源码包、jar包、war包的关系、联系、区别?
1.什么是源码包?
由java工程师编写的java代码,称为java源码包。
编译( maven 方式去编译java的源代码 )
编译之后会得到一个包裹:
war jar
2.什么是war包?
由源码编译后生成的产物,可以直接放入 tomcat运行起来。( 比较广泛 )
3.什么是jar包?
由源码编译后生成的产物。
1.不能独立运行起来,它可能被某个java程序依赖运行。或者war包运行所依赖。
2.可独立运行起来的, java -jar xxx.jar 直接启动运行,无需tomcat
4.源码包、jar、war:
1.源码包编译后会产生war包、jar包
2.war通常是直接由tomcat运行启动,启动加载项目时会依赖一些jar包。
3.jar包,
分为不可独立运行(被java程序依赖运行、或者是被war包依赖运行)
分为可独立运行:可以直接对外提供服务。只需要有java环境即可。启动命令: java -jar xx.jar
8. tomcat集群部署
8.1 Nginx_proxy
[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_zrlog.oldxu.com.conf
upstream zrlog {
server 172.16.1.7:8080;
server 172.16.1.8:8080;
}
server {
listen 80;
server_name zrlog.oldxu.com;
#tomcat启动的java程序,可以直接通过proxy_pass进行负载均衡
location / {
proxy_pass http://zrlog;
include proxy_params;
}
}
8.2 单节点Tomcat实现HTTPS ( 了解 )
1.修改tomcat配置: server.xml
0.首先需要有证书 ( 必须 )
1.将http的默认监听端口8080 修改为 80,redirect至 443
2.开启https监听器,配置证书即可。
3.将http强制跳转https ( tomcat操作,与nginx无关。)
使用新机器web03演示
[root@nfs ~]# yum install java -y
[root@nfs ~]# mkdir /soft
[root@nfs ~]# tar xf apache-tomcat-9.0.34.tar.gz -C /soft/
[root@nfs ~]# ln -s /soft/apache-tomcat-9.0.34/ /soft/tomcat
vim /soft/tomcat/conf/server.xml
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="443" />
<Connector port="443"
protocol="HTTP/1.1"
SSLEnabled="true"
scheme="https"
secure="true"
keystoreFile="/ssl/3434295_aliyun.xuliangwei.com.pfx"
keystoreType="PKCS12"
keystorePass="OpI94943"
clientAuth="false"
SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"
ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"/> mkdir /ssl/------>>>放入证书
2.1 修改 localhost
<Host name="aliyun.xuliangwei.com" appBase="webapps"
2.2 配置http跳转 https
在负载均衡上配置证书就可以实现全栈https
web1 | web2 | lb3 |
172.16.1.7 | 172.16.1.8 | 10.0.0.5 |
[root@lb01 conf.d]# cat /etc/nginx/conf.d/proxy_zrlog.oldxu.com.conf
upstream zrlog {
server 172.16.1.7:8080;
server 172.16.1.8:8080;
}
server {
listen 443 ssl;
server_name zrlog.oldxu.com;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
#tomcat启动的java程序,可以直接通过proxy_pass进行负载均衡
location / {
proxy_pass http://zrlog;
include proxy_params;
}
}
server {
listen 80;
server_name zrlog.oldxu.com;
return 302 https://$server_name$request_uri;
}
8.3 Nginx+Tomcat+Redis实现集群会话共享
多种方式:
1.ip_hash
2.mysql
3.redis
4.tomcat自带的cluster session复制 ( 官方建议不要超过4个tomcat节点 )
- 准备web01 和 web02
支持redis session共享----->>>下载 tomcat-cluster-redis-session-manager - 解压
- 1.拷贝所有的jar包
[root@web01 ~]#cp tomcat-cluster-redis-session-manager/lib/* /soft/tomcat/lib/
- 2.拷贝redis配置文件,并且更新redis配置文件
[root@web01 ~]#cp tomcat-cluster-redis-session-manager/conf/redis-data-cache.properties /soft/tomcat/conf/
- 3.
Add the below two lines in your tomcat/conf/context.xml file.
- 4.准备web01 和web02 一个session测试页面
<!--站点session.oldxu.com-->
<Host name="session.oldxu.com" appBase="/session"
unpackWARs="true" autoDeploy="true">
</Host>
[root@web02 ~]# mkdir -p /session/ROOT
[root@web02 ~]# vi /session/ROOT/index.jsp
<body>
<%
//HttpSession session = request.getSession(true);
System.out.println(session.getCreationTime());
out.println("<br> web02 SESSION ID:" + session.getId() + "<br>");
out.println("Session created time is :" + session.getCreationTime()
+ "<br>");
%>
</body>
- 5.接入负载均衡
[root@lb01 conf.d]#cat /etc/nginx/conf.d/proxy_session.oldxu.com.conf
upstream session {
server 172.16.1.7:8080;
server 172.16.1.8:8080;
}
server {
listen 80;
server_name session.oldxu.com;
location / {
proxy_pass http://session;
include proxy_params;
}
}
建议:
1.先配置session的网站
2.搭建nginx+tomcat集群
3.测试访问,演示是否web01和web02的session不一致
4.接入redis,实现tomcat共享会话信息
5.再次测试,请求web01和web02 看session是否是一致的。
6.登陆redis查看是否存在对应的session的key