企业级WEB应用服务器TOMCAT

php运行依赖于php的解释器,fastcgi协议包括配套nginx。

java运行依赖配套环境TOMCAT。

JDK与JRE关系
JRE(指java运行时环境)=JVM虚拟机+JAVA核心类库
JDK:包含JRE和对源代码进行编译的工具
JAVA代码用JDK里面的工具编译转换成字节码,通过JVM虚拟机配合JAVA核心库的工具转换成机器码
JDK里面包含JAVAC,用于编译源代码
如:JAVAC.hello.java
生成hello.class文件
安装openjdk
ubuntu安装JDK:
[root@ubuntu2004 ~]#apt -y install openjdk-8-jdk
rocky安装JDK:
[root@rocky ~]#yum -y install java-8-openjdk
安装oracle官方JDK
#注意需要注册登录后,才能下载JDK
https://www.oracle.com/java/technologies/downloads/#java8 https://www.oracle.com/java/technologies/downloads/#java11 https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

把包下载下来,可离线脚本安装
[root@ubuntu2004 ~]#ls
install_jdk.sh  jdk-8u341-linux-x64.tar.gz
[root@ubuntu2004 ~]#cat install_jdk.sh 
#!/bin/bash

JDK_FILE="jdk-8u341-linux-x64.tar.gz"
#JDK_FILE="jdk-11.0.15.1_linux-x64_bin.tar.gz"
#JDK_FILE="jdk-11.0.12_linux-x64_bin.tar.gz"
#JDK_FILE="jdk-8u301-linux-x64.tar.gz"


JDK_DIR="/usr/local"

DIR=`pwd`

color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$2" && $MOVE_TO_COL
    echo -n "["
    if [ $1 = "success" -o $1 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $1 = "failure" -o $1 = "1"  ] ;then
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo                                                                                                                              
}

install_jdk(){
if !  [  -f "$DIR/$JDK_FILE" ];then
	color 1  "$JDK_FILE 文件不存在" 
	exit; 
elif [ -d $JDK_DIR/jdk ];then
        color 1  "JDK 已经安装" 
	exit
else 
        [ -d "$JDK_DIR" ] || mkdir -pv $JDK_DIR
fi
tar xvf $DIR/$JDK_FILE  -C $JDK_DIR
cd  $JDK_DIR && ln -s jdk* jdk 

cat >  /etc/profile.d/jdk.sh <<EOF
export JAVA_HOME=$JDK_DIR/jdk
export PATH=\$PATH:\$JAVA_HOME/bin
#export JRE_HOME=\$JAVA_HOME/jre
#export CLASSPATH=.:\$JAVA_HOME/lib/:\$JRE_HOME/lib/
EOF
.  /etc/profile.d/jdk.sh
java -version && color 0  "JDK 安装完成" || { color 1  "JDK 安装失败" ; exit; }

}

install_jdk
[root@ubuntu2004 ~]#bash install_jdk.sh
退出重进查看版本
[root@ubuntu2004 ~]#java -version
java version "1.8.0_341"
Java(TM) SE Runtime Environment (build 1.8.0_341-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.341-b10, mixed mode)
安装完成

TOMCAT

war包需要跑在tomcat上,两者跑在JDK(java虚拟机)上。

jar包可以直接跑在JDK(java虚拟机)上。jar包=war包+tomcat

http://tomcat.apache.org/
安装TOMCAT
ubuntu包安装tomcat9
[root@ubuntu2004 ~]#apt -y install tomcat9 tomcat9-admin tomcat9-docs tomcat9-examples
[root@ubuntu2004 ~]#ss -ntl
State   Recv-Q     Send-Q     Local Address:Port      Peer Address:Port    Process
LISTEN     0        100            *:8080                     *:*
二进制安装TOMCAT
下载并安装
注意:安tomcat前必须先部署JDK
官方和镜像站点下载:
https://tomcat.apache.org/download-80.cgi https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/

