第十九周 企业级Web应用服务器TOMCAT

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
#在文件最后面增加下面内容
<Host name="www.a.com"  appBase="/data/website1/"
unpackWARs="true" autoDeploy="true">
</Host>
<Host name="www.b.com"  appBase="/data/website2/"
unpackWARs="true" autoDeploy="true">
</Host>
<Host name="www.c.com"  appBase="/data/website3/"
unpackWARs="true" autoDeploy="true">
</Host>

[root@centos8 ~]#systemctl restart tomcat

#修改windows中的hosts文件
10.0.0.18  www.a.com  www.b.com  www.c.com

#浏览器访问测试


1.png

2.png

3.png

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

1 负载均衡主机和网络地址规划

a.png

    主机名                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
<Engine name="Catalina" defaultHost="t1.magedu.org">
    <Host name="t1.magedu.org" appBase="/data/webapps/"
          unpackWARs="true" autoDeploy="true" >
    </Host>
</Engine>
[root@t1 ~]#systemctl restart tomcat

t2虚拟主机配置conf/server.xml

[root@t1 ~]#vim /usr/local/tomcat/conf/server.xml
<Engine name="Catalina" defaultHost="t2.magedu.org">
    <Host name="t2.magedu.org" appBase="/data/webapps/"
          unpackWARs="true" autoDeploy="true" >
    </Host>
</Engine>
[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.*" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>t1.magdu.org</title>      #t2上改为t2.magdu.org
</head>
<body>
<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>

#设置权限
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
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>t1.magedu.org</title>
</head>
<body>
<h1> tomcat website </h1>
<div>On tomcat-server</div>
<div>10.0.0.18:8080</div>
<div>SessionID = <span
style="color:blue">2E4BFA5135497EA3628F1EBDAE62493E</span></div>
Thu Jul 09 17:58:06 CST 2020
</body>
</html>

[root@client ~]#curl www.magedu.org/index.jsp
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>t2.magedu.org</title>
</head>
<body>
<h1> tomcat website </h1>
<div>On tomcat-server</div>
<div>10.0.0.28:8080</div>
<div>SessionID = <span
style="color:blue">2E4BFA5135497EA3628F1EBDAE62493E</span></div>
Thu Jul 09 17:58:07 CST 2020
</body>
</html>

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,302评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,563评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,433评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,628评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,467评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,354评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,777评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,419评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,725评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,768评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,543评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,387评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,794评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,032评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,305评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,741评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,946评论 2 336

推荐阅读更多精彩内容