Nginx+Keepalived双机热备(主主模式)

2023-11-09

Keepalived介绍

Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeatcorosyncpacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvshaproxynginx)一起工作来达到集群的高可用。

Keepalived VRRP协议将两台或多台路由器设备虚拟成一个虚拟路由器,对外提供虚拟路由器IP(一个或多个)

而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER,或者是通过算法选举产生;

MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等;

其他设备不拥有该IP,状态是BACKUP,除了接收MASTERVRRP状态通告信息外,不执行对外的网络功能。

当主机失效时,BACKUP将接管原先MASTER的网络功能。

 

双机高可用有两种:

     1双机主从模式:即前端使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。

     2双机主主模式:即前端使用两台负载均衡服务器,互为主备,且都处于活动状态,同时各自绑定一个公网虚拟IP,提供负载均衡服务;当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟IP(这时由非故障机器一台负担所有的请求)。这种方案,经济实惠,非常适合于当前架构环境。

 

      本文将搭建Nginx+Keepalived实现高可用的双机主主模式

 

一、环境说明

 

      操作系统:centos7 64

      软件源:阿里云

     2台服务器(node1node2)安装keepalived和安装nginx来反向代理

     2台服务器(node3node4)安装nginx来提供服务

      服务器的防火墙和selinux全部关闭

     node1  IP192.168.25.162

     node2  IP192.168.25.163

     node3 IP192.168.25.164

     node4 IP192.168.25.165

      虚拟IP192.168.25.100192.168.25.200

       

 

说明: 3d3c680074955011afc2504eaf1568a7.jpg-wh_

二、环境安装

 

首先安装nginx,每台服务器都要安装,前端2台服务器的nginx用作反向代理,后端2台服务器提供web服务。

安装依赖包:

  [root@node1src]# yum install  -y gcc make pcre-devel zlib-devel openssl-devel

 

 去官网下载nginx软件包,网址为http:// http://nginx.org/

 [root@node1~]# cd /usr/local/src/

 [root@node1~]# wget http://nginx.org/download/nginx-1.13.6.tar.gz

 

解压到当前路径:

[root@node1src]# tar xf nginx-1.13.6

 

进入到解压好的目录,编译安装:

[root@node1src]#./configure--user=nginx --group=nginx --prefix=/usr/local/nginx--with-http_stub_status_module --with-http_ssl_module --with-pcre

[root@node1src]# make && make install

 

创建nginx用户,并启动nginx服务:

[root@node1src]# useradd nginx

[root@node1src]# /usr/local/nginx/sbin/nginx

 

至此,nginx的安装完成,其余3台服务器也按照同样的操作安装nginx

接下来为后端2web服务器创建简单的首页

[root@node3 ~]#echo “node3” > /usr/local/nginx/html/index.html

[root@node4 ~]#echo “node4” > /usr/local/nginx/html/index.html

 

进行简单的访问测试:

[root@node1 ~]#curl 192.168.25.164

node3

[root@node1 ~]#curl 192.168.25.165

node4

 

接下来,就是要在前端的2台服务器做nginx的反向代理

编辑nginx的配置文件:

[root@node1~]#vim /usr/local/nginx/conf/nginx.conf

添加upstream模块:注意该模块要在http模块里,server模块外

upstream backend{

server 192.168.25.164max_fails=3 fail_timeout=10s;

server 192.168.25.165max_fails=3 fail_timeout=10s;

    }

 

每个设备的状态设置为:

1.down 表示单前的server暂时不参与负载

2.weight 默认为1.weight越大,负载的权重就越大。

3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误

4.fail_timeout:max_fails次失败后,暂停的时间。

5.backup:其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

 

server里添加一个location模块:

location / {

proxy_passhttp://backend;

proxy_set_header  Host            $host;

proxy_set_header  X-Real-IP       $remote_addr;

proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;

}

