1.Tomcat快速入门

1.1 Tomca基本介绍

环境准备
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??—->
image.png
Tomcat是什么-与Nginx的区别

Tomcat是一个web服务,提供动态程序的解析(java),支持静态资源。

企业nginx+tomcat模型—-Nginx适合做前端负载均衡,而lomcat适合做后端应用服务处理。
nginx处理静态资源,tomcat处理动态资源(java),能加速网站的访问和降低访问的延迟。

Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

1.2 Tomcat快速安装


1.2.1 安装jdk

yum install java -y

1.2.2 安装Tomcat

(下载 Tomcat、解压、启动 )
[root@web01 ~]#wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.39/bin/apache-[root@web01 ~]#tomcat-9.0.39.tar.gz
[root@web01 ~]#mkdir /soft<br />[root@web01 ~]#tar xf apache-tomcat-9.0.39.tar.gz -C /soft/<br />[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

1.2.3 配置systemc方式启动

[root@lb01 ~]# systemctl cat nginx 复制过来修改一下

  1. cat >/usr/lib/systemd/system/tomcat.service<<'EOF'
  2. [Unit]
  3. Description=Apache Tomcat Server
  4. After=network.target remote-fs.target nss-lookup.target
  5. [Service]
  6. Type=forking
  7. ExecStart=/soft/tomcat/bin/startup.sh
  8. ExecStop=/soft/tomcat/bin/shutdown.sh
  9. ExecSRetart=/soft/tomcat/bin/startup.sh && sleep2 && /soft/tomcat/bin/shutdown.sh
  10. [Install]
  11. WantedBy=multi-user.target
  12. EOF

[root@web03 ~]# systemctl daemon-reload [root@web03 ~]#systemctl enable tomcat Created symlink from /etc/systemd/system/multi-user.target.wants/tomcat.service to /usr/lib/systemd/system/tomcat.service.

1.3 配置文件

1.3.1 配置文件

  1. tomcat软件目录结构:
  2. bin ---主要包含启动和关闭tomcat的脚本(启停java脚本依赖jar包文件)
  3. conf ---tomcat配置文件的目录(站点配置:server.xml)
  4. lib ---tomcat运行时需要加载的jar
  5. logs ---tomcat日志存放位置
  6. temp ---tomcat临时存放文件路径
  7. webapps ---tomcat默认站点目录
  8. work ---tomcat运行时产生的缓存文件

配置文件详解——-> tomcat/conf/server.xml server.xml

1.4 虚拟主机

image.png

  1. cat tomcat/conf/server.xml
  2. ...
  3. <!--diy.etiantian.org-->
  4. <Host name="diy.etiantian.org" appBase="/code/tomcat/diy"
  5. unpackWARs="true" autoDeploy="true">
  6. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
  7. prefix="diy_access_log" suffix=".txt"
  8. pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  9. </Host>
  10. ...

[root@web01 ]# systemctl stop tomcat [root@web01 ]# systemctl start tomcat [root@web01 ]# mkdir /code/tomcat/diy/ROOT -p [root@web01 ]# echo “tomcat-diy” > /code/tomcat/diy/ROOT/index.html 解析host 浏览器访问

1.4.1 Tomcat HTTP请求过程

image.png
Ps: tomcat中Context的作用:

  1. ...
  2. <Host >
  3. <!--访问/tt这个uri,上 / code/tt中获取页面资源,不存在该目录会报错-->
  4. <Context docBase=" / code/tt" path="/tt" reloadable="true" />
  5. </Host>
  6. ...
  7. context作用:----> 类似于nginx中的alias

用户发出一个请求,如http://tomcat.oldxu.com:8080/index.jsp Connector发现是http/1.1协议,而且还是8080端口,于是就把请求接收后交给符合条件的Engine Engine通过请求中的主机名tomcat.oldxu.com查找满足条件的虚拟主机(Host) 找到后就去此虚拟主机指定的appBase(代码存放的目录)最后将解析产生的结果返回给用户。


1.5 Tomcat管理页面

50. Tomcat 集群部署 - 图4

  1. Tomcat自带的管理页面
  2. 管理功能
  3. 监控功能
  4. 1.所有的管理页面,都将权限赋予给了角色,而角色的名称是固定的: manager-gui admin-gui
  5. 2.需要添加一个用户,将用户捆绑至对应的角色,这样用户就可以访问到对应的页面
  6. [root@web01 ROOT]# vim /soft/tomcat/conf/tomcat-users.xml
  7. ...
  8. <role rolename="manager-gui"/>
  9. <role rolename="admin-gui"/>
  10. <user username="tomcat" password="123456" roles="manager-gui,admin-gui"/>
  11. </tomcat-users>
  12. 3.由于项目默认允许127.0.0.1访问,所以配置好了角色和用户也无法正常访问:
  13. [root@web01 ROOT]# vim /soft/tomcat/webapps/host-manager/META-INF/context.xml
  14. [root@web01 ROOT]# vim /soft/tomcat/webapps/manager/META-INF/context.xml
  15. 默认状态,
  16. <Valve className="org.apache.catalina.valves.RemoteAddrValve"
  17. allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
  18. 修改后的状态:10\.0\.0\.\d
  19. <Valve className="org.apache.catalina.valves.RemoteAddrValve"
  20. allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.0\.0\.\d+|" />
  21. 4. 重启tomcat并访问