[root@ubuntu2004 ~]#wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat- 8/v8.5.50/bin/apache-tomcat-8.5.50.tar.gz
[root@ubuntu2004 ~]#tar xf apache-tomcat-9.0.65.tar.gz -C /usr/local/
[root@ubuntu2004 ~]#cd /usr/local/
[root@ubuntu2004 local]#ls
apache-tomcat-9.0.65  bin  etc  games  include  jdk  jdk1.8.0_341  lib  man  sbin  share  src
[root@ubuntu2004 local]#ln -s apache-tomcat-9.0.65 tomcat
[root@ubuntu2004 local]#cd tomcat
[root@ubuntu2004 tomcat]#ls
bin           conf             lib      logs    README.md      RUNNING.txt  webapps
BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  RELEASE-NOTES  temp         work
官方提供了两个安装脚本,可用官方提供脚本进行安装
[root@ubuntu2004 tomcat]#cd bin (脚本是startup.sh和catalina.sh)
选择用startup.sh进行安装,安装脚本在bin里面,使用不方便,可以把bin写入PATH变量

[root@ubuntu2004 bin]#echo PATH='/usr/local/tomcat/bin:$PATH' > /etc/profile.d/tomcat.sh
[root@ubuntu2004 bin]#. /etc/profile.d/tomcat.sh  生效
[root@ubuntu2004 bin]#echo $PATH
/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/jdk/bin
不用写路径就可以运行了
[root@ubuntu2004 bin]#startup.sh    运行脚本
[root@ubuntu2004 bin]#ss -ntl       查看端口号   同时打开了800和8080端口
去网页访问10.0.0.101:8080            显示一只猫的页面
启动tomcat:startup.sh
关闭tomcat:shutdown.sh

查看日志:
[root@ubuntu2004 bin]#ls /usr/local/tomcat/logs
catalina.2022-09-27.log  host-manager.2022-09-27.log  localhost_access_log.2022-09-27.txt
catalina.out             localhost.2022-09-27.log     manager.2022-09-27.log

[root@ubuntu2004 tomcat]#ls
bin           conf             lib      logs    README.md      RUNNING.txt  webapps
BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  RELEASE-NOTES  temp         work
存放网站目录的文件夹是ROOT
[root@ubuntu2004 ROOT]#ls                 
asf-logo-wide.svg  bg-middle.png  bg-upper.png  index.jsp   tomcat.css  WEB-INF
bg-button.png      bg-nav.png     favicon.ico   RELEASE-NOTES.txt  tomcat.svg
index.jsp就是默认页面(动态资源),可以自己写一个页面(静态页面)
[root@ubuntu2004 ROOT]#cat test.html 
<h1>M50 tomcat website </h1>
访问页面:10.0.0.101:8080/test.html  
M50 tomcat website    这并不是tomcat最擅长的,他最擅长的是跑java服务
配置TOMCAT自启动的service文件
创建tomcat专用账户
useradd -r -s /sbin/nologin tomcat
准备service文件中相关的环境变量
vim /usr/local/tomcat/conf/tomcat.conf
cat /usr/local/tomcat/conf/tomcat.conf
两个变量至少设置一项才能启动 tomcat
JAVA_HOME=/usr/local/jdk #JRE_HOME=/usr/local/jdk/jre
#如果不指定上面变量,/var/log/messages文件中会出现下面无法启动错误提示
Mar 15 14:30:09 centos8 startup.sh[1530]: Neither the JAVA_HOME nor the JRE_HOME environment variable is defined Mar 15 14:30:09 centos8 startup.sh[1530]: At least one of these environment variable is needed to run this program

chown -R tomcat.tomcat /usr/local/tomcat/
创建tomcat.service文件
vim /lib/systemd/system/tomcat.service
cat /lib/systemd/system/tomcat.service
[Unit] Description=Tomcat 
#After=syslog.target network.target remote-fs.target nss-lookup.target After=syslog.target network.target

[Service] 
Type=forking
#以下二选一
EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
#或者,如果没有创建上面的/usr/local/tomcat/conf/tomcat.conf文件,可以加下面一行也可
Environment=JAVA_HOME=/usr/local/jdk
ExecStart=/usr/local/tomcat/bin/startup.sh 
ExecStop=/usr/local/tomcat/bin/shutdown.sh 
PrivateTmp=true 
User=tomcat 
Group=tomcat 
[Install] 
WantedBy=multi-user.target