proxy_set_header指令就是该模块需要读取的配置文件。在这里,所有设置的值的含义和http请求同中的含义完全相同,除了Host外还有X-Forward-For

Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而如果后端真是的服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败【默认反向代理服务器会向后端真实服务器发送请求,并且请求头中的host字段应为proxy_pass指令设置的服务器】。

 

保存退出并确认配置文件没错之后,重启nginx服务

[root@node1 ~]#/usr/local/nginx/sbin/nginx -t

nginx:theconfiguration file/usr/local/nginx/conf/nginx.conf syntax is ok

nginx:configurationfile/usr/local/nginx/conf/nginx.conf test is successful

[root@node1 ~]#/usr/local/nginx/sbin/nginx -s reload

 

检测是否实现负载均衡:

[root@node1 ~]#curl192.168.25.162

node3

[root@node1 ~]#curl 192.168.25.162

node4

[root@node1 ~]#curl 192.168.25.162

node3

[root@node1 ~]#curl 192.168.25.162

node4

 

可以发现,每次访问时,前端服务器会将请求均衡地转到后端服务器

在另一台反向代理服务器也进行同样的操作配置nginx反向代理

 

接下来为前端的2台服务器安装keepalived

[root@node1 ~]#yum install -y keepalived

[root@node2 ~]#yum install -y keepalived

编辑keepalived文件:

为了实现双机主主模式,我们需要创建2VIP

 

先编辑第一台(node1)的keepalived配置文件:

[root@node1~]#vim /etc/keepalived/keepalived.conf

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

global_defs {

       notification_email {             #邮件接收者

       root@localhost

   }

   notification_email_fromkeepalived@localhost #邮件发送者

   smtp_server 127.0.0.1            #邮件服务器地址

   smtp_connect_timeout 30           #超时时限

   router_id xhk                #此处注意router_id为负载均衡标识

   vrrp_mcast_group4 224.0.100.19       #添加ipv4的多播地址,并确保多播功能启用

}

  

vrrp_script check_nginx { 

    script /root/1.sh           #检测脚本

    interval 2              #每隔2秒钟检测一次

    weight -2               #优先级减去2 

}

  

vrrp_instance VI_1 {

    state MASTER                 #状态只有MASTER和BACKUP两种

    interface ens32        #网络接口

    virtual_router_id 51      #虚拟路由标识,同一个instance的MASTER和BACKUP一致的

    priority 100           #优先级,同一个instance的MASTER优先级必须比BACKUP高

    advert_int 1          #MASTER 与 BACKUP之间同步检查的时间间隔,单位为秒

    authentica0tion {

        auth_type PASS     #验证authentication。包含验证类型和验证密码

        auth_pass node     #AH使用时有问题。验证密码为明文

    }

    virtual_ipaddress {

        192.168.25.100 dev ens32 #虚拟ip地址,可以有多个地址

    }

          track_script {   #运行上面所写的检测脚本

        check_nginx

    }

}

  

  

vrrp_instance VI_2 {

    state BACKUP

    interface ens32

    virtual_router_id 52

    priority 99

      nopreempt

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 123456

    }

    virtual_ipaddress {

        192.168.25.200 dev ens32

    }

          track_script {     

        check_nginx 

    } 

}

 

 

再去编辑第二台服务器(node2)的keepalived配置文件:

[root@node2 ~]#vim /etc/keepalived/keepalived.conf

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

global_defs {

   notification_email {

       root@localhost

   }

   notification_email_fromkeepalived@localhost

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id xhk

   vrrp_mcast_group4 224.0.100.19

}

vrrp_script check_nginx {

    script"/root/1.sh"       

    interval 2           

    weight -2          

}  

  

vrrp_instance VI_1 {

    state BACKUP

    interface ens32

    virtual_router_id 51

    priority 99

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass node

    }

    virtual_ipaddress {

        192.168.25.100 dev ens32

    }

          track_script {

        check_nginx

    }

}

  

  

