第十九周作业

一、haproxy https实现

实验环境
image

1.1 配置haproxy和后端http服务

详见第十八周第二题和第四题

1.2 生成自签名证书

# 创建证书保存的目录
[root@centos7-mini2 certs]# mkdir /etc/haproxy/conf.d/ssl

# 编辑证书生成的Makefile文件,使其生成的key不加密
[root@centos7-mini2 certs]# vim Makefile
 55 %.key:
 56   umask 77 ; \
 57 # /usr/bin/openssl genrsa -aes128 $(KEYLEN) > $@
 58   /usr/bin/openssl genrsa  $(KEYLEN) > $@

 # 生成证书
[root@centos7-mini2 certs]# make /etc/haproxy/conf.d/ssl/www.wuhao.org.crt
umask 77 ; \
#       /usr/bin/openssl genrsa -aes128 2048 > /etc/haproxy/conf.d/ssl/www.wuhao.org.key
/usr/bin/openssl genrsa  2048 > /etc/haproxy/conf.d/ssl/www.wuhao.org.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.wuhao.org.key -x509 -days 365 -out /etc/haproxy/conf.d/ssl/www.wuhao.org.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) []:AnHui
Locality Name (eg, city) [Default City]:LuZhou
Organization Name (eg, company) [Default Company Ltd]:wuhao
Organizational Unit Name (eg, section) []:IT    
Common Name (eg, your name or your server's hostname) []:www.wuhao.org
Email Address []:
[root@centos7-mini2 certs]# ll /etc/haproxy/conf.d/ssl/
total 8
-rw------- 1 root root 1310 Aug  1 09:00 www.wuhao.org.crt
-rw-r--r-- 1 root root 1675 Aug  1 08:59 www.wuhao.org.key

# 合并成一个文件
[root@centos7-mini2 certs]# cd /etc/haproxy/conf.d/ssl/
[root@centos7-mini2 ssl]# cat www.wuhao.org.key www.wuhao.org.crt >www.wuhao.org.pem

1.3 配置https

# 修改配置文件
[root@centos7-mini2 ssl]# cd ..
[root@centos7-mini2 conf.d]# vim test.cfg 
 listen web_https
   bind 192.168.119.147:80
   bind 192.168.119.147:443 ssl crt /etc/haproxy/conf.d/ssl/www.wuhao.org.pem
   balance roundrobin
   server web1 192.168.119.128:80 check inter 3000 fall 3 rise 5
   server web2 192.168.119.138:80 check inter 3000 fall 3 rise 5
[root@centos7-mini2 ~]# systemctl restart haproxy.service

# 后端服务文件
[root@Rocky8-mini ~]# cat /var/www/html/index.html 
192.168.119.128
[root@Rocky8-mini2 ~]# cat /var/www/html/index.html 
192.168.119.138

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

核心组件

Server:服务器,Tomcat运行的进程实例,一个Server中可以有多个service,但通常就一个

Service:服务,用来组织Engine和Connector的对应关系,一个service中只有一个Engine

Connector:连接器,负责客户端的HTTP、HTTPS、AJp等协议连接。一个Connector只属于某一个Engine

Engine:即引擎,用来响应并处理用户请求。一个Engine上可以绑定多个Connector

Host:即虚拟主机,可以实现多虚拟主机。如使用不同的主机头区分

Context:应用的上下文,配置特定URL路径映射和目录的映射关系

根目录结构

  Tomcat中默认网站根目录是$CATALINA_BASE/webapps/,在webapps目录中,有个ROOT目录,他就是默认的根目录。$CATALINA_BASE/webapps/ 下面的每个目录都对应一个web应用,即webApp。
  
  假设将eshop解压后放到 $CATALINA_BASE/webapps/Root 这个目录中;bbs解压后都放在 $CATALINA_BASE/webapps/forum 目录下,则最终网站链接的对应关系如下:

    http://localhost/ 对应eshop的应用webApp,即$CATALINA_BASE/webapps/ROOT/目录
    http;//localhost/forum 对应forum的应用webApp,即$CATALINA_BASE/webapps/forum/

三、tomcat实现多虚拟主机

3.1 安装JDK环境

# 准备好rpm包进行安装
[root@Rocky8-mini ~]# ls
jdk-8u291-linux-x64.rpm

# 安装JDK
[root@Rocky8-mini ~]# dnf -y install jdk-8u291-linux-x64.rpm
[root@Rocky8-mini ~]# java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)

# 初始化环境变量
[root@Rocky8-mini ~]# cat /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/java/default
export PATH=$JAVA_HOME/bin:$PATH
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib
[root@Rocky8-mini ~]# . /etc/profile.d/jdk.sh 
[root@Rocky8-mini ~]# ll /usr/java/
total 0
lrwxrwxrwx 1 root root  16 Jul 31 21:49 default -> /usr/java/latest
drwxr-xr-x 9 root root 286 Jul 31 21:49 jdk1.8.0_291-amd64
lrwxrwxrwx 1 root root  28 Jul 31 21:49 latest -> /usr/java/jdk1.8.0_291-amd64

3.2 二进制安装Tomcat

# 下载安装包
[root@Rocky8-mini ~]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.81/bin/apache-tomcat-8.5.81.tar.gz

[root@Rocky8-mini ~]# tar xf apache-tomcat-8.5.81.tar.gz -C /usr/local/
[root@Rocky8-mini ~]# cd /usr/local/
[root@Rocky8-mini local]# ln -s apache-tomcat-8.5.81/ tomcat

# 指定环境变量
[root@Rocky8-mini local]# echo 'PATH=/usr/local/tomcat/bin:$PATH' > /etc/profile.d/tomcat.sh
[root@Rocky8-mini local]# . /etc/profile.d/tomcat.sh
[root@Rocky8-mini local]# echo $PATH
/usr/local/tomcat/bin:/opt/httpd/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

# 启动和关闭Tomcat
[root@Rocky8-mini local]# startup.sh 
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@Rocky8-mini local]# shutdown.sh
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自启动的service文件
[root@Rocky8-mini ~]# useradd -r -s /sbin/nologin tomcat
[root@Rocky8-mini ~]# cat /usr/local/tomcat/conf/tomcat.conf 
JAVA_HOME=/usr/java/default/jre
[root@Rocky8-mini ~]# chown -R tomcat.tomcat /usr/local/tomcat/
[root@Rocky8-mini ~]# cat /lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
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@Rocky8-mini ~]# systemctl daemon-reload
[root@Rocky8-mini ~]# systemctl enable --now tomcat
[root@Rocky8-mini ~]# systemctl status tomcat.service 
● tomcat.service - Tomcat
   Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2022-07-31 22:40:02 EDT; 1min 43s ago
  Process: 2751 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 2759 (java)
    Tasks: 26 (limit: 11217)
   Memory: 75.2M
   CGroup: /system.slice/tomcat.service
           └─2759 /usr/java/default/jre/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=o>