systemctl daemon-reload
systemctl enable --now tomcat
systemctl status tomcat
TOMCAT和JDK一键安装脚本、自启动
先去官网下载JDK和TOMCAT安装包,把下载的安装包拖进LINUX,然后执行脚本
[root@ubuntu2004 ~]#ls
apache-tomcat-9.0.65.tar.gz  install_tomcat.sh  jdk-8u341-linux-x64.tar.gz  snap
[root@ubuntu2004 ~]#cat install_tomcat.sh 
#!/bin/bash

JDK_FILE="jdk-8u341-linux-x64.tar.gz"
#JDK_FILE="jdk-11.0.14_linux-x64_bin.tar.gz"
#JDK_FILE="jdk-8u281-linux-x64.tar.gz"
TOMCAT_FILE="apache-tomcat-9.0.65.tar.gz"
#TOMCAT_FILE="apache-tomcat-9.0.59.tar.gz"
#TOMCAT_FILE="apache-tomcat-8.5.64.tar.gz"
JDK_DIR="/usr/local"
TOMCAT_DIR="/usr/local"
DIR=`pwd`

color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$2" && $MOVE_TO_COL
    echo -n "["
    if [ $1 = "success" -o $1 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $1 = "failure" -o $1 = "1"  ] ;then
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo                                                                                                                              
}



install_jdk(){
if !  [  -f "$DIR/$JDK_FILE" ];then
    color 1 "$JDK_FILE 文件不存在" 
    exit; 
elif [ -d $JDK_DIR/jdk ];then
    color 1  "JDK 已经安装" 
    exit
else 
    [ -d "$JDK_DIR" ] || mkdir -pv $JDK_DIR
fi
tar xvf $DIR/$JDK_FILE  -C $JDK_DIR
cd  $JDK_DIR && ln -s jdk* jdk 

cat >  /etc/profile.d/jdk.sh <<EOF
export JAVA_HOME=$JDK_DIR/jdk
export PATH=\$PATH:\$JAVA_HOME/bin
#export JRE_HOME=\$JAVA_HOME/jre
#export CLASSPATH=.:\$JAVA_HOME/lib/:\$JRE_HOME/lib/
EOF
.  /etc/profile.d/jdk.sh
java -version && color 0 "JDK 安装完成" || { color 1  "JDK 安装失败" ; exit; }

}