vrrp_instance VI_2 {

    state MASTER

    interface ens32

    virtual_router_id 52

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 123456

    }

    virtual_ipaddress {

        192.168.25.200 dev ens32

    }

      track_script {

        check_nginx 

    } 

}

  

附上检测nginx反向代理的脚本:

[root@node1 ~]#vim /root/1.sh

1

2

3

4

5

6

7

8

9

10

#!/bin/bash

ps -C nginx -o pid

if [ $? -eq 1 ];then

    /usr/local/nginx/sbin/nginx

    sleep 3

    ps -C nginx -o pid 

    if [ $? -eq 1 ];then

        systemctl stop keepalived

    fi

fi

 

为脚本添加执行权限

[root@node1 ~]#chmod a+x /root/1.sh

 

node2也创建以上同样的脚本

 

启动keepalived服务并设置开机自启动:

[root@node1 ~]#systemctl start keepalived

[root@node1 ~]#systemctl enable keepalived

 

[root@node2 ~]#systemctl start keepalived

[root@node2 ~]#systemctl enable keepalived

 

查看keepalived服务状态

[root@node1 ~]#systemctl status keepalived

●keepalived.service - LVS and VRRP HighAvailability Monitor

  Loaded:loaded(/usr/lib/systemd/system/keepalived.service; disabled; vendorpreset:disabled)

  Active: active (running) sinceFri 2017-11-18 00:09:48EDT;28s ago

  Process:2712ExecStart=/usr/sbin/keepalived$KEEPALIVED_OPTIONS(code=exited,status=0/SUCCESS)

 Main PID:2713 (keepalived)

  CGroup:/system.slice/keepalived.service

          ├─2306nginx: masterprocess /usr/local/nginx/sbin/nginx

          ├─2308nginx: workerprocess

          ├─2713/usr/sbin/keepalived-D

          ├─2714/usr/sbin/keepalived-D

          └─2715/usr/sbin/keepalived-D

 

[root@node2 ~]#systemctl status keepalived

●keepalived.service - LVS and VRRP HighAvailability Monitor

  Loaded:loaded(/usr/lib/systemd/system/keepalived.service; disabled; vendorpreset:disabled)

  Active: active (running) sinceFri 2017-11-18 00:09:59EDT;29s ago

 Process:2763ExecStart=/usr/sbin/keepalived$KEEPALIVED_OPTIONS(code=exited,status=0/SUCCESS)

 Main PID:2764 (keepalived)

  CGroup:/system.slice/keepalived.service

          ├─2353nginx: masterprocess /usr/local/nginx/sbin/nginx

          ├─2355nginx: workerprocess

          ├─2764/usr/sbin/keepalived-D

          ├─2765/usr/sbin/keepalived-D

          └─2766/usr/sbin/keepalived-D

 

接下来就是测试环节

由于node1设置MASTERVIP192.168.25.100,所以可以看到node1有一个VIP192.168.25.100

[root@node1 ~]#ip addr sh

1: lo:<LOOPBACK,UP,LOWER_UP> mtu65536 qdisc noqueue stateUNKNOWN qlen 1

   link/loopback00:00:00:00:00:00brd 00:00:00:00:00:00

   inet 127.0.0.1/8 scopehostlo

      valid_lftforeverpreferred_lft forever

   inet6 ::1/128 scopehost

      valid_lftforeverpreferred_lft forever

2:ens32:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdiscpfifo_fast state UPqlen1000

   link/ether00:0c:29:0e:bc:15brd ff:ff:ff:ff:ff:ff

   inet 192.168.25.162/24brd192.168.25.255 scope global dynamic ens32

      valid_lft1586secpreferred_lft 1586sec

   inet 192.168.25.100/32 scopeglobalens32

      valid_lftforeverpreferred_lft forever

   inet6fe80::20c:29ff:fe0e:bc15/64scope link

      valid_lftforeverpreferred_lft forever

 

node2上设置MASTERVIP192.168.25.200

[root@node2 ~]#ip addr sh

