WEB集群之反向代理,动静分离,NFS,mysql,MHA高可用

news2024/9/24 2:33:32

目录

第一章实验架构

1.1.实验图谱架构

1.2.实验前环境部署

第二章实验步骤

2.1.在ha01,ha02上部署keeplived,lvs-dr

2.2.Slave01,slave02安装nginx

2.3.LVS负载均衡

2.4.搭建动态网页

2.5.nginx反向代理

2.6.部署NFS

2.7.安装mysql

2.8.安装mha

2.9.主从复制

开启mha


第一章实验架构

1.1.实验图谱架构

 

1.2.实验前环境部署

systemctl stop firewalld

setenforce 0

主机改名

hostnamectl set-hostname ha01       192.168.233.100

hostnamectl set-hostname ha02       192.168.233.111

hostnamectl set-hostname master01   192.168.233.199

hostnamectl set-hostname slave01     192.168.233.69

hostnamectl set-hostname slave02     192.168.233.186

第二章实验步骤

2.1.在ha01,ha02上部署keeplived,lvs-dr

yum -y install keepalived ipvsadm

 

vim /etc/sysctl.conf                                        #编辑内核参数,添加内容

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

net.ipv4.conf.default.arp_ignore = 1

net.ipv4.conf.default.arp_announce = 2

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.lo.arp_announce = 2

#保存退出后查看配置

#查看内核参数是否配置完成

sysctl  -p

LVS_01和LVS_02安装ipvsadm并启动服务

yum install ipvsadm  -y          #yum安装ipvsadm服务,即LVS负载均衡的真实服务名

systemctl start ipvsadm.service            #开启ipvsadm服务,此步骤启动服务报错

systemctl status ipvsadm.service>1.txt

cat 1.txt

#将ipvsadm服务启动报错提示导给1.txt文件并查看。内容如下截图

ipvsadm-save>/etc/sysconfig/ipvsadm

#报错信息提示是没有/etc/sysconfig/ipvsadm文件,解决方法是将ipvsadm保存到/etc/sysconfig/ipvsadm文件下。

systemctl  restart ipvsadm.service                             #重新启动ipvsadm成功

02也是一样操作 

2.2.Slave01,slave02安装nginx

yum install epel-release -y

yum install nginx -y

systemctl start nginx

#安装epel扩展源,然后安装nginx并启动

systemctl start nginx

 

#修改nginx主页内容,nginx01修改为nginx01 test,nginx02修改nginx02 test

echo nginx01 test >/usr/share/nginx/html/index.html

echo nginx02 test >/usr/share/nginx/html/index.html

#分别在俩台主机测试能否互相访问到定义的静态内容

curl 192.168.233.69

curl 192.168.233.186

 

#2台nginx添加虚拟网卡lo:0并配置ip

ifconfig ens33:1 192.168.233.18 netmask 255.255.255.0

#添加路由192.168.233.18走ens33:1网卡

route add -host 192.168.233.18 dev ens33:1

 

#编辑内核参数,添加内容

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

net.ipv4.conf.default.arp_ignore = 1

net.ipv4.conf.default.arp_announce = 2

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.lo.arp_announce = 2

 

 

2.3.LVS负载均衡

ha1,ha2操作

#yum安装ipvsadm服务,即LVS负载均衡的真实服务名


yum install ipvsadm -y

ipvsadm-save>/etc/sysconfig/ipvsadm

systemctl start ipvsadm.service             不执行这部会报错,应为没有这个文件

 

#安装keepalived.x86_64

yum install keepalived.x86_64 -y

 

#编辑内核文件

vim /etc/sysctl.conf

 

#查看添加内核内容有则成功

sysctl -p

 

#编辑配置文件

vim keepalived.conf

#编辑配置文件

修改内容:

global_defs模块中

smtp_server 127.0.0.1

#改为127.0.0.1即改为本机

router_id LVS_01

#第一条LVS名称改为LVS_01

   #vrrp_skip_check_adv_addr

   #vrrp_strict

   #vrrp_garp_interval 0

   #vrrp_gna_interval 0

#以上4行安全机制添加#号注释掉

 

virtual_ipaddress {

        192.168.30.100

    }