Jul 31 22:40:02 Rocky8-mini systemd[1]: Starting Tomcat...
Jul 31 22:40:02 Rocky8-mini systemd[1]: Started Tomcat.

3.3 准备网页数据文件,并实现多虚拟主机

[root@Rocky8-mini webapps]# mkdir /data/webapps{1,2}/ROOT -pv
mkdir: created directory '/data/webapps1'
mkdir: created directory '/data/webapps1/ROOT'
mkdir: created directory '/data/webapps2'
mkdir: created directory '/data/webapps2/ROOT'
[root@Rocky8-mini webapps]# echo "website1 www.a.com" > /data/webapps1/ROOT/index.html
[root@Rocky8-mini webapps]# echo "website2 www.b.com" > /data/webapps2/ROOT/index.html

[root@Rocky8-mini tomcat]# pwd
/usr/local/tomcat
[root@Rocky8-mini tomcat]# vim conf/server.xml
      <Host name="www.a.com"  appBase="/data/webapps1/"                 // 网站的名称和数据目录
            unpackWARs="true" autoDeploy="true">
      </Host>

      <Host name="www.b.com"  appBase="/data/webapps2/"
            unpackWARs="true" autoDeploy="true">
      </Host>
[root@Rocky8-mini tomcat]# systemctl restart tomcat.service

3.4 验证

image

image

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

4.1 实验环境

image

4.2 准备两台tomcat服务器,和一台Nginx服务器

# 安装过程不详细阐述
[root@tomcat1 ~]# systemctl status tomcat.service 
● tomcat.service - Tomcat
   Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2022-08-01 04:30:00 EDT; 9min ago
  Process: 3805 ExecStop=/usr/local/tomcat/bin/shutdown.sh (code=exited, status=0/SUCCESS)
  Process: 3834 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 3843 (java)
    Tasks: 26 (limit: 11217)
   Memory: 82.9M
   CGroup: /system.slice/tomcat.service
           └─3843 /usr/java/default/jre/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=o>