1: lo:<LOOPBACK,UP,LOWER_UP> mtu65536 qdisc noqueue stateUNKNOWN qlen 1

   link/loopback00:00:00:00:00:00brd 00:00:00:00:00:00

   inet 127.0.0.1/8 scopehostlo

      valid_lftforever preferred_lft forever

   inet6 ::1/128 scopehost

      valid_lftforeverpreferred_lft forever

2:ens32:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdiscpfifo_fast state UPqlen1000

   link/ether00:0c:29:82:ca:01brd ff:ff:ff:ff:ff:ff

   inet 192.168.25.25/24brd192.168.25.255 scope global dynamic ens32

      valid_lft1772secpreferred_lft 1772sec

   inet 192.168.25.200/32 scopeglobalens32

      valid_lftforeverpreferred_lft forever

   inet6fe80::20c:29ff:fe82:ca01/64scope link

      valid_lftforeverpreferred_lft forever

 

进行访问,能够看到前端服务器将请求均衡转到后端服务器

[root@clinet ~]#curl 192.168.25.100

node3

[root@clinet ~]#curl 192.168.25.100

node4

[root@clinet ~]#curl 192.168.25.200

node3

[root@clinet ~]#curl 192.168.25.200

node4

 

接下来测试前端服务器nginx服务停掉的状态,首先会尝试启动nginx,结果启动nginx服务成功,网页正常访问

[root@node1 ~]#/usr/local/nginx/sbin/nginx -s stop

[root@node1 ~]#systemctl status keepalived

●keepalived.service - LVS and VRRP HighAvailability Monitor

  Loaded:loaded(/usr/lib/systemd/system/keepalived.service; disabled; vendorpreset:disabled)

  Active: active (running) sinceFri 2017-11-18 00:09:48EDT;18min ago

  Process:2712ExecStart=/usr/sbin/keepalived$KEEPALIVED_OPTIONS (code=exited,status=0/SUCCESS)

 Main PID:2713 (keepalived)

  CGroup:/system.slice/keepalived.service

          ├─2713/usr/sbin/keepalived-D

          ├─2714/usr/sbin/keepalived-D

          ├─2715/usr/sbin/keepalived -D

          ├─4375nginx: masterprocess /usr/local/nginx/sbin/nginx

          └─4377nginx: workerprocess

 

Oct 20 00:08:13 node1Keepalived_vrrp[2715]:Sending gratuitous ARP onens32 for 192.168.25.200

Oct 20 00:08:13 node1Keepalived_vrrp[2715]:Sending gratuitous ARP onens32 for 192.168.25.200

Oct 20 00:08:13 node1Keepalived_vrrp[2715]:Sending gratuitous ARP onens32 for 192.168.25.200

Oct 20 00:08:13 node1Keepalived_vrrp[2715]:Sending gratuitous ARP onens32 for 192.168.25.200

Oct 20 00:08:16 node1Keepalived_vrrp[2715]:VRRP_Instance(VI_2)Received advert with higher priority100, ours 99

Oct 20 00:08:16 node1Keepalived_vrrp[2715]:VRRP_Instance(VI_2)Entering BACKUP STATE

Oct 20 00:08:16 node1Keepalived_vrrp[2715]:VRRP_Instance(VI_2)removing protocol VIPs.

Oct 20 00:26:05 node1Keepalived_vrrp[2715]:VRRP_Script(check_nginx)timed out

Oct 20 00:26:05 node1Keepalived_vrrp[2715]:/root/1.sh exited due tosignal 15

Oct 20 00:26:05 node1Keepalived_vrrp[2715]:VRRP_Script(check_nginx)succeeded

[root@node1 ~]#ps -ef | grep nginx

root      4375     1 0 00:26?        00:00:00 nginx:masterprocess/usr/local/nginx/sbin/nginx

nginx     4377  4375 0 00:26 ?       00:00:00nginx:worker process

root      4431  2222 0 00:26 pts/0    00:00:00grep--color=auto nginx

 

