LVS的NAT和DR模型工作原理及DR模型搭建,http协议、nginx编译安装及配置

一、总结LVS的NAT和DR模型工作原理,并完成DR模型实战。

1、集群概念

Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统

Cluster分为三种类型:
LB:Load Balancing,负载均衡,多个主机组成,每个主机只承担一部分访问请求
HA:High Availiablity,高可用,避免SPOF(single Point Of failure)
 MTBF:Mean Time Between Failure 平均无故障时间,正常时间
 MTTR:Mean Time To Restoration( repair)平均恢复前时间,故障时间
 A = MTBF /(MTBF+MTTR) (0,1):99%,99.5%,99.9%,99.99%,99.999%

SLA:服务等级协议(简称:SLA,全称:service level agreement)。是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定。通常这个开销是驱动提供服务质量的主要因素。在常规的领域中,总是设定所谓的三个9,四个9来进行表示,当没有达到这种水平的时候,就会有一些列的惩罚措施,而运维,最主要的目标就是达成这种服务水平。

1年 = 365天 = 8760小时
90 = (1-90%)*365=36.5天
99 = 8760 * 1% = 87.6小时
99.9 = 8760 * 0.1% = 8760 * 0.001 = 8.76小时
99.99 = 8760 * 0.0001 = 0.876小时 = 0.876 * 60 = 52.6分钟
99.999 = 8760 * 0.00001 = 0.0876小时 = 0.0876 * 60 = 5.26分钟
99.9999= (1-99.9999%)*365*24*60*60=31秒

停机时间又分为两种,一种是计划内停机时间,一种是计划外停机时间,而运维则主要关注计划外停机时间。
HPC:High-performance computing,高性能 www.top500.org

集群与分布式区别

集群:同一个业务系统,部署在多台服务器上。集群中,每一台服务器实现的功能没有差别,数据和代码都是一样的

分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务

2、LVS的NAT和DR模型工作原理

2.1、NAT

2.1.1、NAT工作原理
1、客户端请求:当客户端向负载均衡器发送请求时,请求的目标是负载均衡器的虚拟 IP 地址(VIP)。

2、负载均衡器接收请求:负载均衡器接收到请求后,它将根据预定义的负载均衡算法(如轮询、加权轮询、最小连接数等)来选择一个后端服务器来处理该请求。

3、修改数据包:在LVS-NAT模式下,负载均衡器会修改客户端请求的数据包,将数据包的源地址替换为负载均衡器的 IP 地址,然后将数据包转发到选择的后端服务器。这使得后端服务器认为请求来自于负载均衡器,而不是直接来自客户端。

4、后端服务器响应:后端服务器处理请求并生成响应。响应数据包传递给负载均衡器。

5、还原数据包:负载均衡器接收到后端服务器的响应后,它将修改数据包,将目标地址还原为客户端的原始 IP 地址,并将响应数据包转发给客户端。

6、客户端接收响应:客户端接收到来自负载均衡器的响应,但从客户端的角度看,好像直接与后端服务器通信一样。
2.1.2、LVS-NAT模型搭建
2.1.2.1、环境准备
一台internet主机:
192.168.10.200(仅主机)
一台lvs服务器:
eth0:192.168.188.81(NAT)
eth1:192.168.10.100(仅主机)
两台web服务器:
web1:192.168.88.82(NAT)
web2:192.168.88.83(NAT)
2.1.2.2、web服务器配置
[root@web1 ~]#route -n  #路由指向
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.188.81  0.0.0.0         UG    100    0        0 eth0
192.168.188.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0

[root@web2 ~]#route -n  #路由指向
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.188.81  0.0.0.0         UG    100    0        0 eth0
192.168.188.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0

[root@web1 ~]#yum -y install httpd mod_ssl redis  #安装httpd服务
[root@web1 ~]#systemctl enable --now redis
[root@web2 ~]#yum -y install httpd mod_ssl redis
[root@web2 ~]#systemctl enable --now redis

