第19周-2022-05-09

1、haproxy https实现

环境:
haproxy服务器:192.168.184.101
nginx后端:192.168.184.102

nginx后端页面:

[root@centos7-02 ~]# cat /usr/local/nginx/html/test.html 

https://www.example.com

192.168.184.102

haproxy配置:

#生成证书
[root@centos7-01 conf.d]# mkdir /etc/haproxy/certs/
[root@centos7-01 conf.d]# cd /etc/haproxy/certs/
[root@centos7-01 certs]# openssl genrsa -out example.key 2048
[root@centos7-01 certs]# openssl req -new -x509 -key example.key -out example.crt -days 365 -subj "/CN=www.example.com"
[root@centos7-01 certs]# cat example.key example.crt > example.pem

#修改配置文件
[root@centos7-01 certs]# cat /etc/haproxy/conf.d/test.cfg 
frontend example_http_port
  bind 192.168.184.101:80
  bind 192.168.184.101:443 ssl crt /etc/haproxy/certs/example.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
  log global
  option httplog
  acl acl_example_domain hdr_dom(host) -i www.example.com
  use_backend example_hosts if acl_example_domain
backend example_hosts
  mode http
  server web1 192.168.184.102:80 check inter 2000 fall 3 rise 5
[root@centos7-01 certs]# systemctl restart haproxy

windows上修改DNS解析:192.168.184.101 www.example.com
测试访问:

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

tomcat核心组件:

  • 顶级组件
    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

目录结构:
bin:服务启动、停止等相关程序和文件
conf:配置文件
lib:库目录
logs:日志目录
webapps:应用程序,应用部署目录
work:jsp编译后的结果文件,建议提前预热访问

3、tomcat实现多虚拟主机

安装jdk

#下载安装包:https://www.oracle.com/java/technologies/downloads/archive/
[root@centos7-01 local]# tar xvf jdk-8u331-linux-x64.tar.gz -C /usr/local/
[root@centos7-01 ~]# cd /usr/local/
[root@centos7-01 local]# ln -s jdk1.8.0_331/ jdk
#配置环境变量
[root@centos7-01 local]# cat /etc/profile.d/jdk.sh 
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
[root@centos7-01 local]# . /etc/profile.d/jdk.sh

二进制安装tomcat

[root@centos7-01 ~]# wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.78/bin/apache-tomcat-8.5.78.tar.gz
[root@centos7-01 ~]# tar xf apache-tomcat-8.5.78.tar.gz -C /usr/local/
[root@centos7-01 ~]# cd /usr/local/
[root@centos7-01 local]# ln -s apache-tomcat-8.5.78/ tomcat
[root@centos7-01 local]# echo 'PATH=/usr/local/tomcat/bin:$PATH' > /etc/profile.d/tomcat.sh
[root@centos7-01 local]# . /etc/profile.d/tomcat.sh
#创建tomcat专用帐户
[root@centos7-01 local]# useradd -r -s /sbin/nologin tomcat
#准备service文件中相关环境文件
[root@centos7-01 local]# vi /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/usr/local/jdk
[root@centos7-01 local]# chown -R tomcat.tomcat /usr/local/tomcat/
#创建tomcat.service文件
[root@centos7-01 local]# 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@centos7-01 local]# systemctl daemon-reload
[root@centos7-01 local]# systemctl enable --now tomcat

多虚拟主机配置

[root@centos7-01 local]# vi /usr/local/tomcat/conf/server.xml
#在文件最后面增加下面内容
      ...
      
        
      
      
        
      
    
  

#准备虚拟主机的数据目录
[root@centos7-01 local]# mkdir -p /data/webapps/web{1,2}/ROOT
[root@centos7-01 local]# echo web1.example.com > /data/webapps/web1/ROOT/index.html
[root@centos7-01 local]# echo web2.example.com > /data/webapps/web2/ROOT/index.html
[root@centos7-01 local]# systemctl restart tomcat

验证:

#配置hosts解析
[root@centos7-03 ~]# vi /etc/hosts
192.168.184.101 web1.example.com web2.example.com
#测试访问
[root@centos7-03 ~]# curl http://web1.example.com:8080
web1.example.com
[root@centos7-03 ~]# curl http://web2.example.com:8080
web2.example.com

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

tomcat1 192.168.184.101
tomcat2 192.168.184.102
nginx 192.168.184.103

tomcat配置

#tomcat1和tomcat2添加以下配置
[root@centos7-01 ~]# vi /usr/local/tomcat/conf/server.xml
      
      

#在tomcat1和tomcat2创建相同页面文件
[root@centos7-01 ~]# mkdir -p /data/webapps/ROOT
#编写测试jsp文件
[root@centos7-01 ~]# vi /data/webapps/ROOT/index.jsp
<%@ page import="java.util.*" %>




tomcat test


On <%=request.getServerName() %>
<%=request.getLocalAddr() + ":" + request.getLocalPort() %>
SessionID = <%=session.getId() %>
<%=new Date()%> #配置权限 [root@centos7-01 ~]# chown -R tomcat.tomcat /data/webapps/ [root@centos7-01 ~]# systemctl restart tomcat

nginx配置

[root@centos7-03 ~]# vi /etc/nginx/nginx.conf
#在http语句块中修改
    upstream tomcat-server {
      server t1.example.com:8080;
      server t2.example.com:8080;
    }
    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;
        location ~* \.jsp$ {
          proxy_pass http://tomcat-server;
        }

#修改hosts文件
[root@centos7-03 ~]# vi /etc/hosts
192.168.184.101 t1.example.com
192.168.184.102 t2.example.com

测试访问



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

你可能感兴趣的:(第19周-2022-05-09)