可以看到,keepalived每隔2秒运行的nginx检测脚本,发现nginx停掉的时候,尝试启动nginx,启动成功!

 

接下来测试nginx起不来的情况

为了模拟nginx起不来的情况,修改一下脚本,检测nginx不提供服务,就停掉keepalived服务

[root@node1 ~]#vim /root/1.sh

1

2

3

4

5

#!/bin/bash

ps -C nginx -o pid

if [ $? -eq 1 ];then

        systemctl stop keepalived

fi

 

先停掉nginx服务

[root@node1 ~]#ps -ef |grep nginx |awk '{print $2}' |xargs kill -9

[root@node1 ~]#ps -ef |grep nginx

root      5390  2222 0 00:51pxs/0    00:00:00 grep --color=auto nginx

 

发现keepalived自动停掉

[root@node1 ~]#systemctl status keepalived

●keepalived.service - LVS and VRRP HighAvailability Monitor

  Loaded:loaded(/usr/lib/systemd/system/keepalived.service; disabled; vendorpreset:disabled)

  Active: inactive (dead)

 

Oct 20 00:38:50 node1Keepalived_vrrp[5400]:Opening file'/etc/keepalived/keepalived.conf'.

Oct 20 00:39:07 node1Keepalived_vrrp[5400]:VRRP_Instance(VI_1)removing protocol VIPs.

Oct 20 00:39:07 node1Keepalived_vrrp[5400]:VRRP_Instance(VI_2)removing protocol VIPs.

Oct 20 00:39:07 node1Keepalived_vrrp[5400]:SECURITY VIOLATION -scripts are being executed butscript_security n...bled.

Oct 20 00:39:07 node1Keepalived_vrrp[5400]:Using LinkWatch kernelnetlink reflector...

Oct 20 00:39:07 node1Keepalived_vrrp[5400]:VRRP_Instance(VI_2)Entering BACKUP STATE

Oct 20 00:39:07 node1Keepalived_vrrp[5400]:VRRP sockpool: [ifindex(2),proto(112), unicast(0),fd(10,11)]

Oct 20 00:39:07 node1Keepalived[5398]:Stopping

Oct 20 00:39:07 node1systemd[1]: StoppingLVS and VRRP HighAvailability Monitor...

Oct 20 00:39:09 node1systemd[1]: Stopped LVSand VRRP High AvailabilityMonitor.

Hint: Some lineswere ellipsized, use -lto show in full.

 

可以发现VIP都自动跳到另一台前端服务器(node2)上

[root@node2 ~]#ip add sh

1: lo:<LOOPBACK,UP,LOWER_UP> mtu65536 qdisc noqueue stateUNKNOWN qlen 1

   link/loopback00:00:00:00:00:00brd 00:00:00:00:00:00

   inet 127.0.0.1/8 scopehostlo

      valid_lftforeverpreferred_lft forever

   inet6 ::1/128 scopehost

      valid_lftforeverpreferred_lft forever

2:ens32:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdiscpfifo_fast state UPqlen1000

   link/ether00:0c:29:82:ca:01brd ff:ff:ff:ff:ff:ff

   inet 192.168.25.25/24brd192.168.25.255 scope global dynamic ens32

      valid_lft1598secpreferred_lft 1598sec

   inet 192.168.25.200/32scopeglobalens32

      valid_lftforeverpreferred_lft forever

   inet 192.168.25.100/32scopeglobalens32

      valid_lftforeverpreferred_lft forever

   inet6fe80::20c:29ff:fe82:ca01/64scope link

      valid_lftforeverpreferred_lft forever

 

网页正常访问

    [root@clinet~]#curl 192.168.25.200

    node3

    [root@clinet~]#curl 192.168.25.200

    node4

    [root@clinet~]#curl 192.168.25.100

    node3

    [root@clinet~]#curl 192.168.25.100

    node4

 


