第十九周 企业级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
#在文件最后面增加下面内容







[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

    
    

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

你可能感兴趣的:(第十九周 企业级Web应用服务器TOMCAT)