Tomcat介绍

本文详细介绍了如何使用haproxy实现Tomcat的https,总结了Tomcat的核心组件及根目录结构,展示了如何配置Tomcat实现多虚拟主机,探讨了nginx作为后端负载均衡调度的实现,并简单介绍了memcached的工作原理。
摘要由CSDN通过智能技术生成

一、haproxy https实现

1.1 证书制作

 mkdir /etc/haproxy/certs
 cd /etc/haproxy/certs/ 
 openssl genrsa -out haproxy.key 2048 #生成私钥
 openssl req -x509 -key haproxy.key -out haproxy.crt -subj "/CN=www.magedu.org" #利用私钥生成自签名证书
 cat haproxy.key haproxy.crt > haproxy.pem #指令 crt 后证书文件为PEM格式,需要同时包含证书和所有私钥
 openssl x509 -in haproxy.pem -noout -text #查看证书

1.2haproxy配置

[root@Centos8 certs]# cat /etc/haproxy/conf.d/test.cfg 
frontend web 
  bind 10.0.0.8:80
  bind 10.0.0.8:443 ssl crt /etc/haproxy/certs/haproxy.pem
  redirect scheme https if !{ ssl_fc }
  http-request set-header X-forwarded-Port %[dst_port]
  http-request add-header X-forwarded-Proto https if { ssl_fc }
  mode http
  balance roundrobin

  acl acl_static path_end -i .jpg .jpeg .png .gif .css .js .html
  acl acl_php path_end -i .php
  use_backend mobiles_hosts if acl_static
  use_backend app_hosts if acl_php
  default_backend pc_hosts

  backend mobiles_hosts
    mode http 
    server web1 10.0.0.7:80 weight 1 check inter 3000 fall 2 rise 5
  
  backend app_hosts
    mode http
    server web2 10.0.0.17:80 weight 1 check inter 3000 fall 2 rise 5
   
  backend pc_hosts
    mode http
    server web2 10.0.0.17:80 weight 1 check inter 3000 fall 2 rise 5
#重启服务
[root@Centos8 certs]# systemctl restart haproxy.service

1.3 https验证

#修改后端web服务器日志格式
[root@Centos7 ~]# vim /etc/httpd/conf/httpd.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-forwarded-Port}i\" \"%{X-forwarded-Proto}i\"" combined

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、总结tomcat的核心组件以及根目录结构

2.1 tomcat 根目录结构

在这里插入图片描述
bin 服务启动、停止等相关程序和文件
在这里插入图片描述
conf 配置文件
在这里插入图片描述

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 日志系统相关的配置,可以修改日志级别和日志路径等

lib 库目录
在这里插入图片描述

logs 日志目录
在这里插入图片描述

webapps 应用程序,应用部署目录
在这里插入图片描述

work jsp编译后的结果文件,建议提前预热访问
在这里插入图片描述

2.2 核心组件

顶级组件,Server,代表整个Tomcat容器,一台主机可以启动多tomcat实例,需要确保端口不要产生冲突
服务类组件,Service,实现组织Engine和Connector,建立两者之间关联关系, service 里面只能包含一个Engine
连接器组件,Connector,有HTTP(默认端口8080/tcp)、HTTPS(默认端口8443/tcp)、AJP(默认端口8009/tcp)协议的连接器,AJP(Apache Jserv protocol)是一种基于TCP的二进制通讯协议。
容器类,Engine、Host(虚拟主机)、Context(上下文件,解决路径映射)都是容器类组件,可以嵌入其它组件,内部配置如何运行应用程序。
内嵌类,可以内嵌到其他组件内,valve、logger、realm、loader、manager等。以logger举例,在不同容器组件内分别定义。
集群类组件,listener、cluster
在这里插入图片描述

三、tomcat实现多虚拟主机

3.1 配置文件修改