转载于:https://blog.51cto.com/13416341/1983581

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx+Keepalived双机热备(主主模式) 的相关文章

  • 如何解决Mybatis-plus与Mybatis不兼容的问题:An attempt was made to call a method that does not exist. The attempt

    博主猫头虎的技术世界 欢迎来到 猫头虎的博客 探索技术的无限可能 专栏链接 精选专栏 面试题大全 面试准备的宝典 IDEA开发秘籍 提升你的IDEA技能 100天精通Golang Go语言学习之旅 领域矩阵 猫头虎技术领域矩阵 深入探索各技
  • 【计算机毕业设计】实验室预约管理

    身处网络时代 随着网络系统体系发展的不断成熟和完善 人们的生活也随之发生了很大的变化 人们在追求较高物质生活的同时 也在想着如何使自身的精神内涵得到提升 而读书就是人们获得精神享受非常重要的途径 为了满足人们随时随地只要有网络就可以看书的要
  • SRC漏洞挖掘经验+技巧篇

    一 漏洞挖掘的前期 信息收集 虽然是前期 但是却是我认为最重要的一部分 很多人挖洞的时候说不知道如何入手 其实挖洞就是信息收集 常规owasp top 10 逻辑漏洞 重要的可能就是思路猥琐一点 这些漏洞的测试方法本身不是特别复杂 一般混迹
  • 每天10个前端小知识 <Day 7>

    前端面试基础知识题 1 什么是尾调用优化和尾递归 尾调用的概念非常简单 一句话就能说清楚 就是指某个函数的最后一步是调用另一个函数 function f x return g x 上面代码中 函数f的最后一步是调用函数g 这就叫尾调用 尾调
  • 每天10个前端小知识 <Day 8>

    1 Javascript中如何实现函数缓存 函数缓存有哪些应用场景 函数缓存 就是将函数运算过的结果进行缓存 本质上就是用空间 缓存存储 换时间 计算过程 常用于缓存数据计算结果和缓存对象 缓存只是一个临时的数据存储 它保存数据 以便将来对
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • 基于java的饮食分享平台系统设计与实现

    基于java的饮食分享平台系统设计与实现 I 引言 A 研究背景和动机 近年来 随着人们生活水平的提高和健康意识的增强 饮食健康已经成为越来越多人的关注焦点 因此 一个方便快捷的饮食分享平台就显得尤为重要 基于Java的饮食分享平台系统设计
  • 软件测试|web自动化测试神器playwright教程(三十八)

    简介 在我们使用selenium时 我们可以获取元素的属性 元素的文本值 以及输入框的内容等 作为比selenium更为强大的web自动化测试神器 playwright也可以实现对元素属性 文本值和输入框内容的抓取 并且实现比seleniu
  • 【计算机毕业设计】springbootstone音乐播放器的设计与实现

    随着我国经济的高速发展与人们生活水平的日益提高 人们对生活质量的追求也多种多样 尤其在人们生活节奏不断加快的当下 人们更趋向于足不出户解决生活上的问题 stone音乐播放器展现了其蓬勃生命力和广阔的前景 与此同时 为解决用户需求 stone
  • HTML概述、基本语法(表格整理、标签、基本结构)

    一 HTML概述 HTML指的是超文本标记语言 超文本 是指页面内可以包含图片 链接 声音 视频等内容 标记 标签 通过标记符号来告诉浏览器页面该如何显示 我们可以打开浏览器 右击页面 点击 查看网页源代码 来方便了解HTML标签通过浏览器
  • Vue 如何使用WebSocket与服务器建立链接 持续保持通信

    WebSocket 浏览器通过JavaScript向服务器发出建立WebSocket链接的请求 链接建立后 客户端和服务器端就可以通过TCP链接直接交互数据 WebSocket链接后可以通过 send 方法来向服务器发送数据 并通过 onn
  • Kubernetes (十一) 存储——Secret配置管理

    一 简介 从文件创建 echo n admin gt username txt echo n westos gt password txt kubectl create secret generic db user pass from fi
  • Kubernetes (十二) 存储——Volumes配置管理

    一 卷的概念 官方地址 卷 Kubernetes https v1 24 docs kubernetes io zh cn docs concepts storage volumes 二 卷的类型及使用 emptyDir卷 1 创建编辑文件
  • SpringBoot中整合MybatisPlus快速实现Mysql增删改查和条件构造器

    场景 Mybatis Plus 简称MP 是一个Mybatis的增强工具 只是在Mybatis的基础上做了增强却不做改变 MyBatis Plus支持所有Mybatis原生的特性 所以引入Mybatis Plus不会对现有的Mybatis构
  • 面试官:分库分表后如何生成全局ID?

    分库分表后就不能使用自增 ID 来作为表的主键了 因为数据库自增 ID 只适用于单机环境 但如果是分布式环境 是将数据库进行分库 分表或数据库分片等操作时 那么数据库自增 ID 就会生成重复 ID 从而导致业务查询上的问题 所以此时 可以使
  • 考虑光伏出力利用率的电动汽车充电站能量调度策略研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • 考虑光伏出力利用率的电动汽车充电站能量调度策略研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • 服务器中E5和I9的区别是什么,如何选择合适的配置

    随着科技的进步 服务器处理器的性能在不断攀升 其中 Intel的E5和I9系列处理器在业界具有广泛的影响力 而当我们在选择服务器的时候会有各种各样的配置让我们眼花缭乱不知道该怎么去选择 下面我跟大家分享一下E5跟I9有什么区别 方便我们在选
  • 【安全-SSH】SSH安全设置

    今天发现自己的公有云服务器被攻击了 在这里插入图片描述 https img blog csdnimg cn direct cafdca04646f4b8b838400ec79ac282f png 然后查看了登录日志 如上图 ls sh va
  • 如何在 Python 脚本中使用 Google OAuth2

    在使用 Python 脚本将视频上传到 YouTube 频道时 若希望将视频上传到第二个频道 需要解决 OAuth2 授权的问题 解决方案 创建新的 Google Cloud 项目 from google oauth2 import ser

