Web集群服务-Tomcat

时间:2024-10-23 12:56:31

1. Java容器

用于存放与运行java代码的环境

java容器 说明
Tomcat 最常用,较重,功能完善.
Jetty 轻量,功能较少.
Weblogic 用于Oracle数据库环境使用,Weblogic属于甲骨文
东方通 国产java容器

2. JVM-JRE-JDK

1. JVM:  java 虚拟机中,运行java代码的地方

2. JRE:java运行环境 . 提供jvm环境,java命令

3. JDK:  java开发环境 , jvm+jre+额外功能

3. 部署JDK

##配置JAVA环境变量,这里是是二进制安装需要配置(yum安装或rpm包方式安装就不需要配置)
mkdir -p /app/tools/   #创建目录
tar xf jdk-8u351-linux-x64.tar.gz -C /app/tools/   ##解压到指定目录
ln -s /app/tools/jdk1.8.0_351/  /app/tools/jdk    ##创建软连接
vim /etc/profile   ##配置环境变量
export JAVA_HOME=/app/tools/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
source /etc/profile ##生效
java -version ##查看版本

4. 部署tomcat

##上传软件包
tar xf apache-tomcat-9.0.52.tar.gz -C /app/tools/ ##解压到指定目录
ln -s /app/tools/apache-tomcat-9.0.52/ /app/tools/tomcat  ##创建软连接
/app/tools/tomcat/bin/version.sh   ##检查jdk,tomcat信息

5. 启动tomcat

/app/tools/tomcat/bin/startup.sh  ##启动
##查看端口和进程
ss -lntup|grep java
ps -ef |grep java

 6. Tomcat目录结构

6.1 目录概述

目录 说明
bin 存放tomcat管理命令
conf tomcat配置文件
lib 依赖与库文件,插件文件
logs 日志目录
webapps 站点目录
work tomcat运行java代码的存放代码的目录

6.2 bin

bin目录 说明
statrup.sh 启动脚本
shutdown.sh 关闭脚本
catalina.sh 核心脚本,配置tomcat优化,jvm优化

6.3 conf

conf配置文件 说明
server.xml tomcat配置文件
web.xml 配置文件,辅助配置

6.4 logs日志

logs目录 说明
catalina.out

tomcat应用日志,启动过程,关闭,错误信息

catalina.2024-10-20.log catalina.out的切割日志.按照每天进行切割
localhost_access_log.2024-10-20.txt 访问日志,未来可以重新定义名字和内容

6.5 webapps

1.站点目录

2.war包,自动解压,自动部署

7. Tomcat日常管理

7.1书写systemctl管理配置文件进行管理 日常启动与维护

systemctl配置文件的结构 说明
[Unit] 指定注释信息,依赖(先后顺序)
Description 说明与注释
After 在这里指定的服务之后运行. network.target
[Service] 用于指定服务开启命令,关闭命令,重启命令
Type=notify 指定类型 simple 或forking即可
ExecStart 服务启动命令
ExecStop 服务关闭命令
ExecReload 重启命令
EnvironmentFile 配置环境变量的文件(一般对于编译安装,二进制安装需要加上)
[Install] 内容固定,用于指定运行级别
WantedBy=multi-user.target 运行级别,一般都是多用户模式

7.2 tomcat systemctl 配置

