一、总结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