1、haproxy https实现
1.1 证书制作
[root@haproxy ~]#cd /etc/pki/tls/certs
[root@haproxy certs]#mkdir /etc/haproxy/conf.d/ssl
[root@haproxy certs]#vim Makefile #设置私钥key不加密
/usr/bin/openssl genrsa $(KEYLEN) > $@ #修改此行
[root@haproxy certs]#make /etc/haproxy/conf.d/ssl/www.magedu.org.crt
… …
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:beijing
Locality Name (eg, city) [Default City]:beijing
Organization Name (eg, company) [Default Company Ltd]:magedu
Organizational Unit Name (eg, section) []:it
Common Name (eg, your name or your server’s hostname) []:www.magedu.org
Email Address []:
[root@haproxy certs]#ls /etc/haproxy/conf.d/ssl/
www.magedu.org.crt www.magedu.org.key
[root@haproxy certs]#cat www.magedu.org.crt www.magedu.org.key > www.magedu.org.pem
1.2 https配置示例
[root@haproxy ~]#vim /etc/haproxy/conf.d/test.cfg
listen web_http_https_nodes
bind 10.0.0.100:80
bind 10.0.0.100:443 crt /etx/haproxy/conf.d/ssl/www.magedu.org.pem
redirect scheme https if !{ ssl_fc } # 注意{ }内的空格
server web1 10.0.0.18:80 check inter 3000 fall 3 rise 5
server web2 10.0.0.28:80 check inter 3000 fall 3 rise 5
[root@haproxy ~]#systemctl restart haproxy
[root@haproxy ~]#ss -ntl #80和443端口打开
#在10.0.0.8客户端上测试
[root@client ~]#curl -k https://10.0.0.100/ #-k忽略证书检查
10.0.0.18
[root@client ~]#curl -k https://10.0.0.100/
10.0.0.28
[root@client ~]#curl -k https://10.0.0.100/
10.0.0.18
[root@client ~]#curl -k https://10.0.0.100/
10.0.0.28
1.3 修改后端服务器的日志格式
[root@rs1 ~]#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
[root@rs2 ~]#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
1.4 验证https
[root@client ~]#curl http://10.0.0.100/ -I
HTTP/1.1 302 Found
content-length: 0
location: https:/10.0.0.100/
cache-control: no-cache
[root@client ~]#curl http://10.0.0.100/ -ILk
HTTP/1.1 302 Found
content-length: 0
location: https:/10.0.0.100/
cache-control: no-cache
HTTP/1.1 200 OK
date: Wed, 23 Jun 2021 02:07:10 GMT
server: Apache/2.4.37 (centos) OpenSSL/1.1.1g
last-modified: Fri, 18 Jun 2021 08:54:55 GMT
etag: "b-5c5067a4b39dd"
accept-ranges: bytes
content-length: 11
content-type: text/html; charset=UTF-8
[root@client ~]#curl http://10.0.0.100/ -Lk
10.0.0.28
[root@client ~]#curl http://10.0.0.100/ -Lk
10.0.0.18
2、总结tomcat的核心组件以及根目录结构
tomcat的核心组件
- Tomcat启动一个Server进程。可以启动多个Server,即tomcat的多实例, 但一般只启动一个
- 创建一个Service提供服务。可以创建多个Service,但一般也只创建一个
每个Service中,是Engine和其连接器Connector的关联配置 - 可以为这个Service提供多个连接器Connector,这些Connector使用了不同的协议,绑定了不同的端口。其作用就是处理来自客户端的不同的连接请求或响应
- Service 内部还定义了Engine,引擎才是真正的处理请求的入口,其内部定义多个虚拟主机Host
Engine对请求头做了分析,将请求发送给相应的虚拟主机
如果没有匹配,数据就发往Engine上的defaultHost缺省虚拟主机
Engine上的缺省虚拟主机可以修改 - Host 定义虚拟主机,虚拟主机有name名称,通过名称匹配
- Context 定义应用程序单独的路径映射和配置
tomcat的根目录结构
Tomcat中默认网站根目录是/usr/local/tomat/webapps/
在Tomcat中部署主站应用程序和其他应用程序,和之前WEB服务程序不同。
nginx
假设在nginx中部署2个网站应用eshop、forum,假设网站根目录是/data/nginx/html,那么部署可以是这样的。
eshop解压缩所有文件放到 /data/nginx/html/ 目录下,forum 的文件放在 /data/nginx/html/forum/ 下。
最终网站链接有以下对应关系
http://localhost/ 对应于eshop的应用,即 /data/nginx/html/
http://localhost/forum/ 对应于forum的应用,即/data/nginx/html/forum/
Tomcat
Tomcat中默认网站根目录是/usr/local/tomat/webapps/
在Tomcat的webapps目录中,有个非常特殊的目录ROOT,它就是网站默认根目录。
将eshop解压后的文件放到这个/usr/local/tomat/webapps/ROOT中。
bbs解压后文件都放在/usr/local/tomat/webapps/forum目录下。
/usr/local/tomat/webapps下面的每个目录都对应一个Web应用,即WebApp
最终网站链接有以下对应关系
http://localhost/ 对应于eshop的应用WebApp,即/usr/local/tomat/webapps/ROOT/目录,
http://localhost/forum/ 对应于forum的应用WebApp,即/usr/local/tomat/webapps/forum/
如果同时存在/usr/local/tomat/webapps/ROOT/forum ,仍以 /usr/local/tomat/webapps/forum/ 优先生效
每一个虚拟主机都可以使用appBase指令配置自己的站点目录,使用appBase目录下的ROOT目录作为主站目录。
3、tomcat实现多虚拟主机
#对每个虚拟主机,准备数据
[root@centos8 ~]#mkdir /data/website{1,2,3}/ROOT -pv
[root@centos8 ~]#vim /data/website1/ROOT/index.html
www.a.com
/data/website1/ROOT/index.html
[root@centos8 ~]#vim /data/website2/ROOT/index.html
www.b.com
/data/website2/ROOT/index.html
[root@centos8 ~]#vim /data/website3/ROOT/index.html
www.c.com
/data/website3/ROOT/index.html
#修改配置conf/server.xml
[root@centos8 ~]#vim /usr/local/tomcat/conf/server.xml
#在文件最后面增加下面内容
[root@centos8 ~]#systemctl restart tomcat
#修改windows中的hosts文件
10.0.0.18 www.a.com www.b.com www.c.com
#浏览器访问测试
4、nginx实现后端tomcat的负载均衡调度
1 负载均衡主机和网络地址规划
主机名 IP 服务 软件
proxy.magedu.org 10.0.0.8 调度器 Nginx
t1.magedu.org 10.0.0.18 tomcat1 JDK8、Tomcat8
t2.magedu.org 10.0.0.28 tomcat2 JDK8、Tomcat8
#在10.0.0.8的nginx主机上实现域名解析
[root@proxy ~]#vim /etc/hosts
#添加以下行
10.0.0.18 t1.magedu.org
10.0.0.28 t2.magedu.org
#在客户端主机上实现域名解析
[root@client ~]#vim /etc/hosts
#添加以下行
10.0.0.8 www.magedu.org
2 负载均衡tomcat主机准备
修改tomcat的虚拟机主机为自定义的主机名,并设为默认的虚拟主机
t1虚拟主机配置conf/server.xml
[root@t1 ~]#vim /usr/local/tomcat/conf/server.xml
[root@t1 ~]#systemctl restart tomcat
t2虚拟主机配置conf/server.xml
[root@t1 ~]#vim /usr/local/tomcat/conf/server.xml
[root@t1 ~]#systemctl restart tomcat
3 准备负载均衡规划测试用的jsp文件
在t1和 t2节点创建相同的文件/data/webapps/ROOT/index.jsp
#项目路径配置
mkdir -pv /data/webapps/ROOT
#编写测试jsp文件,内容在下面
vim /data/webapps/ROOT/index.jsp
<%@ page import="java.util.*" %>
t1.magdu.org #t2上改为t2.magdu.org
On <%=request.getServerName() %>
<%=request.getLocalAddr() + ":" + request.getLocalPort() %>
SessionID = <%=session.getId() %>
<%=new Date()%>
#设置权限
chown -R tomcat.tomcat /data/webapps/
4 Nginx 实现后端 tomcat 的负载均衡调度
Nginx 实现后端 tomcat 的负载均衡
nginx 配置如下
[root@haproxy ~]#vim /etc/nginx/nginx.conf
#在http块中加以下内容
#注意名称不要用下划线
upstream tomcat {
#ip_hash; # 先禁用看看轮询,之后开启开黏性
hash $cookie_JSESSIONID; # 先禁用看看轮询,之后开启开黏性
server t1.magedu.org:8080;
server t2.magedu.org:8080
}
server {
location / {
proxy_pass http://tomcat;
}
}
[root@haproxy ~]#systemctl restart nginx
测试 http://www.magedu.com/index.jsp,可以看到轮询调度效果,每次刷新后端主机和SessionID都会变化
[root@client ~]#curl www.magedu.org/index.jsp
t1.magedu.org
tomcat website
On tomcat-server
10.0.0.18:8080
SessionID = 2E4BFA5135497EA3628F1EBDAE62493E
Thu Jul 09 17:58:06 CST 2020
[root@client ~]#curl www.magedu.org/index.jsp
t2.magedu.org
tomcat website
On tomcat-server
10.0.0.28:8080
SessionID = 2E4BFA5135497EA3628F1EBDAE62493E
Thu Jul 09 17:58:07 CST 2020
5、简述memcached的工作原理
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。
2 懒过期 Lazy Expiration
memcached不会监视数据是否过期,而是在取数据时才看是否过期,如果过期,把数据有效期限标识为0,并不清除该数据。以后可以覆盖该位置存储其它数据。
3 LRU
当内存不足时,memcached会使用LRU(Least Recently Used)机制来查找可用空间,分配给新记录使用。
4 集群
Memcached集群,称为基于客户端的分布式集群,即由客户端实现集群功能,即Memcached本身不支持集群
Memcached集群内部并不互相通信,一切都需要客户端连接到Memcached服务器后自行组织这些节点,并决定数据存储的节点。