image.png image.png

*1.6 Tomcat部署zrlog项目

  1. 定义虚拟主机 ```javascript vim /soft/tomcat/conf/server.xml …

  1. > 自定义日志格式:
  2. > ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1581532/1605016661746-158fb21c-30d1-4c48-82f7-2ef9fe0f6f5e.png#align=left&display=inline&height=255&margin=%5Bobject%20Object%5D&name=image.png&originHeight=509&originWidth=696&size=127299&status=done&style=none&width=348)
  3. >
  4. 2. **上传war包至指定目录**
  5. ```javascript
  6. [root@web01 conf]# mkdir /zrlog
  7. [root@web01 conf]# ll /zrlog/
  8. 总用量 11316
  9. -rw-r--r-- 1 root root 11585583 5月 11 11:32 ROOT.war
  1. 重启tomcat应用
    1. [root@web01 conf]# /soft/tomcat/bin/shutdown.sh
    2. [root@web01 conf]# /soft/tomcat/bin/startup.sh

    1.在/zrlog目录下的解压.war包 2.自动部署ROOT.war包 (自动生成ROOT目录)

  1. 检查是否部署ok ```javascript [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
  1. 5. **配置远程数据库连接**
  2. ```javascript
  3. MariaDB [(none)]> create database zrlog charset utf8;
  4. MariaDB [(none)]> grant all privileges on *.* to 'all'@'%' identified by 'xxxxxx';

**

  1. 访问zrlog站点

image.png
**

1.7 JAVA基础知识[了解]

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包依赖运行) 可独立运行


2. Tomcat集群实战

2.1 tomcat集群架构图解

50. Tomcat 集群部署 - 图8

lb01 10.0.0.6 **172.16.1.6 **
web1 172.16.1.7
web2 172.16.1.8
其他后端节点
  1. 安装tomcat

[root@web02 ~]# yum install java -y

  1. 拷贝代码和文件 (注意是在web01节点操作的)

[root@web01 ~]# scp -rp /soft 10.0.0.8:/
[root@web01 ~]# scp -rp /zrlog 10.0.0.8:/
[root@web01 ~]# scp /usr/lib/systemd/system/tomcat.service 172.16.1.8:/usr/lib/systemd/system/tomcat.service

  1. web02操作如下

[root@web02 ~]# ln -s /soft/apache-tomcat-9.0.34/ /soft/tomcat
[root@web02 ~]# systemctl daemon-reload
[root@web02 ~]# systemctl start tomcat
[root@web02 ~]# systemctl enable tomcat
Created symlink from /etc/systemd/system/multi-user.target.wants/tomcat.service to /usr/lib/systemd/system/tomcat.service.

  1. 共享静态资源

[root@web02 ~]# 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/

重启tomcat
[root@web01 ~]# /soft/tomcat/bin/shutdown.sh && /soft/tomcat/bin/startup.sh

  1. Nginx_proxy

[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_zrlog.oldxu.com.conf

  1. upstream zrlog {
  2. server 172.16.1.7:8080;
  3. server 172.16.1.8:8080;
  4. }
  5. server {
  6. listen 80;
  7. server_name zrlog.oldxu.com;
  8. location / {
  9. proxy_pass http://zrlog; #tomcat启动的java程序,可以直接通过proxy_pass进行负载均衡
  10. include proxy_params;
  11. }
  12. }

为tomcat日志,获取http的Header信息 …

2.2 Tomcat+Nginx+HTTPS

Tomcat单节点 -—【了解项-安装PFX格式证书
**
1.修改tomcat配置: server.xml

  1. 首先需要有证书 ( 必须 )
  2. 将http的默认监听端口8080 修改为 80,redirect至 443
  3. 开启https监听器,配置证书即可。
  4. 将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
[root@nfs ~]# cat /soft/tomcat/conf/server.xml
——-> server_tls.xml

2.1 修改 localhost

  1. <Host name="aliyun.xuliangwei.com" appBase="webapps"

全栈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;
}

2.4 Tomcat+Nginx+Redis会话保持**

多种会话方式:1.ip_hash 2.mysql 3.redis 4.tomcat自带的cluster session复制 ( 官方建议不要超过4个tomcat节点 )

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/WEB2 SESSION ID:" + session.getId() + "<br>");
    out.println("Session created time is :" + session.getCreationTime()
    + "<br>");
    %>
</body>


3.接入负载均衡**
[root@lb01 conf.d]#

cat >/etc/nginx/conf.d/proxy_session.oldxu.com.conf<<'EOF'
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;
    }
}
EOF

无会话保持: image.png

4.接入 TomcatClusterRedisSessionManager
( 参考官方地址: https://github.com/ran-jit/tomcat-cluster-redis-session-manager )

0. wget  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" />

2.5 Tomcat+Nginx+Redis+Java

项目地址: https://gitee.com/mail_osc/wangmarket
—-> 已编译: git clone https://gitee.com/zheguabaoshu/tomcat-project-compilation.git