• 第十九周练习题


    第十九周

    一、haproxy https实现

    	haproxy可以实现https的证书安全,从用户到haproxy为https,从haproxy到后端服务器用http通信,但基于性能考虑,生产中证书都是在后端服务器比如nginx上实现。
    
    1.安装haproxy请查看上一次练习题。
    
    2.证书制作,利用centos7系统的Makefile生成自签名证书。
    [root@localhost ~]# cd /etc/pki/tls/certs/
    [root@localhost certs]# ls
    ca-bundle.crt  ca-bundle.trust.crt  make-dummy-cert  Makefile  renew-dummy-cert
    
    #新建ssl目录存放证书
    [root@localhost certs]# mkdir /etc/haproxy/conf.d/ssl
    
    #为了方便,修改makefile文件,使创建私钥时不加密
    [root@localhost certs]# vim Makefile
    %.key:
        umask 77 ; \
        #/usr/bin/openssl genrsa -aes128 $(KEYLEN) > $@
        /usr/bin/openssl genrsa  $(KEYLEN) > $@
    
    #生成crt自签名证书文件
    [root@localhost certs]# make /etc/haproxy/conf.d/ssl/www.tanliang.com.crt
    umask 77 ; \
    #/usr/bin/openssl genrsa -aes128 2048 > /etc/haproxy/conf.d/ssl/www.tanliang.com.key
    /usr/bin/openssl genrsa  2048 > /etc/haproxy/conf.d/ssl/www.tanliang.com.key
    Generating RSA private key, 2048 bit long modulus
    .............................................................................................................................+++
    ............+++
    e is 65537 (0x10001)
    umask 77 ; \
    /usr/bin/openssl req -utf8 -new -key /etc/haproxy/conf.d/ssl/www.tanliang.com.key -x509 -days 365 -out /etc/haproxy/conf.d/ssl/www.tanliang.com.crt
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [XX]:CN
    State or Province Name (full name) []:hubei
    Locality Name (eg, city) [Default City]:hubei
    Organization Name (eg, company) [Default Company Ltd]:tanliang
    Organizational Unit Name (eg, section) []:it
    Common Name (eg, your name or your server's hostname) []:www.tanliang.com
    Email Address []:
    
    #haproxy要用的话,需要key和crt二合一
    [root@localhost certs]# cd /etc/haproxy/conf.d/ssl/
    [root@localhost ssl]# ls
    www.tanliang.com.crt  www.tanliang.com.key
    [root@localhost ssl]# cat www.tanliang.com.key www.tanliang.com.crt  > www.tanliang.com.pem
    
    3.配置haproxy
    [root@localhost ssl]# cat /etc/haproxy/conf.d/tets.cfg
    listen  web_http_nodes
    bind 10.0.0.152:80
    bind 10.0.0.152:443 ssl crt /etc/haproxy/conf.d/ssl/www.tanliang.com.pem
    server web1 10.0.0.150:80 check inter 2000 fall 3 rise 5
    server web2 10.0.0.162:80 check inter 2000 fall 3 rise 5
    
    #重启haproxy服务
    [root@localhost ssl]# systemctl restart haproxy
    
    #检查一下端口是否开启
    [root@localhost ssl]# ss -ntl
    State      Recv-Q Send-Q                                                Local Address:Port                                                               Peer Address:Port
    LISTEN     0      128                                                      10.0.0.152:443                                                                           *:*
    LISTEN     0      128                                                               *:9999                                                                          *:*
    LISTEN     0      128                                                      10.0.0.152:80                                                                            *:*
    LISTEN     0      128                                                               *:22                                                                            *:*
    LISTEN     0      100                                                       127.0.0.1:25                                                                            *:*
    LISTEN     0      128                                                            [::]:22                                                                         [::]:*
    LISTEN     0      100                                                           [::1]:25                                                                         [::]:*
    
    4.在后端服务器上做好网页
    #在10.0.0.150和10.0.0.162两台服务器上安装httpd服务,并且写入网页内容,来做haproxy调度访问。
    [root@centos8 ~]#yum install -y httpd
    [root@centos8 ~]#systemctl start httpd
    [root@centos8 ~]#echo 10.0.0.150 > /var/www/html/index.html
    [root@centos8 ~]#curl localhost
    10.0.0.150
    
    5.访问测试
    #访问haproxy服务器验证https协议访问。-k参数忽略证书检查。
    [root@localhost ssl]# curl -k https://10.0.0.152
    10.0.0.150
    [root@localhost ssl]# curl -k https://10.0.0.152
    10.0.0.162
    [root@localhost ssl]# curl -k https://10.0.0.152
    10.0.0.150
    [root@localhost ssl]# curl -k https://10.0.0.152
    10.0.0.162
    
    6.实际用户可能不知道要用https协议,因此设置访问http自动跳转https
    [root@localhost ssl]# cat /etc/haproxy/conf.d/tets.cfg
    listen  web_http_nodes
    bind 10.0.0.152:80
    bind 10.0.0.152:443 ssl crt /etc/haproxy/conf.d/ssl/www.tanliang.com.pem
    redirect scheme https if !{ ssl_fc }#加上这段配置。ssl_fc是系统自带变量,意思是https协议。!号表示非,非https就scheme变成https
    server web1 10.0.0.150:80 check inter 2000 fall 3 rise 5
    server web2 10.0.0.162:80 check inter 2000 fall 3 rise 5
    #该配置后要重启服务使配置生效
    [root@localhost ssl]# systemctl restart haproxy
    
    7.访问验证
    #访问验证,-I获取头信息,302表示临时重定向
    [root@localhost ssl]# curl http://10.0.0.152 -I
    HTTP/1.1 302 Found
    content-length: 0
    location: https://10.0.0.152/
    cache-control: no-cache
    #-L调转到重定向后的页面,-k忽略证书检查。
    [root@localhost ssl]# curl http://10.0.0.152 -Lk
    10.0.0.150
    [root@localhost ssl]# curl http://10.0.0.152 -Lk
    10.0.0.162
    
    #说明:工作中如果haproxy工作压力大,就不要在haproxy上使用https了。是用tcp四层转发报文会轻松一些。在后端nginx上使用https协议。优点是只用在haproxy一台上做https,不用在后端很多nginx每个nginx服务器上配置https了。因此若haproxy访问量小,可以在上面做https。访问量多就在后端做。
    

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

    1. Tomcat 核心组件
    	Tomcat核心组件有6个,分别为Tomcat有Server、Service、Connector、Engine、Host和Context等
    
    1.1 Server
    Server元素在最顶层,代表整个Tomcat容器,因此它必须是server.xml中唯一一个最外层的元素。一个Server元素中可以有一个或多个Service元素。可以启动多个Server,即tomcat的多实例
    Server的主要任务,就是提供一个接口让客户端能够访问到这个Service集合,同时维护它所包含的所有的Service的声明周期,包括如何初始化、如何结束服务、如何找到客户端要访问的Service。
    
    
    1.2 Service
    Service的作用,是在Connector和Engine外面包了一层,把它们组装在一起,对外提供服务。一个Service可以包含多个Connector,但是只能包含一个Engine;其中Connector的作用是从客户端接收请求,Engine的作用是处理接收进来的请求。Tomcat可以提供多个Service,不同的Service监听不同的端口。
    
    1.3 Connector
    Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据;然后分配线程让Engine来处理这个请求,并把产生的Request和Response对象传给Engine。可以为这个Service提供多个连接器Connector,这些Connector使用了不同的协议,绑定了不同的端口。其作用就是处理来自客户端的不同的连接请求或响应
    
    1.4 Engine
    Engine组件在Service组件中有且只有一个;Engine是Service组件中的请求处理组件。Engine组件从一个或多个Connector中接收请求并处理,并将完成的响应返回给Connector,最终传递给客户端。
    实际上,Engine、Host和Context都是容器,但它们不是平行的关系,而是父子关系:Engine包含Host,Host包含Context。
    
    1.5 Host
    Host是Engine的子容器。Engine组件中可以内嵌1个或多个Host组件,每个Host组件代表Engine中的一个虚拟主机。Host组件至少有一个,且其中一个的name必须与Engine组件的defaultHost属性相匹配。
    Host虚拟主机的作用,是运行多个Web应用(一个Context代表一个Web应用),并负责安装、展开、启动和结束每个Web应用。
    
    1.6 Context
    Context元素代表在特定虚拟主机上运行的一个Web应用。每个Web应用基于WAR文件,或WAR文件解压后对应的目录(这里称为应用目录)。Context是Host的子容器,每个Host中可以定义任意多的Context元素。Context 定义应用程序单独的路径映射和配置
    
    2.目录结构
    bin: 服务启动、停止等相关程序和文件
    
    conf: 配置文件
    	在tomcat安装目录下的 conf 子目录中,有以下的 tomcat 的配置文件
    	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: 应用程序,应用部署目录
    	Tomcat中默认网站根目录是$CATALINA_BASE/webapps/。$CATALINA_BASE/webapps下面的每个目录都对应一个Web应用,即WebApp。在Tomcat的webapps目录中,有个非常特殊的目录ROOT,它就是网站默认根目录。
    	$CATALINA_BASE/webapps下面的每个目录对应的WebApp,可能有以下子目录,但下面子目录是非必须的
    	主页配置:默认按以下顺序查找主页文件 index.html,index.htm、index.jsp
    	WEB-INF/:当前目录WebApp的私有资源路径,通常存储当前应用使用的web.xml和context.xml
    配置文件
    	META-INF/:类似于WEB-INF,也是私有资源的配置信息,和WEB-INF/目录一样浏览器无法访问
    	classes/:类文件,当前webapp需要的类
    	lib/:当前应用依赖的jar包
    
    work: jsp编译后的结果文件,建议提前预热访问
    

    三、tomcat实现多虚拟主机

    1.安装tomcat
    #下载tomcat8的包
    [root@centos8 ~]#wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.73/bin/apache-tomcat-8.5.73.tar.gz
    [root@centos8 ~]#tar -xf apache-tomcat-8.5.73.tar.gz  -C /usr/local/
    [root@centos8 ~]#cd /usr/local/
    [root@centos8 local]#ln -s apache-tomcat-8.5.73/ tomcat
    [root@centos8 local]#echo 'PATH=/usr/local/tomcat/bin:$PATH'> /etc/profile.d/tomcat.sh
    [root@centos8 local]#. /etc/profile.d/tomcat.sh
    [root@centos8 local]#echo $PATH
    /usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    
    2.安装jdk
    [root@centos8 ~]#dnf -y install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel
    [root@centos8 ~]#java -version
    openjdk version "1.8.0_312"
    OpenJDK Runtime Environment (build 1.8.0_312-b07)
    OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)
    
    3.启动及关闭tomcat
    [root@centos8 ~]#catalina.sh start
    Using CATALINA_BASE:   /usr/local/tomcat
    Using CATALINA_HOME:   /usr/local/tomcat
    Using CATALINA_TMPDIR: /usr/local/tomcat/temp
    Using JRE_HOME:        /usr
    Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
    Using CATALINA_OPTS:
    Tomcat started.
    [root@centos8 ~]#ps aux|grep tomcat
    root       32332  2.1  1.6 5129608 134564 pts/0  Sl   17:56   0:03 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
    root       32431  0.0  0.0  12112  1000 pts/0    S+   17:59   0:00 grep --color=auto tomcat
    #关闭tomcat
    [root@centos8 ~]#catalina.sh stop
    
    4.配置 tomcat自启动的 service 文件
    #创建tomcat专用帐户
    [root@centos8 ~]#useradd -r -s /sbin/nologin tomcat
    #准备service文件中相关环境文件
    [root@centos8 ~]#vim /usr/local/tomcat/conf/tomcat.conf
    [root@centos8 ~]#cat /usr/local/tomcat/conf/tomcat.conf
    JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64/
    
    [root@centos8 ~]#chown -R tomcat.tomcat /usr/local/tomcat/
    
    #创建tomcat.service文件
    [root@centos8 ~]#vim /lib/systemd/system/tomcat.service
    [root@centos8 ~]#cat /lib/systemd/system/tomcat.service
    [Unit]
    Description=Tomcat
    #After=syslog.target network.target remote-fs.target nss-lookup.target
    After=syslog.target network.target 
    [Service]
    Type=forking
    EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
    ExecStart=/usr/local/tomcat/bin/startup.sh
    ExecStop=/usr/local/tomcat/bin/shutdown.sh
    PrivateTmp=true
    User=tomcat
    Group=tomcat
    [Install]
    WantedBy=multi-user.target
    
    [root@centos8 ~]#systemctl daemon-reload
    [root@centos8 ~]#systemctl enable --now tomcat
    Created symlink /etc/systemd/system/multi-user.target.wants/tomcat.service → 
    /usr/lib/systemd/system/tomcat.service.
    [root@centos8 jre]#systemctl status tomcat
    ● tomcat.service - Tomcat
       Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor preset: disa>
       Active: active (running) since Fri 2021-12-31 18:12:55 CST; 6s ago
      Process: 32824 ExecStop=/usr/local/tomcat/bin/shutdown.sh (code=exited, status=0/SUCC>
      Process: 32903 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCC>
     Main PID: 32911 (java)
        Tasks: 25 (limit: 50407)
       Memory: 116.4M
       CGroup: /system.slice/tomcat.service
               └─32911 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64//bin/ja>
    Dec 31 18:12:55 centos8.magedu.org systemd[1]: Starting Tomcat...
    Dec 31 18:12:55 centos8.magedu.org systemd[1]: Started Tomcat.
    
    5.多虚拟主机配置
    #说明:name 必须是主机名,用主机名来匹配;
    #appBase 当前主机的网页根目录,是相对于 $CATALINA_HOME ,也可以使用绝对路径;
    #unpackWARs 是否自动解压war格式;
    #autoDeploy 热部署,自动加载并运行应用
    [root@centos8 jre]#vim /usr/local/tomcat/conf/server.xml
    [root@centos8 jre]#tail /usr/local/tomcat/conf/server.xml
    #添加了以下四行
          <Host name="node1.tomcat.com"  appBase="/data/webapps1">
            </Host>
            <Host name="node2.tomcat.com"  appBase="/data/webapps2">
            </Host>
        </Engine>
      </Service>
    </Server>
    
    #对每个虚拟主机,准备数据
    [root@centos8 jre]#mkdir /data/webapps{1,2}/ROOT -pv
    mkdir: created directory '/data'
    mkdir: created directory '/data/webapps1'
    mkdir: created directory '/data/webapps1/ROOT'
    mkdir: created directory '/data/webapps2'
    mkdir: created directory '/data/webapps2/ROOT'
    
    [root@centos8 ~]#cat /data/webapps1/ROOT/index.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>jsp例子</title>
    </head>
    <body>
    后面的内容是服务器端动态生成字符串,最后拼接在一起
    <br>
    <%=request.getRequestURL()%>
    </body>
    </html>
    [root@centos8 ~]#cp -p /data/webapps1/ROOT/index.jsp /data/webapps2/ROOT/index.jsp
    [root@centos8 ~]#chown -R tomcat.tomcat /data/webapps{1,2}/
    [root@centos8 ~]#echo '10.0.0.150 node1.tomcat.com node2.tomcat.com'  >> /etc/hosts
    [root@centos8 ~]#cat /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    10.0.0.150 node1.tomcat.com node2.tomcat.com
    
    #修改配置文件后重启tomcat服务
    [root@centos8 ~]#systemctl restart tomcat
    #访问测试
    [root@centos8 ~]#curl http://node1.tomcat.com:8080
    
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>jsp例子</title>
    </head>
    <body>
    后面的内容是服务器端动态生成字符串,最后拼接在一起
    <br>
    http://node1.tomcat.com:8080/
    </body>
    </html>
    [root@centos8 ~]#curl http://node2.tomcat.com:8080
    
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>jsp例子</title>
    </head>
    <body>
    后面的内容是服务器端动态生成字符串,最后拼接在一起
    <br>
    http://node2.tomcat.com:8080/
    </body>
    </html>
    

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

    1.负载均衡主机和网络地址规划
    10.0.0.152  proxy.magedu.org nginx
    10.0.0.150   t1.magedu.org   tomcat1
    10.0.0.160   t2.magedu.org   tomcat2
    #只需在10.0.0.52的nginx主机上实现域名解析
    [root@localhost ~]# cat /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    10.0.0.152 proxy.magedu.org proxy
    10.0.0.150 t1.magedu.org t1
    10.0.0.160 t2.magedu.org t2
    
    2.负载均衡tomcat主机准备
    修改tomcat的虚拟机主机为自定义的主机名,并设为默认的虚拟主机
    t1虚拟主机配置conf/server.xml
    [root@centos8 ~]#vim /usr/local/tomcat/conf/server.xml
    <Engine name="Catalina" defaultHost="t1.magedu.org">
        <Host name="t1.magedu.org" appBase="/data/webapps" autoDeploy="true" >
        </Host>
    </Engine>
    [root@centos8 ~]#systemctl restart tomcat
    
    t2虚拟主机配置conf/server.xml
    [root@centos8 ~]#vim /usr/local/tomcat/conf/server.xml
    <Engine name="Catalina" defaultHost="t2.magedu.org">
        <Host name="t2.magedu.org" appBase="/data/webapps" autoDeploy="true" >
        </Host>
    </Engine>
    [root@centos8 ~]#systemctl restart tomcat
    
    3.准备负载均衡规划测试用的jsp文件
    #在t1和 t2节点创建相同的文件/data/webapps/ROOT/index.jsp
    [root@centos8 ~]#mkdir -pv /data/webapps/ROOT
    mkdir: created directory '/data/webapps'
    mkdir: created directory '/data/webapps/ROOT'
    [root@centos8 ~]#vim /data/webapps/ROOT/index.jsp
    [root@centos8 ~]#cat /data/webapps/ROOT/index.jsp
    <%@ page import="java.util.*" %>
    <!DOCTYPE html>
    <html lang="en">
    <head>
     <meta charset="UTF-8">
     <title>tomcat test</title>
    </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>
    [root@centos8 ~]#chown -R tomcat.tomcat /data/webapps/
    
    4.Nginx 实现后端 tomcat 的负载均衡
    [root@localhost ~]# yum install -y nginx
    [root@localhost ~]# vim /etc/nginx/nginx.conf
    #在http模块中添加一下几行
        upstream tomcat {
            server t1.magedu.org:8080;
            server t2.magedu.org:8080;
            }
        server {
            server_name proxy.magedu.org;
            location ~* \.(jsp|do)$ {
                proxy_pass http://tomcat;
                }
             }
    
    [root@localhost ~]# systemctl restart nginx
    [root@localhost ~]# curl http://proxy.magedu.org/index.jsp
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
     <meta charset="UTF-8">
     <title>tomcat test</title>
    </head>
    <body>
    <div>On tomcat</div>
    <div>10.0.0.150:8080</div>
    <div>SessionID = <span style="color:blue">23B0399E91F79E1F934E1AA087BB26D0</span></div>
    Fri Dec 31 21:55:40 CST 2021
    </body>
    </html>
    [root@localhost ~]# curl http://proxy.magedu.org/index.jsp
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
     <meta charset="UTF-8">
     <title>tomcat test</title>
    </head>
    <body>
    <div>On tomcat</div>
    <div>10.0.0.160:8080</div>
    <div>SessionID = <span style="color:blue">306D4E2B1415782E799AE991EFA3286C</span></div>
    Fri Dec 31 21:55:45 CST 2021
    </body>
    </html>
    
    #可以看到轮询调度效果,每次刷新后端主机和SessionID都会变化
    
    5.实现 session 黏性
    #在upstream中使用ip_hash指令,使用客户端IP地址Hash。
    [root@localhost ~]# vim /etc/nginx/nginx.conf
    #在http模块中添加一下几行
        upstream tomcat {
        	ip_hash;
            server t1.magedu.org:8080;
            server t2.magedu.org:8080;
            }
        server {
            server_name proxy.magedu.org;
            location ~* \.(jsp|do)$ {
                proxy_pass http://tomcat;
                }
             }
    [root@localhost ~]# systemctl restart  nginx
    [root@localhost ~]# curl http://proxy.magedu.org/index.jsp
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
     <meta charset="UTF-8">
     <title>tomcat test</title>
    </head>
    <body>
    <div>On tomcat</div>
    <div>10.0.0.160:8080</div>
    <div>SessionID = <span style="color:blue">36DA811FDAEFC13070FE522BC206E68D</span></div>
    Fri Dec 31 21:58:53 CST 2021
    </body>
    </html>
    
    [root@localhost ~]# curl http://proxy.magedu.org/index.jsp
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
     <meta charset="UTF-8">
     <title>tomcat test</title>
    </head>
    <body>
    <div>On tomcat</div>
    <div>10.0.0.160:8080</div>
    <div>SessionID = <span style="color:blue">39CC514BF59EBC8244BF2CD510EE2419</span></div>
    Fri Dec 31 21:58:55 CST 2021
    </body>
    </html>
    #用curl访问每次都调度到10.0.0.160主机上,但因为curl每次请求不会自动携带之前获取的cookie,所有SessionID每次都在变化
    #通过图形浏览器可看到主机不变,sessionID不变
    

    五、简述memcached的工作原理

    Memcached 只支持能序列化的数据类型,不支持持久化,基于Key-Value的内存缓存系统
    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)机制来查找可用空间,分配给新记录使用。
  • 相关阅读:
    Bash的提示符
    小笨霖英语笔记本(5)
    什么是VLAN
    阅读笔记:双核心Opteron处理器
    小笨霖英语笔记本(4)
    搭乘CCNUMA快车
    得到tnsnames.ora文件的位置 zz
    关于64位Windows操作系统中的注册表 zz
    Temp.Misc
    HttpHandler HttpModule入门篇
  • 原文地址:https://www.cnblogs.com/tanll/p/15754562.html
Copyright © 2020-2023  润新知