#systemctl配置
vim  /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat Java Web Container
After=network.target
[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/tomcat
ExecStart=/app/tools/tomcat/bin/startup.sh
ExecStop=/app/tools/tomcat/bin/shutdown.sh
ExecReload=/app/tools/tomcat/bin/startup.sh && /app/tools/tomcat/bin/shutdown.sh
[Install]
WantedBy=multi-user.target

##环境变量配置
vim  /etc/sysconfig/tomcat
JAVA_HOME=/app/tools/jdk
PATH=$JAVA_HOME/bin/:$JAVA_HOME/jre/bin:/usr/bin/:/usr/sbin/:/usr/local/bin/:/usr/local/sbin/
CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar

##加载
systemctl daemon-reload
##启动
ststemctl start tomcat

8. 运行代码

1. 开发人员书写的java代码: java源代码,无法直接部署tomcat中

2. 需要对源代码进行编译: 生成war包或jar包 

如何运行java相关软件包 说明
war包

需要放在java容器中运行,比如放到tomcat的webapps目录下.

(tomcat会自动加载与运行 war包内容)

jar包 不需要java容器,内置tomcat,只需要jdk ,通过java -jar xxx.jar 运行

如何编译java源代码:

通过maven,Gradle把java源代码,编译生成war包或jar包.

war包案例,运行memtest.war包案例,放在webapps目录,然后访问即可

 jar包案例,运行指定的jar包(nginxwebUI)
yum install -y nginx  ##安装nginx
mkdir -p /home/nginxWebUI/ #创建目录
wget -O /home/nginxWebUI/nginxWebUI.jar
https://gitee.com/cym1102/nginxWebUI/releases/download/4.2.4/nginxWebUI-4.2.4.jar ##将来可以把jar包放在指定目录下
java -jar -Dfile.encoding=UTF-8 /home/nginxWebUI/nginxWebUI.jar --server.port=8888 --project.home=/home/nginxWebUI/ >/dev/null &  ##访问端口是8888,定向到空并后台运行

9. Tomcat管理端

##修改配置文件 
vim /app/tools/tomcat/conf/tomcat-users.xml
<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">
 <role rolename="manager-gui"/>
 <role rolename="admin-gui"/>
 <user username="tomcat" password="1" roles="manager-gui,admin-gui"/> ##用户名tomcat 密码:1
</tomcat-users>
##修改代码
cd /app/tools/tomcat/webapps/
sed  -i 's#127#\\d+#g' ./host-manager/META-INF/context.xml  ./host-manager/WEB-INF/manager.xml  ./manager/META-INF/context.xml

输入用户名密码登录管理端 

10. 配置文件

/tomcat/conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
## 8005 shutdown端口,连接这个端口输入shutdown字符,就可以关闭Tomcat.
     <GlobalNamingResources> ##配置 管理端认证功能
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
   </GlobalNamingResources>
   <Connector port="8080" protocol="HTTP/1.1"  ###8080 处理用户的http请求的
               connectionTimeout="20000"
               redirectPort="8443" />   ##这里的8443是用于处理 https请求.
    <Engine name="Catalina" defaultHost="localhost">  ##engine部分,指定默认的虚拟主机
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps"  ## 指定localhost作为默认的虚拟主机
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
</Server>
区别 tomcat nginx
虚拟主机 Host部分 server {}
域名 name="域名" server_name
端口 Connector部分 port="8080" listen 80
站点目录 appBase="webapps" root /app/code/blog
自动解压 unpackWARs="true"
自动部署 autoDeploy="true" 加载到jvm中
日志目录 <value 部分directory=logs> access_log /var/log/nginx/access.log main;
日志格式 <value  部分parten=> log_format main

11. Tomcat部署zrlog应用

##先修改主机host部分
<Host name="zrlog.oldboylinux.cn"  appBase="webapps"
      unpackWARs="true" autoDeploy="true"

11.1 数据库

##在10.0.0.51 mariadb数据库
grant all on zrlog.* to 'zrlog' @'172.16.1.%' identified by '1';  ##创建用户
show databases ;
select user,host from mysql.user;

11.2 部署代码

##改名为zrlog.war后 移动到webapps目录
[root@tomcat_web01 ~]# ll /app/tools/tomcat/webapps/
total 11336
drwxr-x--- 15 root root     4096 Oct 20 13:44 docs
drwxr-x---  7 root root       99 Oct 20 13:44 examples
drwxr-x---  6 root root       79 Oct 20 13:44 host-manager
drwxr-x---  6 root root      114 Oct 20 13:44 manager
drwxr-x---  3 root root       41 Oct 20 14:38 memtest
-rw-r--r--  1 root root      643 Oct 20 14:37 memtest.war
drwxr-x---  8 root root      111 Oct 20 16:39 ROOT
-rw-r--r--  1 root root 11596673 Oct 20 16:34 zrlog.war
浏览器解析访问:http://zrlog.oldboylinux.cn:8080/zrlog

前台: http: zrlog.oldboylinux.cn:8080/zrlog/

后台管理: http: zrlog.oldboylinux.cn:8080/zrlog/admin/ 

 11.3 接入nginx

#nginx配置文件
server{
 listen 80;
 server_name zrlog.oldboylinux.cn;
 error_log /var/log/nginx/zrlog/error_log notice;
 access_log /var/log/nginx/zrlog/access_log main;
 location /{
   proxy_pass http://127.0.0.1:8080;
   proxy_set_header Host $http_host;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 }

}
nginx -t
systemctl reload nginx

11.4 优化

我们会发现用户访问的时候需要加上路径才可以,http://zrlog.oldboylinux.cn//zrlog​​​​​​,

ROOT 用户访问的时候不加上路径,直接访问文件,就会访问ROOT下面的内容

应用建议: 把应用war包和目录放在ROOT目录下面即可

或者直接把war包名改为ROOT.war 并将原来的ROOT目录删除即可

12. Tomcat多实例

场景:同一台主机上运行多个tomcat

原因:充分利用服务器资源

12.1 准备多个tomcat

tar xf apache-tomcat-9.0.65.tar.gz 
cp -r apache-tomcat-9.0.65  tomcat-8081
cp -r apache-tomcat-9.0.65  tomcat-8082
mv tomcat-808*  /app/tools/

12.2 修改配置

##修改tomcat-8081
sed  -i 's#8005#8006#g' tomcat-8081/conf/server.xml 
sed  -i 's#8080#8081#g' tomcat-8081/conf/server.xml 
##修改tomcat-8082
sed  -i 's#8005#8007#g' tomcat-8082/conf/server.xml 
sed  -i 's#8080#8082#g' tomcat-8082/conf/server.xml

12.3 手动启动

##手动启动
/app/tools/tomcat-8081/bin/startup.sh
/app/tools/tomcat-8082/bin/startup.sh
##写入内容测试
echo java xzb-tomcat 8082 >/app/tools/tomcat-8082/webapps/ROOT/index.jsp
echo java xzb-tomcat 8081 >/app/tools/tomcat-8081/webapps/ROOT/index.jsp

13. 监控功能

tomcat配置中修改tomcat启动的选项.开启jmx远程监控功能

13.1 步骤

C:\Program Files\Java\jdk1.8.0_201\bin\jconsole.exe

13.2 在windows下,通过jdk连接tomcat(模拟监控软件连接)

C:\Program Files\Java\jdk1.8.0_201\bin\jconsole.exe ##具体看自己jdk的位置

 

13.3 java监控命令

jps -lvm|grep tomcat   ##类似于ps -ef  grep  tomcat

##1. 先过滤出java进程的pid
##2. 查看java进程的线程信息
##3. jstack  1786
##4. 查看java线程状态
jstack  1786 |grep -i state

jmap -heap java-pid ##导出java进程的jvm内存使用情况

14. 搭建前后端分离项目

1. 前端,后端下载的代码是源代码

2. 前端代码需要编译,nodejs环境编译静态资源(html,css,js) >>>>>>nginx中

3. 后端代码java, 通过maven/gradle编译war包/jar包运行

14.1 数据库准备

二进制部署mysql8.0
##准备安装目录
mkdir -p /app/tools/mysql/
##准备数据目录
mkdir -p /app/data/3306/
##安装依赖
yum install -y  ncurses ncurses-devel libaio-devel 
openssl openssl-devel 
##解压到目录中
tar xf mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz  -C /app/tools/mysql/
##创建软连接
cd /app/tools/mysql/
ln -s mysql-8.0.30-linux-glibc2.12-x86_64/ /app/tools/mysql/mysql
###配置文件,创建用户
useradd -s /sbin/nologin  -M mysql
###设置配置文件
vim /etc/my.cnf
[mysqld]
user=mysql  ##用户
basedir=/app/tools/mysql/mysql/  ##安装目录
datadir=/app/data/3306/   ##数据目录
port=3306                      
socket=/tmp/mysql.sock
[client]
socket=/tmp/mysql.sock
##修改目录所有者
chown mysql.mysql /etc/my.cnf
chown -R mysql.mysql /app/data/3306/
#配置PATH环境变量
echo 'export PATH=/app/tools/mysql/mysql/bin:$PATH' >>/etc/profile
source /etc/profile
##检查
mysql -V
##初始化数据库(不需要重复运行,重复运行会报错)
mysqld --initialize-insecure --user=mysql --basedir=/app/tools/mysql/mysql --datadir=/app/data/3306/
##检查
echo $?  ##返回值为0表示成功
#拷贝已经准备好的启动管理文件
cp /app/tools/mysql/mysql/support-files/mysql.server  /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
#开机自启动服务,运行服务
systemctl enable mysqld
systemctl start mysqld
##查看端口
ss -lntup 
##登录
mysql
##进入数据库
mysql
##创建exam数据库并指定字符集.
create database exam charset utf8mb4;
##创建用户
create user exam@'172.16.1.%' identified with mysql_native_password by  '1';
#授权
grant all  on exam.* to exam@'172.16.1.%';
#测试
mysql -uexam  -p1  -h 172.16.1.52  ##-u接用户名,-p接密码,-h接主机地址
##导入数据库文件
mysql   exam  <xzs-mysql.sql

14.2 部署后端

##准备前后端目录
mkdir -p /app/code/exam/{front,backend}
##上传代码目录  xzs-3.0.9-war
##解压
cd /app/code/exam/backend/
##创建配置文件
cat> application-prod.yml<<'EOF'
  logging:
   path: /usr/log/xzs/
   spring:
   datasource:
   url: jdbc:mysql://172.16.1.52:3306/exam?  ##数据库地址  useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&allowMultiQueries=true
    username: exam                             ##数据库用户
    password: 1                               ##数据库密码
    driver-class-name: com.mysql.cj.jdbc.Driver
EOF
##后台启动
java -Duser.timezone=Asia/Shanghai -jar -Dspring.profiles.active=prod  xzs-3.9.0.jar >start1.log 2>&1 &  
##查看是否有8000端口
ss -lntup

##测试与访问

http://10.0.0.9:8000/student    学生端     student     123456

http://10.0.0.9:8000/admin       管理端    admin       123456

14.3 部署前端

##启动nginx,编写配置文件
vim /etc/nginx/conf.d/exam.conf
server{
  listen 80;
  server_name admin.oldboylinux.cn;
  root /app/code/exam/admin;
  location / {
    index index.html;
 }
 location /api/ {
    proxy_pass http://localhost:8000;
 }
}

server{
  listen 80;
  server_name student.oldboylinxu.cn;
  root /app/code/exam/admin;
  location / {
   index index.html;
 } 
  location /api/ {
    proxy_pass http://localhost:8000;
  }
}

##测试访问

http://admin.oldboylinux.cn

http://student.oldboylinxu.cn