[root@Centos7 ROOT]# vim /usr/local/tomcat/conf/server.xml
      <Host name="node1.magedu.org" appBase="/data/tomcat/webapps1">
      </Host>
      <Host name="node2.magedu.org" appBase="/data/tomcat/webapps2">
      </Host>
      <Host name="node3.magedu.org" appBase="/data/tomcat/webapps3">
      </Host>

在这里插入图片描述

3.2 准备数据目录

[root@Centos7 ROOT]# mkdir /data/tomcat/webapps{1..3}/ROOT -pv

准备测试页面

[root@Centos7 ROOT]# cat index.jsp 
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>tomcat test</title>
</head>
<body>
<h1> Tomcat Website </h1>
<div>On  <%=request.getServerName() %></div>
<div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div>
<div>SessionID = <span style="color:blue"><%=session.getId() %></span></div>
<%=new Date()%>
</body>
</html
[root@Centos7 ROOT]# tree /data/tomcat/
/data/tomcat/
├── webapps1
│   └── ROOT
│       └── index.jsp
├── webapps2
│   └── ROOT
│       └── index.jsp
└── webapps3
    └── ROOT
        └── index.jsp

6 directories, 3 files

设置权限,重启tomcat服务

[root@Centos7 ROOT]# chown -R tomcat:tomcat /data/tomcat/
[root@Centos7 ROOT]# systemctl restart tomcat.service

3.3 验证

修改Windows电脑主机hosts解析文件
在这里插入图片描述
浏览器依次访问,实现虚拟多主机
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、nginx实现后端tomcat的负载均衡调度

4.1 环境准备

10.0.0.8 nginx服务器,作反向代理服务器
10.0.0.18 tomcatservre1
10.0.0.28 tomcatserver2

4.2 tomcat 配置

虚拟主机添加

[root@tomcat-server1 ~]# vim /usr/local/tomcat/conf/server.xml #添加以下两行
 <Host name="tomcatserver1.magedu.com"  appBase="/data/tomcat/webapps">
 </Host>
 [root@tomcat-server2 ~]# vim /usr/local/tomcat/conf/server.xml #添加以下两行
 <Host name="tomcatserver2.magedu.com" appBase="/data/tomcat/webapps">
 </Host>

创建虚拟主机目录

#两台tomcat服务器执行
mkdir /data/tomcat/webapps/ROOT -pv
chown -R tomcat:tomcat /data/tomcat/

准备测试文件

[root@tomcat-server1 ROOT]# cat index.jsp 
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>tomcat test</title>
</head>
<body>
<h1> Tomcat Website </h1>
<div>On  <%=request.getServerName() %></div>
<div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div>
<div>SessionID = <span style="color:blue"><%=session.getId() %></span></div>
<%=new Date()%>
</body>
</html>
[root@tomcat-server1 ROOT]# tree /data/
/data/
└── tomcat
    └── webapps
        └── ROOT
            └── index.jsp

3 directories, 1 file

4.3nginx负载均衡服务器配置

[root@nginx-proxy ~]# vim /etc/nginx/nginx.conf
http语句块中添加
    upstream tomcat-server {
      #ip_hash;
      #hash $cookie_JSESSIONID
      server tomcatserver1.magedu.com:8080;
      server tomcatserver2.magedu.com:8080;
    }
server语句块
       location ~* \.(jsp|do)$ {
         proxy_pass http://tomcat-server;
       }
 [root@nginx-proxy ~]# systemctl restart nginx.service 

nginx后端服务器使用域名使,需添加域名解析。

[root@nginx-proxy ~]# cat /etc/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.18 tomcatserver1.magedu.com
10.0.0.28 tomcatserver2.magedu.com

4.4 测试

默认的nginx往后端的tomcat服务器调度时,会将请求转发至tomcat服务器的默认工作目录。为了体现实验效果,需修改tomcat服务器的默认工作目录。

[root@tomcat-server1 ROOT]# vim /usr/local/tomcat/conf/server.xml
<Engine name="Catalina" defaultHost="tomcatserver1.magedu.com">
[root@tomcat-server2 ROOT]# vim /usr/local/tomcat/conf/server.xml
<Engine name="Catalina" defaultHost="tomcatserver2.magedu.com">
#修改完之后需重启tomcat服务