#虚拟主机地址改为要配置的虚拟ip,可配置多个,若只写一个将模板的其他2个删除。

virtual_server 192.168.30.100 80 {            #虚拟ip地址改为配置的虚拟ip和web服务端口号

    delay_loop 6

    lb_algo rr

    lb_kind DR                                                 #模式改为DR模式即直连模式

    persistence_timeout 50

    protocol TCP

 

real_server 192.168.30.12 80 {                         #第一台真实ip地址和web服务端口号

        weight 1

        TCP_CHECK {

#添加TCP_check 注意分号前有空格,检测真实服务器健康状态,即检测后端服务器80端口,若不正常则访问其他台服务器

            connect_port 80

 

#添加连接端口80

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

    real_server 192.168.30.13 80 {                              #第二台真实ip地址和web服务端口号

        weight 1

        TCP_CHECK {

#添加TCP_check 注意分号前有空格,检测真实服务器健康状态,即检测后端服务器80端口,若不正常则访问其他台服务器

            connect_port 80                                                             #添加连接端口80

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

}

 #俩台真实服务器后的所有内容删除即可,修改完成后保存退出。

LVS_02配置文件修改:

scp keepalived.conf 192.168.233.111:/etc/keepalived/

#将配置好的配置文件传到LVS_02服务器上

#第一步修改 router_id LVS_02 名称改为LVS_02

#第二步要修改vrrp_instance VI_1模块中的state为BACKUP,和priority 90改为比主LVS优先级低的等级

 #其他不用修改保存即可

systemctl restart ipvsadm  keepalived                                         #重启服务

ipvsadm  -ln

显示内容:

TCP  192.168.233.18:80 rr persistent 50

  -> 192.168.233.69:80             Route   1      0          0         

  -> 192.168.233.186:80             Route   1      0          1

#查看有2个真实服务器的ip即可,注意二台真实服务器的80端口必须开着才能都检测到

 

 

2.4.搭建动态网页

slave01     与    slave02

安装tomcat,并启动

yum install tomcat -y

Systemctl start tomcat

cd /var/lib/tomcat/webapps

mkdir test

cd test

 

 

 

vim index.jsp                                                                   # 添加动态页面内容:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>

<head>

<title>test</title>

</head>

<body>

<% out.println("动态页面:test tomcat01");%>

</body>

</html>

#页面输出内容为test tomcat01,tomcat02服务器上则将01改为02方便查看实验效果

#创建动态资源页面

 

vim /etc/tomcat/server.xml
#修改主配置文件内容125行,原有内容不需要更改,对比此段内容添加即可

<Host name="localhost"  appBase="webapps"

            unpackWARs="true" autoDeploy="true"

            xmlNamespaceAware="false">

<Context docBase="/var/lib/tomcat/webapps/test"

path="" reloadable="true" />

#指定自己的tomcat页面访问文件路径

 

systemctl restart tomcat
#重启服务在本机分别输入192.168.233.69:8080192.168.233.186:8080测试能否访问到内容

 

 

2.5.nginx反向代理

Slave01      slave02

vim /etc/nginx/conf.d/upstream.conf

#直接在nginx子配置文件夹中创建一个新的子配置文件,因为是yum安装无须在主配置文件中指定子配置文件

文件内容:

upstream nginxtest{

server 192.168.233.69:8080;

server 192.168.233.186:8080;

}


#反向代理模块,将2个tomcat的ip和端口号写入其中,反代模块名称为nginxtest

#server模块中的第一个location模块,指定了根为html,支持主页文件类型三个,注意分号结尾

location  ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {

        root /usr/share/nginx/html;     

}


#server模块中第二个location模块,配置不区分大小写的任意开头只要以.()括号内的任意一个内容结尾则为静态资源访问/usr/share/nginx/html下的页面

location ~ .*\.jsp$ {

proxy_pass http://nginxtest;

proxy_set_header HOST $host;    

proxy_set_header X-Real-IP $remote_addr;            

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

#server模块中第三个location模块,配置不区分大小写的任意开头只要.jsp结尾就由nginx反向代理模块nginxtest进行处理

 

 

2.6.部署NFS

Master01

yum install nfs-utils.x86_64 rpcbind -y                              #安装软件包

mkdir /share                                                                       #创建共享目录

chmod -R 777 /share/                                                       #修改权限

vim /etc/exports                                                                #编辑配置文件

/share *

/share 192.168.233.0/24(rw,sync,no_root_squash)

#共享目录  网段           读写,同步,无root权限

systemctl start rpcbind

systemctl start nfs

exportfs -v

showmount -e                                        #查看本机发布的 NFS 共享目录

 

 

 slave节点

将共享目录挂载到本地

vim /etc/fstab

 

2.7.安装mysql

tee /etc/yum.repos.d/mysql.repo <<EOF

[mysql]

name=mysql5.7

baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-x86_64/

gpgcheck=0

EOF

#换源

yum -y install mysql-community-server

systemctl start mysqld

ss -ntap |grep 3306

 

 

 

登录mysql

mysql -u root -p

grep password /var/log/mysqld.log                                    #过滤出mysql的密码

mysql -u root -p'密码'                                                        #特殊符号用单引号

mysql> alter user root@'localhost' identified by 'Admin@123';             #进去后修改密码

vim /etc/my.cnf

[mysqld]

character-set-server=utf8mb4                                                   #修改字符集

 这里已经安装了,直接登录

 

2.8.安装mha

yum install epel-release.noarch -y

将安装包传到 /opt 下,下载并安装

主节点需要安装

yum install -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm

 

yum install -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpm  

#先安装node再装manager

从节点安装

yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y

在主节点上,基于key验证

ssh-keygen

cd ~

ssh-copy-id 127.0.0.1

 

 

#自己和自己实现免密钥登录

rsync -a .ssh 192.168.233.69:/root/

rsync -a .ssh 192.168.233.186:/root/

#注意.ssh 后不能加/

 

建立mha  文件夹  和配置文件

mkdir /etc/mastermha

vim /etc/mastermha/app1.cnf

[server default]

user=mhauser

password=Admin@123

manager_workdir=/data/mastermha/app1/

manager_log=/data/mastermha/app1/manager.log

remote_workdir=/data/mastermha/app1/

ssh_user=root

repl_user=test

repl_password=Admin@123

ping_interval=1

master_ip_failover_script=/usr/local/bin/master_ip_failover

#report_script=/usr/local/bin/sendmail.sh     可以不加

check_repl_delay=0

master_binlog_dir=/data/mysql/

[server1]

hostname=192.168.233.199

candidate_master=1

[server2]

hostname=192.168.233.69

candidate_master=1

[server3]

hostname=192.168.233.186

 

vim   master_ip_failover

#!/usr/bin/env perl

use strict;

use warnings FATAL => 'all';

use Getopt::Long;

my (

$command, $ssh_user, $orig_master_host, $orig_master_ip,

$orig_master_port, $new_master_host, $new_master_ip, $new_master_port

);

my $vip = '192.168.233.33/24';#设置Virtual IP

my $gateway = '192.168.233.1';#网关Gateway IP

my $interface = 'ens33';

my $key = "1";

my $ssh_start_vip = "/sbin/ifconfig $interface:$key $vip;/sbin/arping -I $interface -c 3 -s $vip $gateway >/dev/null 2>&1";

my $ssh_stop_vip = "/sbin/ifconfig $interface:$key down";

GetOptions(

'command=s' => \$command,

'ssh_user=s' => \$ssh_user,

'orig_master_host=s' => \$orig_master_host,

'orig_master_ip=s' => \$orig_master_ip,

'orig_master_port=i' => \$orig_master_port,

'new_master_host=s' => \$new_master_host,

'new_master_ip=s' => \$new_master_ip,

'new_master_port=i' => \$new_master_port,

);

exit &main();

sub main {

print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";

if ( $command eq "stop" || $command eq "stopssh" ) {

# $orig_master_host, $orig_master_ip, $orig_master_port are passed.

# If you manage master ip address at global catalog database,

# invalidate orig_master_ip here.

my $exit_code = 1;

eval {

print "Disabling the VIP on old master: $orig_master_host \n";

&stop_vip();

$exit_code = 0;

};

if ($@) {

warn "Got Error: $@\n";

exit $exit_code;

}

exit $exit_code;

}

elsif ( $command eq "start" ) {

# all arguments are passed.

# If you manage master ip address at global catalog database,

# activate new_master_ip here.

# You can also grant write access (create user, set read_only=0, etc) here.

my $exit_code = 10;

eval {

print "Enabling the VIP - $vip on the new master - $new_master_host \n";

&start_vip();

$exit_code = 0;

};

exit $exit_code;

}

elsif ( $command eq "start" ) {

# all arguments are passed.

# If you manage master ip address at global catalog database,

# activate new_master_ip here.

# You can also grant write access (create user, set read_only=0, etc) here.

my $exit_code = 10;

eval {

print "Enabling the VIP - $vip on the new master - $new_master_host \n";

&start_vip();

$exit_code = 0;

};

if ($@) {

warn $@;

exit $exit_code;

}

exit $exit_code;

}

elsif ( $command eq "status" ) {

print "Checking the Status of the script.. OK \n";

`ssh $ssh_user\@$orig_master_host \" $ssh_start_vip \"`;

exit 0;

}

else {

&usage();

exit 1;

}

}

# A simple system call that enable the VIP on the new master

sub start_vip() {

`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;

}

# A simple system call that disable the VIP on the old_master

sub stop_vip() {

`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;

}

sub usage {

print

"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";

}

 

mv master_ip_failover  /usr/local/bin/              #脚本文件文件剪切到/usr/local/bin/目录下

chmod +x /usr/local/bin/master_ip_failover                 #添加可执行权限使其可以执行

ifconfig ens33:1 192.168.247.188/24               #MHA配置虚拟ip,主挂掉后虚拟ip到备主上

 

2.9.主从复制

Master执行:

vim  /etc/my.cnf

[mysqld]                                   #此行下添加内容,开启主从复制和二进制日志

server_id=99

log-bin=/data/mysql/mysql-bin

skip_name_resolve=1

general_log                                                                               #添加完毕保存退出

 

mkdir /data/mysql/   -p                                   #创建二进制日志保存路径文件

chown mysql.mysql /data/ -R                             #修改文件夹权限

systemctl restart mysqld                                  #重启mysql服务

mysql -uroot -pAdmin@123

 

#登录数据库

show master status;                              #查看记录二进制日志位置,一会从配置使用

grant replication slave on *.* to test@'192.168.247.%' identified by 'Admin@123';

#建立复制用户

grant all on *.* to mhauser@'192.168.247.%' identified by 'Admin@123';

#建立mha管理账户

 

两个slave设置

 vim  /etc/my.cnf                       #[mysqld]此行下添加内容,开启主从复制和二进制日志

server_id=100                                        #两台ID不一样,前大后小

log-bin=/data/mysql/mysql-bin

relay-log=relay-log-bin

relay-log-index=slave-relay-bin.index

skip_name_resolve=1

general_log 

 

 

 mkdir /data/mysql/  -p                                  #创建二进制日志保存路径文件

chown mysql.mysql /data/ -R                                   #修改文件夹权限

systemctl restart mysqld                                           #重启mysql服务

mysql -uroot -pAdmin@123                                            #登录数据库

CHANGE MASTER TO

   MASTER_HOST='192.168.233.199',

  MASTER_USER='test',

  MASTER_PASSWORD='Admin@123',

  MASTER_PORT=3306,

  MASTER_LOG_FILE='mysql-bin.000001',

  MASTER_LOG_POS=744;                                        # 这个会变化配置master信息

start slave                                                               #开启主从复制   

show slave status\G                                         #查看配置是否成功

 

 

MHA服务器上检查 mha 环境并启动mha

masterha_check_ssh --conf=/etc/mastermha/app1.cnf           #检查mha的ssh免密登录环境

 

重新配置免密登录

 

masterha_check_repl --conf=/etc/mastermha/app1.cnf                       #检查mha主从环境

MySQL Replication Health is OK.                            #结尾行出现此信息表示无问题

 再次验证

 

开启mha

masterha_check_status --conf=/etc/mastermha/app1.cnf

#查看mha状态,默认是停止状态stop

 

#开启MHA,默认是前台运行,生产环境一般为后台执行

nohup masterha_manager --conf=/etc/mastermha/app1.cnf &> /dev/null

 

#非后台需要等待较长时间启动成功,此过程为前台运行,需要重新开一个窗口去查看状态即可

masterha_manager --conf=/etc/mastermha/app1.cnf

#查看状态

masterha_check_status --conf=/etc/mastermha/app1.cnf

 

至此实验成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/431075.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

教你安装 CodeWhisperer: 一款个人免费的类似GitHubCopilot能代码补全的 AI 编程助手

1、官网 AI Code Generator - Amazon CodeWhisperer - AWS 官方扩展安装教程 2、安装VSCode 下载安装VSCode 3、VSCode安装CodeWhisperer插件 安装VSCode插件 - AWS Toolkit主侧栏&#xff0c;点击AWS &#xff0c;展开CodeWhisperer&#xff0c;点击Start 在下拉菜单中点…

洗浴中心管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a; 更多系统资源库地址&#xff1a;骚戴的博客_CSDN_更多系统资源 更多系统…

煤矿井下人员精准定位系统,煤矿应急救援高效应用

煤矿行业的安全发展&#xff0c;事关数人民群众的生命财产安全。自2020年起&#xff0c;国家连续三年出台煤矿智能化建设及重大风险防控的相关指导政策&#xff0c;其中&#xff0c;2022年出台的《煤矿及重点非煤矿山重大灾害风险防控建设工作总体方案》中提到&#xff0c;要充…

52 openEuler搭建PostgreSQL数据库服务器-管理数据库角色

文章目录52 openEuler搭建PostgreSQL数据库服务器-管理数据库角色52.1 创建角色创建角色示例52.2 查看角色查看角色示例52.3 修改角色52.3.1 修改用户名52.3.2 修改用户示例52.3.3 修改用户密码52.3.4 修改角色密码示例52.4 删除角色删除角色示例52.5 角色授权角色授权示例52.6…

Python旅游好帮手:提前15天准备五一旅游景点详细数据

人生苦短&#xff0c;我用python 虽然还是有15天才放五一的假&#xff0c; 但是我的心早已经在旅游的路上了~ 本文源码&#xff1a;点击此处跳转文末名片获取 趁现在&#xff0c;先来用python做一个旅游攻略 知识点&#xff1a; requests parsel csv 第三方库&#x…

python查看时间序列数据的季节规律matplotlib画时间(10分钟为间隔)序列坐标

目录0 问题描述1. 案例12. 案例2参考资料0 问题描述 将多个时间序列数据&#xff0c;绘制到一张图上&#xff0c;每段时间序列数据一般只有几个月&#xff0c;少则 1 个月左右&#xff0c;想看它们的季节规律&#xff0c;需要去除年份&#xff0c;只看月份。 也就是横轴是1月…

44.CSS Grid布局概述

什么是CSS Grid&#xff1f; ● CSS Grid 是一组用于构建二维布局的 CSS 属性 ● CSS Grid 背后的主要思想是我们将容器元素划分为行和列&#xff0c;这些行和列可以填充是子元素。 ● 在两段式语境中&#xff0c;CSS网格允许我们写出更少的嵌套HTML和更容易阅读的CSS ● CSS …

二分查找原理及使用场景

建议使用左闭右开区间[l, r)查找。二分查找的最后&#xff0c;索引l&#xff0c;r会落到右区间第一个元素位置。因此但凡是能够见数组分成左右两个区间的都能应用二分查找法。 1、普通查值 常见问题方式&#xff1a;寻找含重复值的有序数组 [...,a, tar, tar, tar,.b....]&am…

AI制药 - RCSB PDB 数据集的多维度分析与整理 (1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/130089781 整体&#xff1a; RCSB PDB 数据集是一个收集了蛋白质的三维结构信息的数据库&#xff0c;是世界蛋白质数据库&#xff08;…

SQL SERVER调Web Service时候权限错误的解决

日期 2023/4/15 18:00:00 日志 作业历史记录 (AIPACS) 步骤 ID 1 服务器 GOOGLE 作业名称 AIPACS 步骤名称 RUNWS 持续时间 00:00:00 SQL 严重性 16 SQL 消息 ID 15281 已通过电子邮件通知的操作员 已通过…

MATLAB 基于空间格网的点云抽稀 (3)

MATLAB 基于空间格网的点云抽稀 (3) 一、实现效果二、原理步骤三、代码实现四、重点函数与对象的解释说明4.1 indices= pcbin(incloud,[rowNum colNum LayerNum]);4.2 occupancyGrid = cellfun(@(c) ~isempty(c), indices);4.3 outpointIndex = [];4.4 outpointIndex(end+1) …

基于ubuntu18.04上搭建OpenWRT-rtd1619环境

下载OpwnWRT的源码 下载路径&#xff1a;https://gitee.com/yangquan3_admin/rtd1619 您需要以下工具来编译 OpenWrt&#xff0c;包名称因发行版而异。 在 Build System Setup 文档中可以找到包含特定于发行版的软件包的完整列表。 binutils bzip2 diff find flex gawk gcc-6…

【Linux进阶篇】系统网络附加存储

目录 &#x1f341;NFS &#x1f342;软件安装 &#x1f342;服务端配置 &#x1f342;客户端配置 &#x1f342;访问浏览器测试 &#x1f341;iscsi &#x1f342;服务器端安装软件 &#x1f342;服务器端配置iscsi &#x1f342;客户端软件安装配置 &#x1f341;常用的端口号…

这6个免费去水印工具,一定要码住!

现在很多平台会在用户保存图片/视频的时候自动给视频添加一个平台的水印&#xff0c;这在一定程度上影响了它的美观和使用。 下面我来分享几个图片/视频一键去水印方法&#xff0c;操作简单还不会损坏画质哦&#xff01; 1. Magic Eraser 这是一个魔术橡皮擦在线网站&#x…

一文了解API接口自动化测试:让你在人才市场上无往不利

目录&#xff1a;导读 引言 架构 接口测试 API自动化测试 前后端分离的开发模式 测试工作&#xff1a; 协议 网络分层 三次握手的设计(很重要) 问题&#xff1a; URL:统一资源定位符 HTTP协议 &#xff08;重点&#xff09;HTTP的完整请求流程&#xff1a; 通信模…

springboot项目集成JWT实现身份认证(权鉴)

一、什么是JWT JSON Web Token (JWT)&#xff0c;它是目前最流行的跨域身份验证解决方案。现在的项目开发一般都是前端端分离&#xff0c;这就涉及到跨域和权鉴问题。 二、JWT组成 由三部分组成&#xff1a;头部(Header)、载荷(Payload)与签名(signature) 头部&#xff08;Head…

[测试新人必看] 测试报告如何编写? 掌握这五十个测试报告模板

作为一个曾经是测试萌新的我&#xff0c;在首次接收到一个任务时总有一种忐忑慌张激动紧张期望的复杂情绪~~ 忐忑慌张紧张是怕自己做不好&#xff0c;得不到领导的赏识&#xff1b;激动期望是哇塞&#xff0c;我有任务了耶&#xff0c;终于有我的用武之地了~~~ 就好比今天的主题…

Android 实现控件对称布局(约束布局和线性布局)

画界面时会遇到很多界面上的布局&#xff0c;虽然很简单&#xff0c;但是每次做起来不熟练&#xff0c;总结一下一些日常的 一.实现界面上的两个空间对称布局 方法一、用约束布局的guideLine.适用于两个控件不确定宽高&#xff0c;且约束条件较多 Guideline是只能用在Constra…

linux安装并发送邮件

linux安装、配置并发送邮件&#xff08;以CentOS7.9为例&#xff09; 1、安装邮箱软件 yum install mailx -y2、 配置邮箱&#xff08;以qq邮箱为例&#xff09; 2.1 网页访问并登录&#xff1a;https://mail.qq.com/ 2.2 选择“设置->账户” 2.3 在账户下面找到POP3/IMAP/…

【广州华锐互动】VR数字虚拟展厅为企业提升品牌形象和知名度

VR数字虚拟展厅是一种利用虚拟现实技术来展示企业产品和服务的全新宣传方式&#xff0c;与传统展厅相比具有出色的互动功能和沉浸体验感&#xff0c;参观者可以随时随地进入虚拟环境中进行参观&#xff0c;感受全新视听觉的体验。 VR数字虚拟展厅能够带来很多优势和好处&#x…