一、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服务器后自行组织这些节点,并决定数据存储的节点。