1. 总结 哨兵机制实现原理,并搭建主从哨兵集群。
哨兵sentine工作原理:
专门的Sentinel服务进程是用于监控redis集群中Master工作的状态,当Master主服务器发生故障的时候,可以实现Master和Slave的角色的自动切换,从而实现系统的高可用性
Sentinel是一个分布式系统,即需要在多个节点上各自同时运行一个sentinel进程,Sentienl 进程通过流言协议(gossip protocols)来接收关于Master是否下线状态,并使用投票协议(Agreement Protocols)来决定是否执行自动故障转移,并选择合适的Slave作为新的Master
每个Sentinel进程会向其它Sentinel、Master、Slave定时发送消息,来确认对方是否存活,如果发现某个节点在指定配置时间内未得到响应,则会认为此节点已离线,即为主观宕机Subjective Down,简称为 SDOWN
如果哨兵集群中的多数Sentinel进程认为Master存在SDOWN,共同利用is-master-down-by-addr 命令互相通知后,则认为客观宕机Objectively Down,简称 ODOWN
接下来利用投票算法,从所有slave节点中,选一台合适的slave将之提升为新Master节点,然后自动修改其它slave相关配置,指向新的master节点,最终实现故障转移failoverRedis Sentinel中的Sentinel节点个数应该为大于等于3且最好为奇数
客户端初始化时连接的是Sentine!节点集合,不再是具体的Redis节点,即 Sentinel只是配置中心不是代理。
Redis Sentinel 节点与普通 Redis 没有区别,要实现读写分离依赖于客户端程序
搭建哨兵集群:
1.先实现主从复制,修改从节点配置文件,永久生效:
vim redis.conf
# replicaof <masterip> <masterport>
replicaof 192.168.29.225 6379
# masterauth <master-password>
masterauth qwe123
2.所有节点配置文件中内容添加相同密码:
bind 0.0.0.0
# masterauth <master-password>
masterauth "qwe123"
# requirepass foobared
requirepass "qwe123"
3.修改sentinel哨兵配置sentinel.conf配置文件
vim sentinel.conf
bind 0.0.0.0
sentinel monitor mymaster 192.168.29.227 6379 2 //mymaster为集群名称,IP为redis主节点及对应端口,2为法定人数限制一般总数为>=3的奇数
sentinel auth-pass mymaster qwe123 //集群中master的密码
4.启动哨兵服务
systemctl start redis-sentinel.service
2. 总结redis cluster工作原理,并搭建集群实现扩缩容。
redis cluster 集群
Redis集群是一个由多个主从节点群组成的分布式服务集群,它具有复制、高可用和分片特性。Redis集群不需要sentinel哨兵也能完成节点移除和故障转移的功能。需要将每个节点设置成集群模式。redis集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单。Redis 集群是一种分布式数据库方案,集群通过分片(sharding)来进行数据管理,并提供复制和故障转移功能。将数据划分为 16384 的 slots,每个节点负责一部分槽位。槽位的信息存储于每个节点中。
redis cluster集群搭建:
1.修改每个节点reids.conf配置文件
bind 0.0.0.0
masterauth qwe123
requirepass qwe123
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-require-full-coverage no
启动服务观察是否开启16379的cluster端口,实际端口=redis port + 10000
2.创建集群
[root@lgxtest1 redis]#redis-cli -a qwe123 --cluster create 192.168.29.225:6379 192.168.29.226:6379 192.168.29.227:6379 192.168.29.229:6379 192.168.29.230:6379 192.168.29.231:6379 --cluster-replicas 1
3.查看nodes-6379.conf中集群关系
cat /var/lib/redis/nodes-6379.conf
集群扩容:
sed i.bak -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e '/masterauth/a masterauth qwe123' -e '/# requirepass/a requirepass qwe123' -e '/# cluster-enabled yes/a cluster-enabled yes' -e'/# cluster-config-file nodes-6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-full-coverage yes/c cluster-require-full-coverage no' /etc/redis.conf
1.新节点修改配置文件,满足加入集群条件
vim /etc/redis.conf
bind 0.0.0.0
masterauth qwe123
requirepass qwe123
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-require-full-coverage no
启动服务观察是否开启16379的cluster端口,实际端口=redis port + 10000
2.添加master节点
[12:39:50 root@lgxtest1 ~]#redis-cli -a qwe123 --cluster add-node 192.168.29.228:6379(新节点) 192.168.29.226:6379(集群任意节点)
3.在新节点上重新分配槽位
[12:39:50 root@lgxtest1 ~]#redis-cli -a qwe123 --cluster reshard 192.168.29.226:6379(集群任意节点)
输入新分配的槽位数=16384/master个数
新节点master的ID
all/done 槽位来源all自动在所有redis节点选择划分
redis-cli -a qwe123 cluster nodes //查看节点
4.添加新的从节点
redis-cli -a qwe123 --cluster add-node 192.168.29.232:6379 192.168.29.228:6379(集群任意节点) --cluster-slave --cluster-master-id fadc5e7ae496fdae5096c84e4926d4da19e8ecd6(主节点ID)
集群缩容:
1.执行槽位分配
[14:57:18 root@lgxtest1 ~]#redis-cli -a qwe123 --cluster reshard 192.168.29.225:6379(集群任意节点)
将缩容节点槽位分多次执行缩容 4096/3 1356 1366 1356
先输入缩容后还原目标地址节点ID
再输入缩容节点地址节点ID
done
2.删除多余主从节点
[15:03:10 root@lgxtest1 ~]#redis-cli -a qwe123 --cluster del-node 192.168.29.225:6379(任意集群节点IP) 4225ea2702679615a6878c74298b9f35cf73726f(多余节点ID)
3. 总结 LVS的NAT和DR模型工作原理,并完成DR模型实战。
LVS集群类型属于
CIP:Client IP
VIP:VS外网的IP
DIP:VS内网的IP
RIP:real server IP
CIP —— VIP == DIP —— RIP
LVS工作模式:NAT模式、DR模式、TUNNEL模式、FULLNAT模式
LVS调度算法:
静态算法:RR轮询,
WRR加权重轮询,
SH实现SESSION绑定,
DH目标地址哈希
动态算法:LC长连接应用,
WLC默认调度算法,
SED初始连接高权重,只检查活动链接,
NQ第一轮均匀分配后续SED
LBLC:动态DH算法
LBLCR带复制功能的LBLC,解决LBLC负载不均衡问题
ipvsadm程序
管理集群服务:增,删,改
增、改:
ipvsadm -A|E -t|u|f service-address [-s 算法,默认WLC]
-t:TCP协议端口
-u:UDP协议端口
-f:firewall MARK
例:
ipvsadm -A -t 192.168.32.20:80 -s wrr
删除:
ipvsadm -D -t|u|f service-address
清空:
ipvsadm -C
管理集群上的RS:增,删,改
增、改:
ipvsadm -a|e -t|u|f service-address -server-address [-g|i|m] [-w weight]
-g:gateway,dr类型,默认
-i:ipip,tun类型
-m:masquerade,nat类型
-w weight:权重
删:
ipvsadm -d -t|u|f service-address -server-address
查看:ipvsadm -Ln
保存规则到配置文件中:ipvsadm-save > /PATH/TO/IPVSADM_FILE
NAT模式:本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
(1)RIP和DIP在同一网络,且应使用私网地址;RS的网关要指向DIP
(2)请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
(3)支持端口映射,可修改请求报文的目标PORT
(4)VS必须是Linux系统,RS可以是任意OS系统
DR模式:直接路由,LVS默认模式,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
(1)Director和各RS都配置有VIP
(2)去报前段路由器将目标IP为VIP的请求报文发往Director
在前端网关做静态绑定VIP和Director的MAC地址
在RS上使用arptables工具
在RS上修改内核参数以限制ARP通告及应答级别
(3)RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director
(4)RS和Director要在同一物理网络
(5)请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
(6)不支持端口映射(端口不能修改)
(7)无需开启IP_porward
(8)RS可使用大多数OS系统
搭建NAT模型:
环境准备:
客户端:
192.168.32.10 GW:无 仅主机
lvs:
eth0 仅主机 192.168.32.20
eth1 NAT 192.168.29.100
开启net.ipv4.ip_forward
两台RS:
RS1:192.168.29.225 GW:192.168.29.100
RS2:192.168.29.226 GW:192.168.29.100
lvs服务器配置:
1.安装ipvsadm程序
yum -y install ipvsadm
2.修改网卡配置文件 ifcfg-eth0 ifcfg-eth1
vim ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=192.168.32.20
PREFIX=24
ONBOOT=yes
vim ifcfg-eth1
DEVICE=eth1
NAME=eth1
BOOTPROTO=static
IPADDR=192.168.29.100
PREFIX=24
ONBOOT=yes
3.开内核参数
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p //执行生效
4.添加管理集群
ipvsadm -A -t 192.168.32.20:80 -s wrr
5.添加管理集群上的RS
ipvsadm -a -t 192.168.32.20:80 -r 192.168.29.225:80 -m
ipvsadm -a -t 192.168.32.20:80 -r 192.168.29.226:8080 -m
RS服务器配置:
1.修改网卡配置文件,网关指向GW 192.168.29.100
vim ifcfg-eth0
添加:GATEWAY=192.168.29.100
2.安装http,页面写入数据启动服务
客户端配置:
1.修改网卡配置文件
vim ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=192.168.32.10
PREFIX=24
ONBOOT=yes
2.curl 192.168.32.20 //观察访问的内容验证
搭建DR模型:不支持端口映射(端口不能修改)
环境准备:
客户端:
192.168.32.10 GW:192.168.32.30
路由器:
eth0:192.168.32.30
eth1:192.168.29.230
开启net.ipv4.ip_forward
LVS:
eth0:192.168.29.30 GW:192.168.29.230
lo:VIP:192.168.29.232
两台RS:
RS1:192.168.29.225 GW:192.168.29.230 lo:VIP:192.168.29.232
RS2:192.168.29.226 GW:192.168.29.230 lo:VIP:192.168.29.232
lvs服务器配置:
1.安装ipvsadm程序
yum -y install ipvsadm
2.修改网卡配置文件 ifcfg-eth0 添加网关
vim ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=192.168.32.20
GATEWAY=192.168.29.230
PREFIX=24
ONBOOT=yes
3.添加管理集群
ipvsadm -A -t 192.168.29.232:80 -s rr
4.添加管理集群上的RS
ipvsadm -a -t 192.168.29.232:80 -r 192.168.29.225:80 -g
ipvsadm -a -t 192.168.29.232:80 -r 192.168.29.226:80 -g
路由器配置:
1.修改网卡配置文件
vim ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=192.168.32.30
PREFIX=24
ONBOOT=yes
vim ifcfg-eth1
DEVICE=eth1
NAME=eth1
BOOTPROTO=static
IPADDR=192.168.29.230
PREFIX=24
ONBOOT=yes
2.开内核参数
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p //执行生效
LVS和两台RS配置:
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/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ip a a 192.168.29.232/32 dev lo label lo:1
客户端配置:
1.修改网卡配置文件
vim ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=192.168.32.10
PREFIX=24
ONBOOT=yes
2.curl 192.168.29.232 //观察访问的内容验证
4. 总结 http协议的通信过程详解
1.客户端向服务器发送HTTP请求,请求包括请求方法、URL、协议版本、请求头部等信息。
2.服务器接收到请求后,解析请求头部和URL,根据请求头部中的信息进行相应的处理,并返回响应信息。
3.客户端接收到服务器返回的响应信息,根据响应头部中的信息进行相应的处理,如获取响应正文、判断响应状态等。
4.如果需要,客户端会继续向服务器发送请求,服务器也会继续返回响应信息,直到完成整个HTTP通信过程。
5. 总结 网络IO模型和nginx架构
网络I/O模型:
阻塞式I/O模型、非阻塞式I/O模型、I/O多路复用模型、信号驱动I/O模型和异步I/O模型。
网络I/O模型的特点和适用场景:
1.阻塞式I/O模型:最简单的一种模型,但性能较差。适用于并发量较小的应用场景。
2.非阻塞式I/O模型:通过非阻塞操作提高了性能。适用于并发量较小的应用场景。
3.I/O多路复用模型:可以同时处理多个I/O通道,提高了系统的并发性能。适用于并发量较大的应用场景。
4.信号驱动I/O模型:可以异步进行I/O操作。适用于并发量较大的应用场景。
5.异步I/O模型:可以实现真正的并发操作。适用于并发量非常大的应用场景
ngixn结构和进程
nginx的进程模型是一个master进程加上多个worker进程的模式。
master进程负责读取配置文件、启动worker进程、管理worker进程等工作;
worker进程则负责处理客户端请求,包括接收请求、解析请求、处理请求、返回响应等工作。
在nginx的进程模型中,每个worker进程都是独立的,它们之间不会相互干扰,也不会共享任何资源。
6. 完成nginx编译安装脚本
#!/bin/bash
SRC_DIR=/root
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
echo
}
os_version () {
awk -F'"' '/^VERSION_ID/{print $2}' /etc/os-release
}
[ -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
color "开始安装 nginx 依赖包" 0
if [ $ID == "centos" ] ;then
else
color '不支持此系统!' 1
exit
fi
elif [ $ID == "rocky" ];then
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 [ $ID = 'rocky' -o $ID = "centos" ];then
yum -y install gcc pcre-devel openssl-devel zlib-devel
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
7. 总结nginx核心配置,并实现nginx多虚拟主机
Nginx核心配置
Nginx的配置文件的组成部分:
1.主配置文件:nginx.conf
2.子配置文件: include conf.d/*.conf
3.fastcgi, uwsgi,scgi 等协议相关的配置文件
4.mime.types:支持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。MIME参考文档https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_Types
Nginx配置文件格式说明:
配置文件由指令与指令块构成
每条指令以;分号结尾,指令与值之间以空格符号分隔
可以将多条指令放在同一行,用分号分隔即可,但可读性差,不推荐
指令块以{ }大括号将多条指令组织在一起,且可以嵌套指令块
include语句允许组合多个配置文件以提升可维护性
使用#符号添加注释,提高可读性
使用$符号使用变量
部分指令的参数支持正则表达式
Nginx主配置文件的配置指令方式:
directive value [value2 ...];
注意:
(1) 指令必须以分号结尾
(2) 支持使用配置变量
内建变量:由Nginx模块引入,可直接引用
自定义变量:由用户使用set命令定义,格式: set variable_name value;
引用变量:$variable_name
主配置文件nginx.conf结构:四部分
main block:主配置段,即全局配置段,对http,mail都有效
#事件驱动相关的配置
event {
...
}
#http/https 协议相关配置段
http {
...
}
#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {
...
}
#stream 服务器相关配置段
stream {
...
}
Nginx主配置文件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;
}
实现nginx多虚拟主机
1.创建指定子配置文件目录
mkdir /apps/nginx/conf.d/
2.创建创建虚拟多主机目录,分别在对应目录中创建页面
mkdir /data/{pc,mobile}
echo "hello2" > /data/pc/index.html
echo "hello1" > /data/mobile/index.html
3.主配置文件中添加子配置文件指定路径
include /apps/nginx/conf.d/*.conf;
4.创建对应虚拟主机子配置文件
vim pc.conf
server {
server_name www.liguox.org;
location / {
root /data/pc;
}
}
vim mobile.conf
server {
server_name m.liguox.org;
location / {
root /data/mobile;
}
}
5.重载nginx配置文件
nginx -s reload
6.配置DNS,网站访问域名查看页面显示内容
8. 总结nginx日志格式定制
1.修改主配置文件,添加日志格式test1命令
log_format test1 '$remote_addr [$time_local] "$request"'
2.多虚拟主机对应子配置文件中添加启用test1日志格式命令
access_log /apps/nginx/logs/access-m.log test1;
access_log /apps/nginx/logs/access-www.log test1;
3.检查配置文件语法
nginx -t
4.重载配置文件
nginx -s reload