[root@web1 ~]#ss -ntl   #查看服务端口
State               Recv-Q              Send-Q                           Local Address:Port                            Peer Address:Port              Process              
LISTEN              0                   128                                    0.0.0.0:22                                   0.0.0.0:*                                      
LISTEN              0                   128                                  127.0.0.1:6379                                 0.0.0.0:*                                      
LISTEN              0                   128                                          *:80                                         *:*                                      
LISTEN              0                   128                                       [::]:22                                      [::]:*                                      
LISTEN              0                   128                                          *:443                                        *:*    
2.1.2.3、LVS服务器配置
1、检查网卡:
[root@lvs ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:3e:16:52 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 192.168.188.81/24 brd 192.168.188.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe3e:1652/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:3e:16:5c brd ff:ff:ff:ff:ff:ff
    altname enp19s0
    altname ens224
    inet 192.168.10.100/24 brd 192.168.10.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe3e:165c/64 scope link 
       valid_lft forever preferred_lft forever

2、安装ipsadm
[root@lvs ~]#yum -y install ipvsadm
[root@lvs ~]#ipvsadm -A -t 192.168.10.100:80 -s rr
[root@lvs ~]#ipvsadm -a -t 192.168.10.100 -r 192.168.188.82:80 -m
[root@lvs ~]#ipvsadm -a -t 192.168.10.100 -r 192.168.188.83:80 -m

[root@lvs ~]#ipvsadm -Ln   #查看ipvsadm规则
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.100:80 rr
  -> 192.168.188.82:80            Masq    1      0          0         
  -> 192.168.188.83:80            Masq    1      0          0     
[root@lvs ~]#ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.10.100:80                  76      455      300    30150    35700
  -> 192.168.188.82:80                  38      228      152    15124    18088
  -> 192.168.188.83:80                  38      227      148    15026    17612
[root@lvs ~]#cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP  C0A80A64:0050 rr  
  -> C0A8BC53:0050      Masq    1      0          25        
  -> C0A8BC52:0050      Masq    1      0          26  

3、开启ip_forward路由功能
[root@lvs ~]#vim /etc/sysctl.conf·

net.ipv4.ip_forward=1

[root@lvs ~]#sysctl -p  #生效加载规则

4、验证
[root@internet ~]#while :;do curl 192.168.10.100;sleep 0.5;done
web1
web2
web1
web2
web1
web2
web1
web2
web1
web2
web1

[root@lvs ~]#ipvsadm -Lnc   #监听状态
IPVS connection entries
pro expire state       source             virtual            destination
TCP 00:27  TIME_WAIT   192.168.10.200:47554 192.168.10.100:80  192.168.188.82:80
TCP 01:04  TIME_WAIT   192.168.10.200:48292 192.168.10.100:80  192.168.188.82:80
TCP 00:19  TIME_WAIT   192.168.10.200:47404 192.168.10.100:80  192.168.188.82:80
TCP 01:56  TIME_WAIT   192.168.10.200:54608 192.168.10.100:80  192.168.188.83:80
TCP 01:13  TIME_WAIT   192.168.10.200:52148 192.168.10.100:80  192.168.188.82:80
TCP 00:25  TIME_WAIT   192.168.10.200:47510 192.168.10.100:80  192.168.188.83:80
TCP 01:11  TIME_WAIT   192.168.10.200:52108 192.168.10.100:80  192.168.188.83:80
TCP 01:17  TIME_WAIT   192.168.10.200:52228 192.168.10.100:80  192.168.188.82:80
TCP 00:56  TIME_WAIT   192.168.10.200:35712 192.168.10.100:80  192.168.188.83:80



#保存规则
[root@lvs ~]#ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@lvs ~]#cat /etc/sysconfig/ipvsadm
-A -t 192.168.10.100:80 -s rr
-a -t 192.168.10.100:80 -r 192.168.188.82:80 -m -w 1
-a -t 192.168.10.100:80 -r 192.168.188.83:80 -m -w 1

[root@lvs ~]#systemctl enable --now ipvsadm.service

#reboot验证
[root@lvs ~]#reboot
[root@lvs ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.100:80 rr
  -> 192.168.188.82:80            Masq    1      0          0         
  -> 192.168.188.83:80            Masq    1      0          0         
2.1.2.4、internet主机(网卡仅主机模式)配置及测试
[root@internet ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=192.168.10.200
PREFIX=24

[root@internet ~]#while :;do curl 192.168.10.100;sleep 0.5;done
web1
web2
web1
web2
web1
web2
web1
web2
web1
web2
web1
web2
web1
web2
web1
web2

2.2、DR模型

2.2.1、DR工作原理

1、客户端请求:客户端向负载均衡器的虚拟 IP 地址(VIP)发出请求。

2、负载均衡器接收请求:负载均衡器接收到请求后,根据预定义的负载均衡算法(如轮询、加权轮询、最小连接数等),选择一个后端服务器来处理该请求。

3、ARP Spoofing(ARP欺骗):在LVS-DR模式中,负载均衡器通常会使用ARP Spoofing技术。它发送虚假的ARP响应,将VIP映射到负载均衡器的MAC地址。这会导致局域网中的其他设备将VIP的流量发送到负载均衡器。

4、直接路由到后端服务器:当ARP欺骗生效后,客户端的请求数据包被直接路由到负载均衡器选择的后端服务器。负载均衡器只修改目标MAC地址,将数据包传递给后端服务器,而不修改IP地址。

5、后端服务器处理请求:后端服务器处理请求并生成响应。

6、直接路由回客户端:后端服务器生成的响应数据包被直接路由回客户端。负载均衡器不参与响应数据包的传输,因此可以有效提高系统性能。

总结:LVS-DR模式实现了负载均衡,同时避免了在负载均衡器上修改数据包的开销。这种模式下,负载均衡器在转发请求时只需修改目标MAC地址,而在响应时并不修改源MAC地址。这有助于提高性能,并减轻负载均衡器的工作负担。
2.2.2、LVS-DR模型搭建
2.2.2.1、环境准备
环境:五台主机
一台:客户端 eth0:仅主机 192.168.10.6/24 GW:192.168.10.200
一台:ROUTER
eth0:  NAT  192.168.188.200/24
eth1:  仅主机 192.168.10.200/24
启用 IP_FORWARD
一台:LVS
eth0:NAT:DIP:192.168.188.8/24    GW:192.168.188.200
两台RS:
RS1:eth0:NAT:192.168.188.81/24   GW:192.168.188.200
RS2:eth0:NAT:192.168.188.82/24   GW:192.168.188.200
2.2.2.2、rs1、rs2服务器、router准备
1、安装并启动服务

[root@web1 ~]# yum -y install redis httpd mod_ssl
[root@web1 ~]# systemctl enable --now httpd redis
[root@web1 ~]#hostname > /var/www/html/index.html
[root@web2 ~]#hostname > /var/www/html/index.html

######################################################################################################
2、修改web1、web2网关
######################################################################################################
[root@web1 ~]#cat /etc/sysconfig/network-scripts/ifcfg-ens160 
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
IPADDR=192.168.188.81
PREFIX=24
GATEWAY=192.168.188.200
DNS1=192.168.188.2
DNS2=223.6.6.6
ONBOOT=yes
[root@web2 ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=192.168.188.82
PREFIX=24
GATEWAY=192.168.188.200
DNS1=8.8.8.8
DNS2=192.168.188.2
ONBOOT=yes

[root@web1 ~]#route -n  #查看路由
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.188.200 0.0.0.0         UG    100    0        0 eth0
192.168.188.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0
[root@web2 ~]#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.188.200 0.0.0.0         UG    100    0        0 eth0
192.168.188.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0


######################################################################################################
3、后端RS1、2的IPVS配置
######################################################################################################
#RS1的IPVS配置、rs2同rs1
[root@web1 ~]#echo 1 >   /proc/sys/net/ipv4/conf/all/arp_ignore
[root@web1 ~]#echo 2 >   /proc/sys/net/ipv4/conf/all/arp_announce 
[root@web1 ~]#echo 1 >   /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web1 ~]#echo 2 >   /proc/sys/net/ipv4/conf/lo/arp_announce

#添加回环网卡信息两种方法
方法1:
[root@web1 ~]#ip a a 192.168.188.100/32 dev lo label lo:1
方法2:
[root@web1 ~]#ifconfig lo:1 192.168.188.100/32

[root@web1 ~]#ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.188.81  netmask 255.255.255.0  broadcast 192.168.188.255
        inet6 fe80::20c:29ff:fe3e:1652  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:3e:16:52  txqueuelen 1000  (Ethernet)
        RX packets 40795  bytes 36580322 (34.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 19145  bytes 1923795 (1.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 152  bytes 13532 (13.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 152  bytes 13532 (13.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo:1: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.188.100  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)

#RS2的IPVS配置
[root@rs2 ~]#echo 1 >   /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs2 ~]#echo 1 >   /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs2 ~]#echo 2 >   /proc/sys/net/ipv4/conf/all/arp_announce 
[root@rs2 ~]#echo 2 >   /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rs2 ~]#ifconfig lo:1 10.0.0.100/32
[root@rs2 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group 
default qlen 1000
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
   inet 10.0.0.100/0 scope global lo:1
       valid_lft forever preferred_lft forever
   inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP 
group default qlen 1000
   link/ether 00:0c:29:94:1a:f6 brd ff:ff:ff:ff:ff:ff
   inet 10.0.0.17/24 brd 10.0.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
   inet6 fe80::20c:29ff:fe94:1af6/64 scope link 
       valid_lft forever preferred_lft forever

######################################################################################################
4、服务器模拟router
######################################################################################################
[root@router ~]#echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf   #开启路由功能,
[root@router ~]#sysctl -p

[root@router ~]# cat /etc/netplan/01-netcfg.yaml
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      addresses: [192.168.188.200/24]
      gateway4: 192.168.188.2
      nameservers: 
          addresses: [8.8.8.8,192.168.188.2]
    eth1:
      addresses: [192.168.10.200/24]

[root@router ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.188.200  netmask 255.255.255.0  broadcast 192.168.188.255
        inet6 fe80::20c:29ff:fe7c:8eeb  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:7c:8e:eb  txqueuelen 1000  (Ethernet)
        RX packets 9939  bytes 971089 (971.0 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4827  bytes 473398 (473.3 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.200  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::20c:29ff:fe7c:8ef5  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:7c:8e:f5  txqueuelen 1000  (Ethernet)
        RX packets 7949  bytes 575758 (575.7 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 401  bytes 36723 (36.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 162  bytes 13652 (13.6 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 162  bytes 13652 (13.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


######################################################################################################
5、internet主机环境
######################################################################################################
[root@internet ~]#hostname
internet
[root@internet ~]#hostname -I
192.168.10.6 
[root@internet ~]#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface
192.168.10.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0
0.0.0.0         192.168.10.200   0.0.0.0         UG    0      0        0 eth0
[root@intneter ~]# ping 192.168.188.8 -c1
PING 192.168.188.8 (192.168.188.8) 56(84) bytes of data.
64 bytes from 192.168.188.8: icmp_seq=1 ttl=63 time=1.11 ms

--- 192.168.188.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.119/1.119/1.119/0.000 ms
[root@intneter ~]# ping 192.168.188.81 -c1
PING 192.168.188.81 (192.168.188.81) 56(84) bytes of data.
64 bytes from 192.168.188.81: icmp_seq=1 ttl=63 time=0.971 ms

--- 192.168.188.81 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.971/0.971/0.971/0.000 ms
[root@intneter ~]# ping 192.168.188.82 -c1
PING 192.168.188.82 (192.168.188.82) 56(84) bytes of data.
64 bytes from 192.168.188.82: icmp_seq=1 ttl=63 time=1.86 ms

--- 192.168.188.82 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.863/1.863/1.863/0.000 ms
2.2.2.3、LVS服务器配置
#在LVS上添加VIP
[root@lvs ~]#ifconfig lo:1 10.0.0.100/32
[root@lvs ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 192.168.188.100/32 scope global lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:fb:1c:80 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 192.168.188.8/24 brd 192.168.188.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fefb:1c80/64 scope link 
       valid_lft forever preferred_lft forever

#查看路由表
[root@lvs ~]#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.188.200 0.0.0.0         UG    100    0        0 eth0
192.168.188.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0


#添加ipvs规则
[root@lvs ~]#ipvsadm -A -t 192.168.188.100:80 -s rr
[root@lvs ~]#ipvsadm -a -t 192.168.188.100:80 -r 192.168.188.81:80 -g
[root@lvs ~]#ipvsadm -a -t 192.168.188.100:80 -r 192.168.188.82:80 -g
[root@lvs ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.188.100:80 rr
  -> 192.168.188.81:80            Route   1      0          0         
  -> 192.168.188.82:80            Route   1      0          0  
2.2.2.4、测试访问
[root@intneter ~]# while true;do curl 192.168.188.100 ;sleep 1;done
web2.dingbh.top
web1.dingbh.top
web2.dingbh.top
web1.dingbh.top
web2.dingbh.top
web1.dingbh.top
web2.dingbh.top
web1.dingbh.top
........


#实时查看日志
[root@web1 ~]#tail -f /var/log/httpd/access_log -n0
192.168.10.201 - - [12/Oct/2023:15:44:15 +0800] "GET / HTTP/1.1" 200 16 "-" "curl/7.58.0"
192.168.10.201 - - [12/Oct/2023:15:44:41 +0800] "GET / HTTP/1.1" 200 16 "-" "curl/7.58.0"

抓包分析

抓包分析:
1
src
7c:8e:eb   router  192.168.10.201:38982 

dest
fb:1c:80   lvs 192.168.188.100

2
src
fb:1c:80  lvs:mac 192.168.10.201:38982   

dest
3e:16:52 web1 192.168.188.100

3
src
3e:16:52  web1  192.168.188.100

dest
7c:8e:eb  router  192.168.10.201:38982 
2.2.3、LVS-DR模式多网段案例
2.2.3.1、RS配置
[root@web1 ~]#vim lvs_dr_rs.sh 

#!/bin/bash
#Author:wangxiaochun
#Date:2017-08-13
vip=172.16.0.100
mask='255.255.255.255'
dev=lo:1

case $1 in
start)
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    ifconfig $dev $vip netmask $mask 
    echo "The RS Server is Ready!"
    ;;  
stop)
    ifconfig $dev down
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo "The RS Server is Canceled!"
    ;;  
*) 
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;  
esac
2.2.3.2、VS配置
[root@lvs ~]#vim lvs_dr_vs.sh 

#Date:2017-08-13
vip='172.16.0.100'
iface='lo:1'
mask='255.255.255.255'
port='80'
rs1='192.168.188.81'
rs2='192.168.188.82'
scheduler='wrr'
type='-g'
rpm -q ipvsadm &> /dev/null || yum -y install ipvsadm &> /dev/null

case $1 in
start)
    ifconfig $iface $vip netmask $mask #broadcast $vip up
    iptables -F
 
    ipvsadm -A -t ${vip}:${port} -s $scheduler
    ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
    ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
    echo "The VS Server is Ready!"
    ;;  
stop)
    ipvsadm -C
    ifconfig $iface down
    echo "The VS Server is Canceled!"
    ;;  
*)
    echo "Usage: $(basename $0) start|stop"
    exit 1
    ;;  
esac

2.3、实现redis连接

2.3.1、redis服务配置
#redis-server安装redis服务,修改bind ,ti
[root@web1 ~]#yum -y install redis

[root@web1 ~]#sed -i '/^bind/c bind 0.0.0.0'  /etc/redis.conf 
[root@web2 ~]#sed -i '/^bind/c bind 0.0.0.0'  /etc/redis.conf 

[root@web1 ~]#systemctl restart redis
[root@web1 ~]#systemctl enable --now redis
[root@web1 ~]#redis-cli 
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set host 192.168.188.82
OK
127.0.0.1:6379> quit
2.3.2、添加LVS规则
#添加lvs规则
[root@lvs ~]#ipvsadm -A -t 192.168.10.100:6379
[root@lvs ~]#ipvsadm -a -t 192.168.10.100:6379 -r 192.168.188.82:6379 -m
[root@lvs ~]#ipvsadm -a -t 192.168.10.100:6379 -r 192.168.188.83:6379 -m
[root@lvs ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.100:80 rr
  -> 192.168.188.82:80            Masq    1      0          0         
  -> 192.168.188.83:80            Masq    1      0          0         
TCP  192.168.10.100:6379 wlc
  -> 192.168.188.82:6379          Masq    1      0          0         
  -> 192.168.188.83:6379          Masq    1      0          0   

#查看监听状态
[root@lvs ~]#ipvsadm -Lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:21  TIME_WAIT   192.168.10.200:47084 192.168.10.100:6379 192.168.188.83:6379
TCP 01:11  TIME_WAIT   192.168.10.200:38416 192.168.10.100:6379 192.168.188.83:6379
TCP 14:56  ESTABLISHED 192.168.10.200:51712 192.168.10.100:6379 192.168.188.83:6379
TCP 01:02  TIME_WAIT   192.168.10.200:57322 192.168.10.100:6379 192.168.188.82:6379
2.3.3、验证连接
[root@web1 ~]#redis-cli  #后端redis添加数据
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set host 192.168.188.82
OK
127.0.0.1:6379> quit

[root@web2 ~]#redis-cli 
127.0.0.1:6379> ping 
PONG
127.0.0.1:6379> set host 192.168.188.83
OK
127.0.0.1:6379> quit

[root@internet ~]#yum -y install redis  #客户端验证
[root@internet ~]#redis-cli -h 192.168.10.100
192.168.10.100:6379> get host
"192.168.188.83"
192.168.10.100:6379> quit
[root@internet ~]#redis-cli -h 192.168.10.100
192.168.10.100:6379> get host
"192.168.188.82"
192.168.10.100:6379> 

二、总结http协议的通信过程详解

1、建立连接

1、客户端发起请求:当用户在浏览器中输入URL或点击链接时,浏览器会向服务器发出HTTP请求。请求通常由方法(GET、POST、PUT等)、URL和头部信息组成。
2、建立TCP连接:如果请求是通过HTTP/1.1或较新版本,则基于TCP协议与服务器建立连接。HTTP/2可能会使用单个连接并行处理多个请求。

2、服务器响应

1、服务器接收请求:服务器接收到客户端的请求后,根据请求的内容和服务器上的资源做出响应。
2、构建响应:服务器构建一个HTTP响应,包括响应的状态码(例如200表示成功,404表示未找到等)、响应头和响应体(通常是请求的内容)。

3、数据传输

1、发送响应:服务器将响应通过TCP连接发送回客户端。
2、响应解析:客户端接收响应,并解析响应头信息。如果状态码是200,浏览器开始渲染页面或处理其他资源。

4、关闭连接

1、断开连接:在HTTP/1.1中,如果响应头中未指定Connection: keep-alive,连接会在响应结束后关闭。在HTTP/2及更新版本中,连接可能会保持开放状态以便后续请求。
2、资源处理:浏览器处理接收到的资源,例如渲染HTML页面、执行JavaScript代码等。

在HTTPS情况下,通信过程相似,但使用了加密来保护传输的数据。HTTPS建立在TLS/SSL加密协议之上,数据在传输过程中是加密的,提供了更高的安全性。

HTTP的特点之一是无状态性,即每个请求都是相互独立的,服务器不会在不同请求之间保留任何状态信息。为了实现会话管理和状态保持,通常会使用Cookies或Session来维护用户状态信息。

三、总结网络IO模型和nginx架构

1、网络IO模型

常见的网络 I/O 模型包括:阻塞 I/O、非阻塞 I/O、多路复用 I/O、异步 I/O。

1、阻塞 I/O(Blocking I/O):

特点:程序会被阻塞,直到数据准备好被读取或者写入操作完成。
适用场景:适用于连接数较少且每个连接数据传输量较大的情况。

2、非阻塞 I/O(Non-blocking I/O):

特点:程序不会被阻塞,可以继续执行其他任务。但需要轮询来检查数据是否准备好。
适用场景:适用于连接数较多,但每个连接数据传输量较大的情况。

3、多路复用 I/O(Multiplexing I/O):

特点:使用一个线程来监听多个套接字,当某个套接字有数据可读或可写时,通知程序进行读写操作。
适用场景:适用于连接数多,但活跃连接相对较少的情况,例如聊天室。

4、异步 I/O(Asynchronous I/O):

特点:发起一个 I/O 操作后,程序可以继续执行其他任务,当 I/O 操作完成时,系统通知程序。
适用场景:适用于连接数多且每个连接数据传输量较小的情况,例如 Web 服务器。

2、nginx架构

1、事件驱动:Nginx 使用事件驱动模型,采用单线程或少量线程来处理大量的并发连接,通过异步 I/O 实现高性能的请求处理。

2、Master-Worker 架构:Nginx 采用 Master-Worker 模型,主进程负责管理工作进程,工作进程处理具体的请求。这种架构使得 Nginx 能够充分利用多核 CPU 的优势。

3、高度可扩展:由于 Nginx 采用了异步非阻塞的事件驱动模型,它能够轻松地处理大量并发连接,具有很好的水平扩展性。

4、高度优化的内存管理:Nginx 的内存管理非常高效,采用了预分配的内存池机制,有效减少了内存碎片和频繁的内存分配操作。

四、完成nginx编译安装脚本

[root@proxy ~]#vim install_nginx.sh 

#!/bin/bash
#
#********************************************************************
#Author:            dingbaohang
#QQ:                904748581
#Date:              2023-11-10
#FileName:         install_nginx.sh
#URL:               http://www.dingbh.top
#Description:      The test script
#Copyright (C):     2023 All rights reserved
#********************************************************************
SRC_DIR=/usr/local/src
NGINX_URL=http://nginx.org/download/
NGINX_FILE=nginx-1.24.0
TAR=.tar.gz
NGINX_INSTALL_DIR=/apps/nginx
CPUS=`lscpu |awk '/^CPU\(s\)/{print $2}'`
. /etc/os-release

color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $2 = "failure" -o $2 = "1"  ] ;then 
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo 
}

os_type () {
   awk -F'[ "]' '/^NAME/{print $2}' /etc/os-release
}

os_version () {
   awk -F'"' '/^VERSION_ID/{print $2}' /etc/os-release
}

check () {
    [ -e ${NGINX_INSTALL_DIR} ] && { color "nginx 已安装,请卸载后再安装" 1; exit; }
    cd  ${SRC_DIR}
    if [  -e ${NGINX_FILE}${TAR} ];then
        color "相关文件已准备就绪" 0
        wget ${NGINX_URL}${NGINX_FILE}${TAR}
        [ $? -ne 0 ] && { color "下载 ${NGINX_FILE}${TAR}文件失败" 1; exit; }
    fi
}

install () {
    color "开始安装 nginx" 0
    if id nginx  &> /dev/null;then
        color "nginx 用户已存在" 1
    else
        useradd -s /sbin/nologin -r  nginx
        color "创建 nginx 用户" 0
    fi
    color "开始安装 nginx 依赖包" 0
    if [ $ID == "centos" ] ;then
        if [[ $VERSION_ID =~ ^7 ]];then
            yum -y -q  install make gcc pcre-devel openssl-devel zlib-devel perl-ExtUtils-Embed
        elif [[ $VERSION_ID =~ ^8 ]];then
            yum -y -q install make gcc-c++ libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel perl-ExtUtils-Embed
        else
            color '不支持此系统!'  1
            exit
        fi
    elif [ $ID == "rocky"  ];then
        yum -y -q install make gcc-c++ libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel perl-ExtUtils-Embed
    else
        apt update &> /dev/null
        apt -y install make gcc libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev &> /dev/null
    fi
    cd $SRC_DIR
    tar xf ${NGINX_FILE}${TAR}
    NGINX_DIR=`echo ${NGINX_FILE}${TAR}| sed -nr 's/^(.*[0-9]).*/\1/p'`
        if [[ $VERSION_ID =~ ^7 ]];then
            yum -y -q  install make gcc pcre-devel openssl-devel zlib-devel perl-ExtUtils-Embed
        elif [[ $VERSION_ID =~ ^8 ]];then
            yum -y -q install make gcc-c++ libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel perl-ExtUtils-Embed
        else
            color '不支持此系统!'  1
            exit
        fi
    elif [ $ID == "rocky"  ];then
        yum -y -q install make gcc-c++ libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel perl-ExtUtils-Embed
    else
        apt update &> /dev/null
        apt -y install make gcc libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev &> /dev/null
    fi
    cd $SRC_DIR
    tar xf ${NGINX_FILE}${TAR}
    NGINX_DIR=`echo ${NGINX_FILE}${TAR}| sed -nr 's/^(.*[0-9]).*/\1/p'`
    cd ${NGINX_DIR}
    ./configure --prefix=${NGINX_INSTALL_DIR} --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
    make -j $CPUS && make install
    [ $? -eq 0 ] && color "nginx 编译安装成功" 0 ||  { color "nginx 编译安装失败,退出!" 1 ;exit; }
    echo "PATH=${NGINX_INSTALL_DIR}/sbin:${PATH}" > /etc/profile.d/nginx.sh
    cat > /lib/systemd/system/nginx.service <<EOF
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=${NGINX_INSTALL_DIR}/logs/nginx.pid
ExecStartPre=/bin/rm -f ${NGINX_INSTALL_DIR}/logs/nginx.pid
ExecStartPre=${NGINX_INSTALL_DIR}/sbin/nginx -t
ExecStart=${NGINX_INSTALL_DIR}/sbin/nginx
ExecReload=/bin/kill -s HUP \$MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
LimitNOFILE=100000

[Install]
WantedBy=multi-user.target
EOF
    systemctl daemon-reload
    systemctl enable --now nginx &> /dev/null
    systemctl is-active nginx &> /dev/null ||  { color "nginx 启动失败,退出!" 1 ; exit; }
    color "nginx 安装完成" 0
}

check
install

五、总结nginx核心配置,并实现nginx多虚拟主机

1、配置文件说明

Nginx的配置文件的组成部分:
	主配置文件:nginx.conf
	子配置文件: include conf.d/*.conf
	fastcgi, uwsgi,scgi 等协议相关的配置文件
	mime.types:支持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮
	件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某
	种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动
	使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
	MIME参考文档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_
	Types

1.1、nginx 配置文件格式说明

配置文件由指令与指令块构成
每条指令以;分号结尾,指令与值之间以空格符号分隔
可以将多条指令放在同一行,用分号分隔即可,但可读性差,不推荐
指令块以{ }大括号将多条指令组织在一起,且可以嵌套指令块
include语句允许组合多个配置文件以提升可维护性
使用#符号添加注释,提高可读性
使用$符号使用变量
部分指令的参数支持正则表达式

1.2、Nginx 主配置文件的配置指令方式

directive value [value2 ...];
注意
(1) 指令必须以分号结尾
(2) 支持使用配置变量
内建变量:由Nginx模块引入,可直接引用
自定义变量:由用户使用set命令定义,格式: set variable_name value;
引用变量:$variable_name

1.3、主配置文件结构:四部分

main block:主配置段,即全局配置段,对http,mail都有效
#事件驱动相关的配置
event {
			...
}
#http/https 协议相关配置段
http {
				...
}
#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {
				...
}
#stream 服务器相关配置段
stream {
				...
}

1.4、默认的nginx.conf 配置文件格式说明

#全局配置端,对全局生效,主要设置nginx的启动用户/组,启动的工作进程数量,工作模式,Nginx的PID
路径,日志路径等。
user nginx nginx;
worker_processes 1; #启动工作进程数数量
events { #events设置快,主要影响nginx服务器与用户的网络连接,比如是否允许同时接受多个网络连
接,使用哪种事件驱动模型处理请求,每个工作进程可以同时支持的最大连接数,是否开启对多工作进程下的
网络连接进行序列化等。
				worker_connections 1024; #设置单个nginx工作进程可以接受的最大并发,作为web服务器
的时候最大并发数为worker_connections * worker_processes,作为反向代理的时候为
(worker_connections * worker_processes)/2
}
http { #http块是Nginx服务器配置中的重要部分,缓存、代理和日志格式定义等绝大多数功能和第三方模
块都可以在这设置,http块可以包含多个server块,而一个server块中又可以包含多个location块,
server块可以配置文件引入、MIME-Type定义、日志自定义、是否启用sendfile、连接超时时间和单个链
接的请求上限等。
				include mime.types;
				default_type application/octet-stream;
				sendfile on; #作为web服务器的时候打开sendfile加快静态文件传输,指定是否使用
sendfile系统调用来传输文件,sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操
作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝,硬盘 >>
kernel buffer (快速拷贝到kernelsocket buffer) >>协议栈。
keepalive_timeout 65; #长连接超时时间,单位是秒
	server { #设置一个虚拟机主机,可以包含自己的全局快,同时也可以包含多个location模块。比如
本虚拟机监听的端口、本虚拟机的名称和IP配置,多个server 可以使用一个端口,比如都使用80端口提供
web服务、
			listen 80; #配置server监听的端口
			server_name localhost; #本server的名称,当访问此名称的时候nginx会调用当前
serevr内部的配置进程匹配。
			location / { #location其实是server的一个指令,为nginx服务器提供比较多而且灵活的指
令,都是在location中体现的,主要是基于nginx接受到的请求字符串,对用户请求的UIL进行匹配,并对特
定的指令进行处理,包括地址重定向、数据缓存和应答控制等功能都是在这部分实现,另外很多第三方模块的
配置也是在location模块中配置。
			root html; #相当于默认页面的目录名称,默认是安装目录的相对路径,可以使用绝对路
径配置。
			index index.html index.htm; #默认的页面文件名称
}
		error_page 500 502 503 504 /50x.html; #错误页面的文件名称
		location = /50x.html { #location处理对应的不同错误码的页面定义到/50x.html,这个
跟对应其server中定义的目录下。
		root html; #定义默认页面所在的目录
			}
}
#和邮件相关的配置
#		mail {
#					 ...
# 				} mail 协议相关配置段
#tcp代理配置,1.9版本以上支持
#		stream {
#						 ...
# 					} stream 服务器相关配置段
#导入其他路径的配置文件
#		include /apps/nginx/conf.d/*.conf
}

2、nginx多虚拟主机

2.1、环境准备

#nginx配置文件
[root@proxy ~]# ls /apps/nginx/conf.d/ -l
total 28
-rw-r--r-- 1 root root  486 Nov  6 04:47 mobile.conf
-rw-r--r-- 1 root root  769 Nov  7 13:00 pc.conf


#创建网页资源目录
[root@proxy ~]# tree /data/nginx/html/
/data/nginx/html/
├── mobile
└── pc

2.2、nginx配置

pc端nginx配置
[root@proxy ~]# cat /apps/nginx/conf.d/pc.conf 
vhost_traffic_status_zone;
server {
    listen 443 ssl;
    ssl_certificate /apps/nginx/ssl/www.dingbh.top.pem;
    ssl_certificate_key /apps/nginx/ssl/www.dingbh.top.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 10m;
    server_name www.dingbh.top;
    root /data/nginx/html/pc;
}
server {
    listen 80 ;
    root /data/nginx/html/pc;
    server_name www.dingbh.top;
    access_log /apps/nginx/logs/www.dingbh.top-access.log main;
    location / {
        proxy_pass http://192.168.188.8:8888;
        proxy_connect_timeout 10s;
        proxy_cache_key $request_uri;
        proxy_cache_valid 200 302 301 1h;
        proxy_cache_valid any 1m;
        add_header X-Via $server_addr;
        add_header X-Cache $upstream_cache_status;
    }
}

mobile端nginx配置
[root@proxy ~]# cat /apps/nginx/conf.d/mobile.conf 
server {
    listen 443 ssl;
    server_name m.dingbh.top;
    ssl_certificate /apps/nginx/conf.d/m.dingbh.top.crt;
    ssl_certificate_key /apps/nginx/conf.d/m.dingbh.top.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 10m;
    root /data/nginx/html/mobile;
    access_log /apps/nginx/logs/m.dingbh.top-access.log main;
    location /break {
        rewrite ^/break/(.*)$ /test/$1 break;
    }   
    location = /nginx_status {
        stub_status;
    }
}

2.3、访问测试

[root@client~]# curl www.dingbh.top
[root@client~]# curl m.dingbh.top

六、总结nginx日志格式定制

1、nginx配置

#修改nginx配置文件
[root@Rocky8 ~]# cat /apps/nginx/conf/nginx.conf
#user  nobody;
worker_processes  auto;
worker_cpu_affinity 1000 0100 0010 0001;
#error_log  logs/error.log;
worker_priority 19;
worker_rlimit_core 65536;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        /apps/nginx/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    types {
        text/plain php;
}
    charset utf-8;
    server_tokens on; 
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ';  #自定义日志格式
    log_format access_json '{"@timestamp":"$time_iso8601",'                     #修改日志类型为json格式
        '"host":"$server_addr",'
        '"clientip":"$remote_addr",'
        '"size":$body_bytes_sent,'
        '"responsetime":$request_time,'
        '"upstreamtime":"$upstream_response_time",'
        '"upstreamhost":"$upstream_addr",'
        '"http_host":"$host",'
        '"uri":"$uri",'
        '"xff":"$http_x_forwarded_for",'
        '"referer":"$http_referer",'
        '"tcp_xff":"$proxy_protocol_addr",'
        '"http_user_agent":"$http_user_agent",'
        '"status":"$status"}';
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

2、修改实例nginx配置

#修改实例nginx配置

[root@Rocky8 ~]# cat /apps/nginx/conf.d/pc.conf 
vhost_traffic_status_zone;    #第三方模块
server {
    listen 80;
    server_name www.dingbh.top;
    root /data/nginx/html/pc;
    access_log /apps/nginx/logs/www.dingbh.top-access.log combined;
    access_log /apps/nginx/logs/access_json.log access_json;    #server模块配置json日志路径
    location /status {
        vhost_traffic_status_display;       #第三方模块设置
        vhost_traffic_status_display_format html;
    }
    location /nginx_status {        
        stub_status;              #nginx服务状态
    }
    location /echo {
        set $name dingbaohang;          #添加echo模块
        echo "hello shipanpan";
        echo $remote_addr;
        echo $uri;
        echo $request_method;
        echo "姓名:$name";
    }
#    location /nginx_status {
#        stub_status;              #添加模块认证
#        auth_basic "auth login";
#        auth_basic_user_file /apps/nginx/conf/.htpasswd;
#        allow 192.168.0.0/16;      #限制访问
#        allow 127.0.0.1;
#        deny all;
#    }
}

[root@Rocky8 ~]# nginx -t  #语法检查
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@Rocky8 ~]# nginx -s reload   #加载配置

3、日志测试及检查

#测试
#安装json日志格式文件查看工具
[root@Rocky8 ~]# yum -y install jq

[root@Rocky8 ~]# cat /apps/nginx/logs/access_json.log |jq
{
  "@timestamp": "2023-10-30T01:24:01+08:00",
  "host": "192.168.188.88",
  "clientip": "192.168.188.99",
  "size": 1152,
  "responsetime": 0,
  "upstreamtime": "-",
  "upstreamhost": "-",
  "http_host": "www.dingbh.top",
  "uri": "/status/format/json",
  "xff": "-",
  "referer": "http://www.dingbh.top/status",
  "tcp_xff": "-",
  "http_user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76",
  "status": "200"
}
{
  "@timestamp": "2023-10-30T01:24:02+08:00",
  "host": "192.168.188.88",
  "clientip": "192.168.188.99",
  "size": 2018,
  "responsetime": 0,
  "upstreamtime": "-",
  "upstreamhost": "-",
  "http_host": "www.dingbh.top",
  "uri": "/status/format/json",
  "xff": "-",
  "referer": "http://www.dingbh.top/status",
  "tcp_xff": "-",
  "http_user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76",
  "status": "200"
}
..............................................

3.1、json格式日志访问统计

#安装python3环境
[root@Rocky8 ~]# vim log.py

#!/usr/bin/env python3
#coding:utf-8

status_200= []
status_404= []
with open("/apps/nginx/logs/access_json.log") as f:                                                                                                                     
    for line in f.readlines():
        line = eval(line)
        if line.get("status") == "200":
            status_200.append(line.get)
        elif line.get("status") == "404":
            status_404.append(line.get)
        else:
            print("状态码 ERROR")
        print((line.get("clientip")))
f.close()

print("状态码200的有--:",len(status_200))
print("状态码404的有--:",len(status_404))

[root@Rocky8 ~]# ./log.py
...
192.168.188.99
192.168.188.99
192.168.188.99
192.168.188.99
192.168.188.99
192.168.188.99
192.168.188.99
192.168.188.99
192.168.188.99
192.168.188.99
192.168.188.99
192.168.188.99
192.168.188.99
192.168.188.99
状态码200的有--: 650
状态码404的有--: 2
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大海绵啤酒肚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值