install_tomcat(){
if ! [ -f "$DIR/$TOMCAT_FILE" ];then
    color 1 "$TOMCAT_FILE 文件不存在" 
    exit; 
elif [ -d $TOMCAT_DIR/tomcat ];then
    color 1 "TOMCAT 已经安装" 
    exit
else 
    [ -d "$TOMCAT_DIR" ] || mkdir -pv $TOMCAT_DIR
fi
tar xf $DIR/$TOMCAT_FILE -C $TOMCAT_DIR
cd  $TOMCAT_DIR && ln -s apache-tomcat-*/  tomcat
echo "PATH=$TOMCAT_DIR/tomcat/bin:"'$PATH' > /etc/profile.d/tomcat.sh
id tomcat &> /dev/null || useradd -r -s /sbin/nologin tomcat

cat > $TOMCAT_DIR/tomcat/conf/tomcat.conf <<EOF
JAVA_HOME=$JDK_DIR/jdk
EOF

chown -R tomcat.tomcat $TOMCAT_DIR/tomcat/

cat > /lib/systemd/system/tomcat.service  <<EOF
[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target 

[Service]
Type=forking
EnvironmentFile=$TOMCAT_DIR/tomcat/conf/tomcat.conf
ExecStart=$TOMCAT_DIR/tomcat/bin/startup.sh
ExecStop=$TOMCAT_DIR/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now tomcat.service &> /dev/null
systemctl is-active tomcat.service &> /dev/null &&  color 0 "TOMCAT 安装完成" || { color 1 "TOMCAT 安装失败" ; exit; }

}

install_jdk 

install_tomcat
[root@ubuntu2004 ~]#bash install_tomcat.sh
JDK 安装完成                                               [  OK  ]
TOMCAT 安装完成                                            [  OK  ]
查看端口号 ss -ntl    8080   8005  
去网页访问10.0.0.101:8080   显示一只猫
数据存放在 /usr/local/tomcat
tomcat的文件结构和组成

目录结构

目录

说明

bin

服务启动、停止等相关程序和文件

conf

配置文件

lib

库目录

logs

日志目录

webapps

应用程序,应用部署目录

work

jsp编译后的结果文件,建议提前预热访问,升级应用后,删除此目录数据才能更新

配置文件:

文件名

说明

server.xml

主配置文件

web.xml

每个webapp只有“部署”后才能被访问,它的部署方式通常由web.xml进行 定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认 部署相关的配置,每个web应用也可以使用专用配置文件,来覆盖全局文件

context.xml

用于定义所有web应用均需加载的Context配置,此文件为所有的 webapps提供默认配置,每个web应用也可以使用自已专用的配置,它通 常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中, 覆盖全局的文件

tomcat-users.xml

用户认证的账号和密码文件

catalina.policy

当使用security选项启动tomcat时,用于为tomcat设置安全策略

catalina.properties

Tomcat 环境变量的配置,用于设定类加载器路径,以及一些与JVM调优相 关参数

logging.properties

Tomcat 日志系统相关的配置,可以修改日志级别和日志路径等

TOMCAT组件

名称

说明

server

服务器,Tomcat 运行的进程实例,一个Server中可以有多个service,但通常就一 个

service

服务,用来组织Engine和Connector的对应关系,一个service中只有一个Engine

connector

连接器,负责客户端的HTTP,HTTPS,AJP等协议连接.一个Connector只属于某 一个Engine

engine

即引擎,用来响应并处理用户请求.一个Engine上可以绑定多个Connector

host

即虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分

context

应用的上下文,配置特定url路径映射和目录的映射关系:url => directory

TOMCAT处理请求过程
假设来自客户的请求为:http://localhost:8080/test/index.jsp

浏览器端的请求被发送到服务端端口8080,Tomcat进程监听在此端口上.通过侦听的HTTP/1.1 Connector获得此请求.
Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的响应 Engine获得请求localhost:8080/test/index.jsp,遍历它所有虚拟主机Host 
Engine匹配到名为localhost的Host.如果匹配不到,就把请求交给该Engine中的defaultHost处理 
localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context 
Host匹配到路径为/test的Context 
path=/test的Context获得请求index.jsp,在它的mapping table中寻找对应的servlet 
Context匹配到URL PATTERN为 *.jsp 的servlet,对应于JspServlet类构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法.
Context把执行完了之后的HttpServletResponse对象返回给Host 
Host把HttpServletResponse对象返回给Engine 
Engine把HttpServletResponse对象返回给Connector 
Connector把HttpServletResponse对象返回给浏览器端
TOMCAT访问日志定义成json格式
访问日志由server配置文件的日志格式定义,不是json格式,需要改成json格式
vim /usr/local/tomcat/conf/server.xml
把pattern="%h %l %u %t "%r" %s %b" />  替换成
pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/>
改完重启tomcat,两种重启方式
startup.sh               
systemctl restart tomcat   两种不能串用
启动之后查看日志:tail -f /usr/local/tomcat/logs/localhost_access_log.2022-09-27.txt
{"clientip":"10.0.0.1","ClientUser":"-","authenticated":"-","AccessTime":"[27/Sep/2022:15:51:46 +0800]","method":"GET / HTTP/1.1","status":"200","SendBytes":"11230","Query?string":"","partner":"-","AgentVersion":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"}

可把json格式用jq转换
apt install jq  安装jq
写一个文件
cat a.txt,把json日志贴进去
cat a.txt |jq               用jq处理
{
  "clientip": "10.0.0.1",
  "ClientUser": "-",
  "authenticated": "-",
  "AccessTime": "[27/Sep/2022:15:51:46 +0800]",
  "method": "GET / HTTP/1.1",
  "status": "200",
  "SendBytes": "11230",
  "Query?string": "",
  "partner": "-",
  "AgentVersion": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"
}