在这里插入图片描述

在这里插入图片描述
nginx使用ip_hash算法时,会将来自同一个ip地址的访问请求转发至同一个服务器上。
在这里插入图片描述
在这里插入图片描述

五、简述memcached的工作原理

5.1 memcached介绍

NoSQL是对 Not Only SQL、非传统关系型数据库的统称。NoSQL一词诞生于1998年,2009年这个词汇被再次提出指非关系型、分布式、不提供ACID的数据库设计模式。随着互联网时代的到来,数据爆发式增长,数据库技术发展日新月异,要适应新的业务需求。而随着移动互联网、物联网的到来,大数据的技术中NoSQL也同样重要。
NoSQL 分类

Key-value Store k/v数据库
性能好 O(1) , 如: redis、memcached

Document Store 文档数据库
mongodb、CouchDB

Column Store 列存数据库,Column-Oriented DB
HBase、Cassandra,大数据领域应用广泛

Graph DB 图数据库
Neo4j

Time Series 时序数据库
InfluxDB、Prometheu

Memcached 只支持能序列化的数据类型,不支持持久化,基于Key-Value的内存缓存系统,memcached 虽然没有像redis所具备的数据持久化功能,比如RDB和AOF都没有,但是可以通过做集群同步的方式,让各memcached服务器的数据进行同步,从而实现数据的一致性,即保证各memcached的数据是一样的,即使有任何一台 memcached 发生故障,只要集群中有一台 memcached 可用就不会出现数据丢失,当其他memcached 重新加入到集群的时候,可以自动从有数据的memcached 当中自动获取数据并提供服务。Memcached 借助了操作系统的 libevent 工具做高效的读写。libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥高性能。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能Memcached 支持最大的内存存储对象为1M,超过1M的数据可以使用客户端压缩或拆分报包放到多个key中,比较大的数据在进行读取的时候需要消耗的时间比较长,memcached 最适合保存用户的session实现session共享Memcached存储数据时, Memcached会去申请1MB的内存, 把该块内存称为一个slab, 也称为一个page。

5.2 memcached工作机制

5.2.1 内存分配机制

应用程序运行需要使用内存存储数据,但对于一个缓存系统来说,申请内存、释放内存将十分频繁,非常容易导致大量内存碎片,最后导致无连续可用内存可用。
Memcached采用了Slab Allocator机制来分配、管理内存。
Page:分配给Slab的内存空间,默认为1MB,分配后就得到一个Slab。Slab分配之后内存按照固定字节大小等分成chunk。
Chunk:用于缓存记录k/v值的内存空间。Memcached会根据数据大小选择存到哪一个chunk中,假设chunk有128bytes、64bytes等多种,数据只有100bytes存储在128bytes中,存在少许浪费。
Chunk最大就是Page的大小,即一个Page中就一个Chunk.
Slab Class:Slab按照Chunk的大小分组,就组成不同的Slab Class, 第一个Chunk大小为 96B的Slab为Class1,Chunk 120B为Class 2,如果有100bytes要存,那么Memcached会选择下图中Slab Class 2 存储,因为它是120bytes的Chunk。Slab之间的差异可以使用Growth Factor 控制,默认1.25。

5.2.2 懒过期 Lazy Expiration

memcached不会监视数据是否过期,而是在取数据时才看是否过期,如果过期,把数据有效期限标识为0,并不清除该数据。以后可以覆盖该位置存储其它数据。

5.2.3 LRU

当内存不足时,memcached会使用LRU(Least Recently Used)机制来查找可用空间,分配给新记录使用。

5.2.4 集群

Memcached集群,称为基于客户端的分布式集群,即由客户端实现集群功能,即Memcached本身不支持集群
Memcached集群内部并不互相通信,一切都需要客户端连接到Memcached服务器后自行组织这些节点,并决定数据存储的节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值