随机推荐

  • Blender 2.8安装插件及如何找到打开插件

    安装插件 编辑 设置 插件 搜索 下载 安装 找到插件 安装的插件可在其下拉列表中看到所在位置 实在找不到 直接搜索
  • Java BigDecimal总结

    文章目录 Java BigDecimal总结 概述 float 和 double的问题 创建BigDecimal对象 BigDecimal valueOf 源码分析 equals 和 compareTo BigDecimal设置精度和舍入模
  • Kioptrix_Level_1-writeup

    Kioptrix Level 1 writeup 0x00 信息收集 目标机器IP 16 16 16 176 kali攻击机 16 16 16 177 nmap扫描端口服务 nmap A Pn 16 16 16 176 Starting N
  • 如何安装JDK

    Orade 公司提供了多种操作系统的 JDK 不同操作系统的 JIDK 在使用上基本类似 初学者可以根据自已使用的操作系统 从Cnacle 官方网站下载相应的JDK 安装文件 下面以64位的 Windows 10系统为的来演示 JDK 8
  • 对象的实例化

    对象的实例化 创建对象的方式 new Class的newInstance 只能调用空参的构造器 权限必须是public Constructor的newInstance Xxx 可以调用空参 带参的构造器 权限没有要求 使用clone 需要实
  • python进阶知识点汇总

    一 函数 1 函数的传参 1 值传递 将实际的参数复制一份传递给形参 函数中修改形参时 不会影响到实际参数 def a b c 2 return b c print a 10 print a 123 2 print a 2 2 引用传递 将
  • 一张图看懂区块链

    要逐步了解区块链 我们需要一步步了解如下东西 去中心化 先来考虑一个中心化集中式处理的过程 你要在某宝上买一部手机 交易流程是 你将钱打给支付宝 支付宝收款后通知卖家发货 卖家发货 你确认收货 支付宝把钱打给卖家 在这个过程中 虽然你是在和
  • Vert.x的TCP服务端和客户端配置

    Vert x系列 Vert x介绍 https blog csdn net haoranhaoshi article details 89279096 Vert x实战一 Vert x通过Http发布数据 https blog csdn n
  • 蓝桥杯2020省赛单词分析

    题目描述 小蓝正在学习一门神奇的语言 这门语言中的单词都是由小写英文字母组 成 有些单词很长 远远超过正常英文单词的长度 小蓝学了很长时间也记不住一些单词 他准备不再完全记忆这些单词 而是根据单词中哪个字母出现得最多来分辨单词 现在 请你帮
  • RHEL/CentOS 7中的网络暨network.service与NetworkManager.service详解

    在RHEL CentOS 6及以前的版本中 网络功能是通过一系列网络相关的脚本文件实现 如 etc init d network文件 及如下 sbin if 文件等 root myserver ll sbin if rwxr xr x 1
  • ESP32s3 MSC/U盘 虚拟串口

    ESP32s3 MSC U盘 虚拟串口 开发环境是 IDF4 4 芯片 esp32s3 在项目中想要用到把内部的FLASH做成U盘 但是在idf4 4中没有找到MSC相关例程 如图 1 我在网上只找到esp32s2的例程 https git
  • 英国第七批36颗互联网卫星升空

    导读 英国卫星通信公司OneWeb 36颗卫星从俄东方航天发射场点火升空 累计在轨卫星218颗 据外媒 英国卫星通信公司OneWeb 36颗卫星从俄东方航天发射场点火升空 累计在轨卫星218颗 根据OneWeb的说法 只需要再发射一批36颗
  • 解决“unable to access ‘https://github.com...”

    前提 我在操作的时候做了https授权 但是密码输入错误了 再找想改也找不到了 搞半天都会报这个错 甚至我想用秘钥的方式都不行 万恶的git 解决方法 git config global http sslVerify false 然后正常操
  • STM32F103ZET6【HAL函开发】STM32CUBEMX------USART串口实验(DMA)

    printf重定义 需要将下面的代码插入到usart c里面 USER CODE BEGIN 1 if 1 include
  • hive集群安装,连接mysql

    1 linux安装mysql 并且生成hive用户 密码为Abc 123D 权限为所有权限 请看 这点很重要 http blog csdn net qq 21383435 article details 76573955 2 我的hadoo
  • JAVA中的目录指什么_默认情况下,Java listFiles()读取目录中的文件的顺序是什么? - java...

    我编写了以下程序 该程序读取目录中的所有文件 所有文件名均由数字组成 例如10023134 txt File dir new File directoryPath File files dir listFiles for File file
  • 内存管理实战案例分析3:为何分配不出一个页面?

    微信公众号 奔跑吧linux社区本文节选自 奔跑吧Linux内核 第二版卷1第6 3 3章 1 问题描述 下面是有问题的OOM Killer内核日志 其中空闲页面为86048KB 最低警戒水位为22528KB 低水位为28160KB 读者可
  • 如何使用iMazing监督、配置器功能

    监督功能是一种移动设备管理技术 使得Apple设备所有人具有最高管理权 设备受到监督之后 仅仅可以在监督人设定的模式下运行Apple设备 如单应用运行模式 权限限制模式 禁用配对模式等 最近很火的网剧 你安全了吗 就是宣传网络安全的 利用i
  • 【mySQL】MySQL JOIN原理

    MySQL JOIN原理 先看一下实验的两张表 表comments 总行数28856 表comments for 总行数57 comments id是有索引的 ID列为主键 以上两张表是我们测试的基础 然后看一下索引 comments fo
  • Nginx+Keepalived双机热备(主主模式)

    Keepalived介绍 Keepalived是一个基于VRRP协议来实现的服务高可用方案 可以利用其来避免IP单点故障 类似的工具还有heartbeat corosync pacemaker 但是它一般不会单独出现 而是与其它负载均衡技术