上传文件至 /

This commit is contained in:
tu 2024-06-07 15:50:17 +08:00
commit 84f68292e3
2 changed files with 567 additions and 0 deletions

519
Web容器-Tomcat.md Normal file
View File

@ -0,0 +1,519 @@
<h1><center>Tomcat</center></h1>
## 一Tomcat简介
#### 1.简介
![image-20230518232204478](https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20230518232204478.png)
Tomcat是Apache软件基金会Apache Software Foundation的Jakarta 项目中的一个核心项目
Tomcat服务器是一个免费的开放源代码的Web应用服务器属于轻量级应用服务器
Tomcat是WEB容器/WEB中间件
Tomcat官网https://tomcat.apache.org/
#### 2.端口
Tomcat自身服务的端口:8005
Tomcat和其他应用通信的端口:8009
Tomcat给客户端浏览器访问页面使用的端口:8080
#### 3.运行环境
JDK是 Java 语言的软件开发工具包
JDK是整个java开发的核心它包含了JAVA的运行环境JVM+Java系统类库和JAVA工具
Tomcat运行需要JDK
## 二Tomcat安装
#### 1.上传
#### 2.安装
```shell
[root@xingdiancloud ~]# tar xf apache-tomcat-7.0.34.tar.gz -C /usr/local/
[root@xingdiancloud ~]# tar xf jdk-8u91-linux-x64.tar.gz -C /usr/local/
[root@xingdiancloud ~]# ln -s /usr/local/jdk1.8.0_91 /usr/local/java
[root@xingdiancloud ~]# ln -s /usr/local/apache-tomcat-7.0.34 /usr/local/tomcat
```
#### 3.环境变量
```shell
[root@xingdiancloud ~]# vim /etc/profile
JAVA_HOME=/usr/local/java
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
[root@xingdiancloud ~]# source /etc/profile
```
#### 4.检测
```shell
[root@xingdiancloud ~]# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
```
#### 5.启动Tomcat
```shell
[root@xingdiancloud ~]# /usr/local/tomcat/bin/startup.sh
```
#### 6.管理方式
```shell
启动tomcat的方法
1.直接执行/usr/local/tomcat/bin/startup.sh
2.直接执行/usr/local/tomcat/bin/catalina.sh start
关闭tomcat的方法
1.直接执行/usr/local/tomcat/bin/shutdown.sh
2.直接执行/usr/local/tomcat/bin/catalina.sh stop
```
#### 7.检测
```shell
[root@xingdiancloud ~]# netstat -tnlp |grep java
tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 6191/java
tcp 0 0 :::8009 :::* LISTEN 6191/java
tcp 0 0 :::8080 :::* LISTEN 6191/java
```
#### 8.测试
IP+端口访问
#### 9.Tomcat目录
Tomcat主目录介绍
```shell
[root@java-tomcat1 tomcat]# tree -L 1
.
├── bin #存放tomcat的管理脚本(二进制文件)
├── BUILDING.txt
├── conf #tomcat的配置文件server.xml
├── CONTRIBUTING.md
├── lib #web应用调用的jar包存放路径
├── LICENSE
├── logs #tomcat日志存放目录
├── NOTICE
├── README.md
├── RELEASE-NOTES
├── RUNNING.txt
├── temp #存放临时文件
├── webapps #默认网站发布目录
└── work #存放编译生产的.java与.class文件
```
Webapps目录介绍
```shell
[root@java-tomcat1 webapps]# tree -L 1
.
├── docs #tomcat的帮助文档
├── examples #web应用实例
├── host-manager #主机管理
├── manager #管理
└── ROOT #默认站点根目录
```
Tomcat配置文件目录介
```
[root@java-tomcat1 conf]# tree -L 1
.
├── Catalina
├── catalina.policy
├── catalina.properties
├── context.xml
├── logging.properties
├── logs
├── server.xml # tomcat 主配置文件
├── server.xml.bak
├── server.xml.bak2
├── tomcat-users.xml # tomcat 管理用户配置文件
├── tomcat-users.xsd
└── web.xml
```
## 三部署JSPGOU项目
#### 1.环境准备
Tomcat服务器正常运行Tomcat
数据库服务器部署
#### 2.框架
单机架构:
<img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20230518233730711.png" style="zoom:33%;" />
集群架构:
<img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20230518234046405.png" alt="image-20230518234046405" style="zoom:33%;" />
#### 3.数据库部署
安装:略
创建数据库:
```shell
create database jspgou default charset=utf8;
```
授权:略
上传数据库文件:略
修改配置仅限jspgou项目
```
[root@xingdiancloud ~]# vim /etc/my.cnf
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
explicit_defaults_for_timestamp=1
```
参数解释:
```shell
STRICT_TRANS_TABLES在该模式下如果一个值不能插入到一个事务表中则中断当前的操作对非事务表不做任何限制
NO_ZERO_IN_DATE在严格模式不接受月或日部分为0的日期。如果使用IGNORE选项我们为类似的日期插入'0000-00-00'。在非严格模式,可以接受该日期,但会生成警告。
ERROR_FOR_DIVISION_BY_ZERO在严格模式在INSERT或UPDATE过程中如果被零除(或MOD(X0)),则产生错误(否则为警告)。如果未给出该模式被零除时MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中MySQL生成被零除警告但操作结果为NULL
NO_AUTO_CREATE_USER防止GRANT自动创建新用户除非还指定了密码。
NO_ENGINE_SUBSTITUTION如果需要的存储引擎被禁用或未编译那么抛出错误。不设置此值时用默认的存储引擎替代并抛出一个异常
```
数据库导入数据库文件来自4.1解压的sql文件
```shell
[root@xingdiancloud ~]# mysql -u root -p123 -D jspgou < jspgou.sql
```
#### 4.项目上线Tomcat
解压项目:略
将数据库文件远程拷贝到数据库
将项目放到指定目录下;网站发布目录
```shell
[root@xingdiancloud ~]# cp -r ROOT/ /usr/usr/local/tomcat/webapps/
```
更改数据库连接
```shell
[root@xingdiancloud ~]# vim /usr/local/tomcat/webapps/ROOT\WEB-INF\config\jdbc.properties
jdbc.url=jdbc:mysql://127.0.0.1:3306/创建好的数据库名?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123
```
#### 5.访问测试
```shell
系统管理后台登录http://localhost:8080/jeeadmin/jspgou/index.do
用户名admin
密 码123456
```
#### 6.Tomcat启动慢解决方案
```shell
[root@xingdiancloud ~]# yum install rng-tools
[root@xingdiancloud ~]# systemctl start rngd
```
## 四Tomcat扩展
#### 1.Tomcat配置文件
server.xml: Tomcat的主配置文件包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息
web.xml遵循Servlet规范标准的配置文件用于配置servlet并为所有的Web应用程序提供包括MIME映射等默认配置信息
tomcat-user.xmlRealm认证时用到的相关角色、用户和密码等信息
catalina.policyJava相关的安全策略配置文件在系统资源级别上提供访问控制的能力
catalina.propertiesTomcat内部package的定义及访问相关的控制也包括对通过类装载器装载的内容的控制
logging.properties: Tomcat6通过自己内部实现的JAVA日志记录器来记录操作相关的日志
context.xml所有host的默认配置信息
```
1、Server组件:
<Server port=”8005” shutdown=”SHUTDOWN”>
port: 接收shutdown指令的端口默认仅允许通过本机访问默认为8005
shutdown发往此Server用于实现关闭tomcat实例的命令字符串默认为SHUTDOWN
2、Service组件
Service主要用于关联一个引擎和与此引擎相关的连接器每个连接器通过一个特定的端口和协议接收入站请求交将其转发至关联的引擎进行处理。因此Service要包含一个引擎、一个或多个连接器。
如上面示例中的定义:
<Service name=”Catalina”>
这定义了一个名为Catalina的Service此名字也会在产生相关的日志信息时记录在日志文件当中。
Service相关的属性
className 用于实现service的类名一般都是org.apache.catalina.core.StandardService。
name此服务的名称默认为Catalina
3、Connector组件
进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类
Tomcat作为应用程序服务器请求来自于前端的web服务器这可能是Apache, IIS, Nginx等
Tomcat作为独立服务器请求来自于web浏览器
Tomcat应该考虑工作情形并为相应情形下的请求分别定义好需要的连接器才能正确接收来自于客户端的请求。一个引擎可以有一个或多个连接器以适应多种请求方式。
定义连接器可以使用多种属性有些属性也只适用于某特定的连接器类型。一般说来常见于server.xml中的连接器类型通常有4种
1) HTTP连接器 2) SSL连接器 3) AJP 1.3连接器 4) proxy连接器
如上面示例server.xml中定义的HTTP连接器
<Connector port=”8080″ protocol=”HTTP/1.1″
maxThreads=”150″ connectionTimeout=”20000″
redirectPort=”8443″/>
4、Engine组件
Engine是Servlet处理器的一个实例即servlet引擎默认为定义在server.xml中的Catalina。Engine需要defaultHost属性来为其定义一个接收所有发往非明确定义虚拟主机的请求的host组件。如前面示例中定义的
<Engine name=”Catalina” defaultHost=”localhost”>
5、Host组件
位于Engine容器中用于接收请求并进行相应处理的主机或虚拟主机如前面示例中的定义
<Host name=”localhost” appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”>
</Host>
autoDeploy在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy默认为true
unpackWars在启用此webapps时是否对WAR格式的归档文件先进行展开默认为true
```
#### 2.Tomcat管理
```shell
1.编辑一个文件tomcat
[root@tomcat ~]# vim tomcat
#!/bin/bash
bash /usr/local/tomcat/bin/catalina.sh $1
2.给tomcat文件加执行权限
[root@tomcat ~]# chmod a+x tomcat
3.把tomcat放到/usr/bin目录下
[root@tomcat ~]# mv tomcat /usr/bin
4.使用
[root@tomcat ~]# tomcat stop 停止
[root@tomcat ~]# tomcat start 启动
```
## 五Tomcat多实例
#### 1.简介
多实例运行不同的应用(类似虚拟主机)
多实例运行相同的应用(实现负载均衡)
#### 2.多实例部署
在一个工作目录下创建多实例目录
```shell
instance1: mdkir -pv /usr/local/tomcat/instance1/{conf,logs,temp,work} 8081 8091
instance2: mdkir -pv /usr/local/tomcat/instance2/{conf,logs,temp,work} 8082 8092
instance3: mdkir -pv /usr/local/tomcat/instance3/{conf,logs,temp,work} 8083 8093
```
创建多实例目录,根据实例多少确定
分别创建目录instance1 instance2 instance3拷贝原来的conf,log,temp,work到3个目录下
```shell
[root@www ~]# tree -d -L 2 /usr/local/tomcat/
/usr/local/tomcat/
├── bin
├── instance1
│   ├── conf
│   ├── logs
│   ├── temp
│   └── work
├── instance2
│   ├── conf
│   ├── logs
│   ├── temp
│   └── work
├── instance3
│   ├── conf
│   ├── logs
│   ├── temp
│   └── work
└── lib
```
拷贝原来单实例的webapps到/下(/usr/local/tomcat/webapps 路径可以自定义,但要和配置文件
```shell
[root@www ~]# cp -r /usr/local/tomcat/webapps /
```
配置实例server.xml
```shell
[root@www ~]# vim /usr/local/tomcat/instance1/conf/server.xml
<Server port="8091" shutdown="SHUTDOWN"> //修改8005
<Connector port="8081" protocol="HTTP/1.1" //修改8080
connectionTimeout="20000"
redirectPort="8443" />
删除8009的配置
<Host name="localhost" appBase="/webapps" //修改网站基准目录
unpackWARs="true" autoDeploy="true">
......
```
脚本内容这个脚本在每个实例中都要有 启动tomcat实例
```
[root@www ~]# vim /usr/local/tomcat/instance1/ins1.sh
#!/bin/bash
. /etc/init.d/functions
export CATALINA_BASE="/usr/local/tomcat/instance1"
export CATALINA_HOME="/usr/local/tomcat"
case $1 in
start)
$CATALINA_HOME/bin/startup.sh
;;
stop)
$CATALINA_HOME/bin/shutdown.sh
;;
restart)
$CATALINA_HOME/bin/shutdown.sh
sleep 5
$CATALINA_HOME/bin/startup.sh
;;
esac
```
启动测试
```shell
[root@www ~]# /usr/local/tomcat/instance1/ins1.sh start
[root@www ~]# /usr/local/tomcat/instance2/ins2.sh start
[root@www ~]# /usr/local/tomcat/instance3/ins3.sh start、
[root@www ~]# ss -tnlp |grep :80
LISTEN 0 100 :::8081 :::* users:(("java",pid=7288,fd=48))
LISTEN 0 100 :::8082 :::* users:(("java",pid=7468,fd=48))
LISTEN 0 100 :::8083 :::* users:(("java",pid=7496,fd=48))
LISTEN 0 1 ::ffff:127.0.0.1:8091 :::* users:(("java",pid=7288,fd=61))
LISTEN 0 1 ::ffff:127.0.0.1:8092 :::* users:(("java",pid=7468,fd=61))
LISTEN 0 1 ::ffff:127.0.0.1:8093 :::* users:(("java",pid=7496,fd=61))
```
访问测试
<img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20230519000724259.png" alt="image-20230519000724259" style="zoom:50%;" />
## 六Tomcat负载均衡
#### 1.Nginx配置
```shell
[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
这个地方是 地址池,这里包含了后端服务器的地址和端口,这里的名字随便启。
http {
upstream tomcat_pool {
#ip_hash; 最大失败次数 失败超时时间
server 192.168.122.105:8081 weight=1 max_fails=2 fail_timeout=2;
server 192.168.122.105:8082 weight=1 max_fails=2 fail_timeout=2;
server 192.168.122.105:8083 weight=1 max_fails=2 fail_timeout=2;
server 192.168.122.105:8084 weight=1 max_fails=2 fail_timeout=2;
}
负载均衡的算法: RR round robin session ip_hash 是常用的负载均衡的算法
server {
location / {
proxy_pass http://tomcat_pool;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
```
## 七Tomcat配置ssl
部署tomcat服务项目做到用https访问使用nginx去做访问任意一个子网站都是https
## 八Tomcat扩展
#### 1.日志
```shell
[root@java-tomcat1 ~]# cd /data/application/tomcat/conf/
[root@java-tomcat1 conf]# vim server.xml
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/www/logs"
prefix="jenkins-" suffix="-access_log"
pattern="%{X-Real-IP}i - %v %t &quot;%r&quot; - %s %b %T &quot;%{Referer}i&quot; &quot;%{User-Agent}i&quot; %a &quot;-&quot; &quot;-&quot;" />
```
日志格式参数文件https://tomcat.apache.org/tomcat-8.5-doc/config/valve.html#Access_Logging
#### 2. JVM 参数优化
```shell
[root@java-tomcat1 conf]# cd ../bin/
[root@java-tomcat1 bin]# cp catalina.sh catalina.sh.bak
[root@java-tomcat1 bin]# vim catalina.sh
JAVA_OPTS="$JAVA_OPTS -Xms4096m -Xmx4096m -XX:PermSize=1024m -XX:MaxPermSize=2048m"
```
设置初始堆、非堆内存大小以及年轻代
```shell
-Xms50m -Xmx200m -XX:PermSize=30m -XX:MaxPermSize=60m
-Xloggc:eclipse_gc.log (设置垃圾回收日志打印的文件,文件名称可以自定义)
-XX:+PrintGCTimeStamps (打印垃圾回收时间信息时的时间格式)
-XX:+PrintGCDetails (打印垃圾回收详情)
-XX:PermSize设置永久代(perm gen)初始值。默认值为物理内存的1/64。
-XX:MaxPermSize设置持久代最大值。物理内存的1/4。
-Xms初始堆大小默认为物理内存的1/64(<1GB)
-Xmx最大堆大小
-Xmn新生代的内存空间大小
```
#### 3.gc日志
阅读GC日志我们可以了解Java虚拟机内存分配与回收策略开发使用
```shell
# vim catalina.sh
JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data/logs/gc-%t.log"
```
![image-20230519001618185](https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20230519001618185.png)
## 九:项目实战
#### 1.jar包项目
#### 2.war包项目

48
java Normal file
View File

@ -0,0 +1,48 @@
一、JVM 虚拟机常识
作为了解JVM 虚拟机的开始。我们很有必要弄明白以下两个问题。
1.什么是JAVA虚拟机
所谓虚拟机就是一台虚拟的计算机。他是一款软件用来执行一系列虚拟计算机指令。大体上虚拟机可以分为系统虚拟机和程序虚拟机。大名鼎鼎的VisualBox、VMware就属于系统虚拟机。他们完全是对物理计算机的仿真。提供了一个可以运行完整操作系统的软件平台。
程序虚拟机的典型代表就是Java虚拟机它专门为执行单个计算机程序而设计在Java虚拟机中执行的指令我们称为Java字节码指令。无论是系统虚拟机还是程序虚拟机在上面运行的软件都限制于虚拟机提供的资源中。
2.JAVA 如何做到跨平台
同一个JAVA程序(JAVA字节码的集合)通过JAVA虚拟机(JVM)运行于各大主流操作系统平台
比如Windows、CentOS、Ubuntu等。程序以虚拟机为中介来实现跨平台。
3.虚拟机基本结构
我们要对JVM虚拟机的结构有一个感性的认知。毕竟我们不是编程人员认知程度达不到那么深入。
1)、类加载子系统
负责从文件系统或者网络中加载Class信息加载的类信息存放于一块称为方法区的内存空间。除了类信息外方法区中可能还会存放运行时常量池信息包括字符串字面量和数字量。
2)、Java堆
在虚拟机启动的时候建立它是Java程序最主要的内存工作区域。几乎所有的Java对象实例都放Java堆中。堆空间是所有线程共享的这是一块与Java应用密切相关的内存区间。
3)、Java的NIO库(直接内存)
允许Java程序使用直接内存。直接内存是在Java堆外的、直接向系统申请的内存区间。通常访问直接内存的速度会优于Java堆。因此出于性能考虑读写频繁的场合可能会考虑使用直接内存。由于直接内存在Java堆外因此它的大小不会受限于Xmx指定的最大堆大小。但是系统内存是有限的Java堆和直接内存的总和依然受限于操作系统能给出的最大内存。
JAVA写一个项目 服务器上运行足够的内存100%以上
4)、垃圾回收系统
垃圾回收系统是Java虚拟机的重要组成部分垃圾回收器可以对方法区、Java堆和直接内存进行回收。
5)、Java栈
每一个Java虚拟机线程都有一个私有的Java栈。一个线程的Java栈在线程创建的时候被创建。Java保存着帧信息Java栈中保存着局部变量、方法参数同时和Java方法的调用、返回密切相关。
4.虚拟机堆内存结构
JVM中堆空间可以分成三个大区年轻代、老年代、永久代(方法区)。
新生代(年轻代):新生区
类在这里产生和应用最后被垃圾回收。所有的类在伊甸区被new出来当伊甸区满了GC会对该区不用的对象销毁剩余有用的转到幸存区。
老年代:老年区(养老区)
用于存放生成周期比较长的对象。
永久代:永久区
存放JDK自带的class,interface。