第十九周作业
一、haproxy https实现
实验环境
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 验证
四、nginx实现后端tomcat的负载均衡调度
4.1 实验环境
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存储空间进行存储。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」