Aug 01 04:30:00 tomcat1 systemd[1]: tomcat.service: Main process exited, code=exited, status=143/n/a
Aug 01 04:30:00 tomcat1 systemd[1]: tomcat.service: Failed with result 'exit-code'.

[root@tomcat2 ~]# systemctl status tomcat.service 
● tomcat.service - Tomcat
   Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2022-08-01 16:32:09 CST; 7min ago
  Process: 2806 ExecStop=/usr/local/tomcat/bin/shutdown.sh (code=exited, status=0/SUCCESS)
  Process: 2832 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 2842 (java)
    Tasks: 26 (limit: 11217)
   Memory: 76.6M
   CGroup: /system.slice/tomcat.service
           └─2842 /usr/java/default/jre/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=o>

Aug 01 16:32:09 tomcat2 systemd[1]: tomcat.service: Main process exited, code=exited, status=143/n/a
Aug 01 16:32:09 tomcat2 systemd[1]: tomcat.service: Failed with result 'exit-code'.

[root@proxy ~]# systemctl status nginx.service 
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2022-08-01 16:16:36 CST; 23min ago
  Process: 3858 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 3856 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 3854 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 3859 (nginx)
    Tasks: 3 (limit: 11217)
   Memory: 5.2M
   CGroup: /system.slice/nginx.service
           ├─3859 nginx: master process /usr/sbin/nginx
           ├─3860 nginx: worker process
           └─3861 nginx: worker process

4.3 准备后端Tomcat网页数据

# Tomcat1 网页数据
[root@tomcat1 ~]# mkdir -pv /data/webapps/ROOT
mkdir: created directory '/data/webapps'
mkdir: created directory '/data/webapps/ROOT'
[root@tomcat1 ~]# vim /data/webapps/ROOT/index.html
tomcat1 website
[root@tomcat1 ~]# chown -R tomcat.tomcat /data/webapps

# Tomcat2 网页数据,同Tomcat1
[root@tomcat2 ~]# cat /data/webapps/ROOT/index.html 
tomcate2 website

4.4 编辑proxy服务器配置文件,实现Tomcat的调度

# 配置文件要在http模块中编写
[root@proxy ~]# vim /etc/nginx/nginx.conf
    upstream tomcat {
        server 192.168.119.128:8080;
        server 192.168.119.138:8080;
    }

    location / {
      proxy_pass http://tomcat;
    }
[root@proxy ~]# systemctl restart nginx.service

4.5 Tomcat负载均衡准备

[root@tomcat1 ~]# vim /usr/local/tomcat/conf/server.xml
<Engine name="Catalina" defaultHost="www.wuhao.org">               //默认主机修改成代理服务器的域名

<Host name="www.wuhao.org"  appBase="/data/webapps/"
    unpackWARs="true" autoDeploy="true">
</Host>
[root@tomcat1 ~]# systemctl restart tomcat.service

[root@tomcat2 ~]# vim /usr/local/tomcat/conf/server.xml
Engine name="Catalina" defaultHost="www.wuhao.org">

      <Host name="www.wuhao.org"  appBase="/data/webapps/"
            unpackWARs="true" autoDeploy="true">
      </Host>
[root@tomcat2 ~]# systemctl restart tomcat.service

4.6 验证

[root@Rocky9-mini ~]# cat /etc/hosts                                                // 增加一条域名解析
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.119.146 www.wuhao.org
[root@Rocky9-mini ~]# curl www.wuhao.org/index.html
tomcate2 website
[root@Rocky9-mini ~]# curl www.wuhao.org/index.html
tomcat1 website

五、简述memcached的工作原理

应用程序在工作时需要使用内存存储数据,但对于缓存系统来说,频繁的申请内存,释放内存将会产生大量的内存碎片,最后会导致没有连续的内存使用。

Memcached采用Slab Allocator进制来分配和管理内存。

假设对于一块实际的物理内存,选取其中的一部分采用Memcached进行管理内存。首先会按照1M(默认大小,最大也仅支持1M)的大小(该大小称之为Page)对该内存空间进行划分,得到许多不同的部分,每个部分都是一个Slab。之后按照固定的字节大小对每个Page进行等分,每个等分的部分称之为chunk,chunk中最大的就是Page的大小,一个Page中就一个chunk。Slab按照chunk的大小分组,就组成不同的slab class,slab之间的差异使用Growth Factor控制,默认为1.25。

在存储数据时,选出最合适的Slab Class存储空间进行存储。

posted @   wuhaolam  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示