1. redis搭建哨兵原理和集群实现。
哨兵,英文名 Sentinel,是一个分布式系统,用于对主从结构中的每一台服务器进行监控,当主节点出现故障后通过投票机制来挑选新的主节点,并且将所有的从节点连接到新的主节点上。
哨兵的三个作用:
监控:监控谁?支持主从结构的工作一个是主节点一个是从节点,那肯定就是监控这俩个了。监控主节点和从节点是否正常运行;检测主节点是否存活,主节点和从节点运行情况。
通知:哨兵检测的服务器出现问题时,会向其他的哨兵发送通知,哨兵之间就相当于一个微信群,每个哨兵发现的问题都会发在这个群里。
自动转移故障:当检测到主节点宕机后,断开与宕机主节点连接的所有从节点,在从节点中选取一个作为主节点,然后将其他的从节点连接到这个最新主节点的上。并且告知客户端最新的服务器地址。这里有一个注意点,哨兵也是一台 Redis 服务器,只是不对外提供任何服务。配置哨兵时配置为单数。
哨兵搭建 juejin.cn/post/726599…
集群搭建 juejin.cn/post/726608…
2. LVS常用模型工作原理,及实现。
工作原理:
- 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
- PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
- IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
- POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器。
LVS-DR模式单网段和多网段 juejin.cn/post/726637…
3. LVS的负载策略有哪些,各应用在什么场景,通过LVS DR任意实现1-2种场景。
3.1LVS工作模式
- vs-nat:修改请求报文的目标IP,多目标IP的DNAT
- lvs-dr:操纵封装新的MAC地址
- lvs-tun:在原请求IP报文之外新加一个IP首部
- lvs-fullnat:修改请求报文的源和目标IP,默认内核不支持
3.2LVS调度算法
静态方法
仅根据算法本身进行调度
动态方法
主要根据每RS当前的负载状态及调度算法进行调度Overhead=value 较小的RS将被调度
4. web http协议通信过程,相关技术术语总结。
4.1 传输数据过程:
- http1.0 连接—>传输–>断开 在连接—>传输–>断开 每一个请求都要经过连接然后传输然后断开每一个请求 表示 请求的每一个URL
- http1.1 一次连接多次请求(建立一次三次握手 后面直接按照顺序请求所有的url)
- http2.0 一次连接多次请求(并发请求)
4.2 HTTP工作原理
在用户点击URL为www.magedu.org/index.html的…
- a.浏览器分析超链接中的URL
- b.浏览器向DNS请求解析www.magedu.org的IP地址
- c.DNS将解析出的IP地址192.168.72.150:80返回浏览器
- d.浏览器与服务器建立TCP连接(80端口)
- e.浏览器请求文档:GET /index.html
- f.服务器给出响应,将文档 index.html发送给浏览器
- g.释放TCP连接
- h.浏览器显示index.html
- i.web服务器关闭连接:一般情况下,一旦web服务器向浏览器发送了请求的数据,就会关闭TCP连接。若浏览器或者服务器在头信息中加入了Connection:keep-alive,TCP连接在发送后仍将以打开状态,于是,浏览器可以继续通过相同的连接发送请求。
4.3 相关技术术语
4.3.1 WEB开发语言
- html:Hyper Text Markup Language超文本标记语言,编程语言,主要负责实现页面的结构
- css:Cascading Style Sheet 层叠样式表, 定义了如何显示(装扮) HTML 元素,比如:字体大小和颜色属性等。样式通常保存在外部的 .css 文件中,用于存放一些HTML文件的公共属性,从而通过仅编辑一个简单的 CSS 文档,可以同时改变站点中所有页面的布局和外观。
- javascript:实现网页的动画效果,但是属于静态资源
4.3.2 HTTP响应
响应头部信息:
Connection: keep-alive # 响应长连接
Date: Tue, 14 Jun 2022 03:21:07 GMT # 响应时间
ETag: "53762af0-12e1" # 和浏览器缓存相关
Last-Modified: Fri, 16 May 2014 15:12:48 GMT# 最后内容修改时间
Server: nginx/1.20.1 # 服务器WEB版本信息
Request URL: http://10.0.0.8/ # 请求的URL 链接
Request Method: GET # 请求方法
Status Code: 304 OK # 服务状态码
Remote Address: 10.0.0.8:80 # 服务器的IP地址
响应报文中的状态码
状态码(Status-Code)是响应报文状态行中包含的一个3位数字,指明特定的请求是否被满足,如果没有满足,原因是什么。
通过状态码知道服务器状况:
200: 表示成功访问网站
301: 表示访问一个网站会跳转到另外一个网站 简称永久跳转
302: 表示访问一个网站会跳转到另外一个网站 简称临时跳转
304: 表示访问网站走的是浏览器的缓存
401: 表示访问网站会弹出让我们输入用户名和密码的对话框 权限认证
403: 访问页面 具体的资源不存在 但是存放资源的目录存在
404: 表示访问的内容页面不存在 用户访问了一个不存在的页面
500: 服务器内部错误 代码配置错误 服务端网络问题 无法访问到后端数据库
502: 有代理代理服务器不正常 或者 没有开启服务
503: 后端数据库服务器压力较大或者服务器暂时无法响应客户端请求的数据
504: 访问超时
2 开头表示 网站没问题
3 开头表示 网站跳转
4 开头表示 访问不了页面 服务器没有配置这个页面 用户访问了一个不存在的页面
5 表示服务器端问题 数据问题
4.3.3 MIME 消息
MIME : Multipurpose Internet Mail Extensions多用途互联网邮件扩展
MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。
4.3.4 URI和URL
URI: Uniform Resource Identifier 统一资源标识,分为URL 和 URN
URN:Uniform Resource Naming,统一资源命名
示例: P2P下载使用的磁力链接是URN的一种实现magnet:?xt=urn:btih:660557A6890EF888666
URL:Uniform Resorce Locator,统一资源定位符,用于描述某服务器某特定资源位置
两者区别:URN如同一个人的名称,而URL代表一个人的住址。换言之,URN定义某事物的身份,而URL提供查找该事物的方法。URN仅用于命名,而不指定地址
4.3.5 PV,UV和IP
PV: 用户访问一个页面称为一个PV 刷新1次+1
UV: 表示用户真实独立的设备 笔记本算一个UV 手机算一个UV 平板算一个UV
IP: 表示公网IP 表示通过哪个公网IP访问的网站
家里一个IP 手机 平台 电视 通过路由器上网 NAT—>转换成了一个公网IP地址
公司算一个IP 所有员工通过NAT上网
4.3.6 网站访问量
网站访问量统计的重要指标
- IP(独立IP):即Internet Protocol,指独立IP数。一天内来自相同客户机IP 地址只计算一次,记录远程客户机IP地址的计算机访问网站的次数,是衡量网站流量的重要指标
- PV(访问量): 即Page View, 页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,PV并不是页面的来访者数量,而是网站被访问的页面数量
- UV(独立访客):即Unique Visitor,访问网站的一台电脑为一个访客。一天内相同的客户端只被计算一次。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的
网站访问量的计算方式
- QPS:request per second,每秒请求数
- PV,QPS和并发连接数换算公式
- QPS= PV * 页面衍生连接次数/ 统计时间(86400)
- 并发连接数 =QPS * http平均响应时间
- 峰值时间:每天80%的访问集中在20%的时间里,这20%时间为峰值时间
- 峰值时间每秒请求数(QPS)=( 总PV数 页面衍生连接次数)80% ) / ( 每天秒数 * 20% )
5. 总结网络IO模型和nginx架构。
5.1网络IO模型
阻塞型 I/O 模型(blocking IO)
阻塞式I/O(Input/Output)模型是一种传统的I/O处理模型,它在进行I/O操作时会阻塞程序的执行,直到I/O操作完成才会继续执行后续的代码。在阻塞式I/O模型中,当一个I/O操作发起时,程序会一直等待,直到数据从I/O设备读取完毕或数据成功写入到I/O设备。
在阻塞式I/O模型中,当程序发起一个I/O请求,操作系统会将程序阻塞,并将控制权交给内核去处理I/O操作。当I/O操作完成后,内核会通知程序,并将控制权返回给程序继续执行后续的代码。这种模型下,程序在等待I/O操作完成期间是无法做其他的事情的,因为它被阻塞住了。
阻塞式I/O模型的一个主要缺点是,当一个I/O操作阻塞时,整个程序都会停止响应,无法同时处理其他的任务或请求。这在需要同时处理多个并发请求的情况下会导致性能瓶颈。如果一个I/O操作非常耗时,那么其他的请求将会被阻塞,程序的整体性能也会下降。
非阻塞型 I/O 模型 (nonblocking IO)
非阻塞式I/O(Input/Output)模型是一种改进的I/O处理模型,它在进行I/O操作时不会阻塞程序的执行,而是立即返回并允许程序继续执行后续的代码。在非阻塞式I/O模型中,当程序发起一个I/O请求后,它可以继续执行其他任务而无需等待I/O操作完成。
在非阻塞式I/O模型中,当程序发起一个非阻塞的I/O请求,操作系统会立即返回一个结果,表示该I/O操作是否完成。如果操作完成,程序可以获取到相应的数据;如果操作未完成,则可以继续执行其他任务或轮询该I/O操作的状态,以确定何时完成。
非阻塞式I/O模型通常与循环轮询结合使用。程序会不断地查询(轮询)I/O操作的状态,直到操作完成为止。这种轮询的方式可以通过使用非阻塞I/O操作和辅助函数(如select、poll或epoll等)来实现。
非阻塞式I/O模型的优点是可以在等待I/O操作完成的同时,继续处理其他任务,提高了程序的并发性和性能。然而,由于需要不断轮询I/O操作的状态,这可能会导致CPU资源的浪费。
需要注意的是,非阻塞式I/O模型仍然是同步I/O操作,因为程序需要主动轮询以确定I/O操作是否完成。与之相对的是异步I/O模型,异步I/O模型中的I/O操作完成后会通过回调或事件通知的方式来通知程序,而无需程序主动轮询。
I/O 多路复用型 (I/O multiplexing)
I/O多路复用(I/O Multiplexing)是一种高效的I/O处理模型,用于同时监控多个I/O操作的状态并进行处理。它可以在一个线程中同时管理多个I/O通道,而无需为每个通道创建一个独立的线程。
在I/O多路复用模型中,通过使用特定的系统调用(如select、poll、epoll等)来监听多个I/O通道的事件。这些系统调用可以监视多个文件描述符(sockets、pipes等)上的读写事件,并在有事件发生时通知程序进行相应的处理。
I/O多路复用模型的基本思想是将多个I/O操作合并为一个I/O操作,然后通过系统调用进行等待,以避免阻塞线程。当任何一个I/O通道有数据可读或可写时,系统会通知程序进行相应的读取或写入操作。
使用I/O多路复用模型的主要优点是可以在单个线程中同时处理多个I/O通道,从而提高了系统的并发性能。相对于阻塞式I/O或非阻塞式I/O模型,它减少了线程的创建和上下文切换的开销。
常见的I/O多路复用系统调用有:
- select:在一组文件描述符上进行I/O事件的等待,支持的文件描述符数量有限。
- poll:与select类似,但没有文件描述符数量的限制。
- epoll:在Linux系统上提供的可扩展I/O事件通知机制,支持更高的并发连接数,并且效率较高。
使用I/O多路复用模型时,程序通常需要配合非阻塞式I/O操作,以避免单个I/O操作的阻塞影响其他操作。同时,需要注意合理设置I/O通道的读写缓冲区,以避免数据拷贝带来的性能损耗。
总之,I/O多路复用模型是一种高效的I/O处理模型,适用于需要同时处理多个I/O通道的场景,提高了系统的并发性能和可扩展性。
信号驱动式 I/O 模型 (signal-driven IO)
信号驱动I/O(Signal-driven I/O)是一种I/O处理模型,通过使用信号来通知程序当一个I/O操作已经完成或有数据可读取。与传统的阻塞式I/O或非阻塞式I/O模型不同,信号驱动I/O模型允许程序在进行I/O操作时继续执行其他任务,而无需等待或轮询。
在信号驱动I/O模型中,程序首先通过系统调用(如sigaction)来注册一个信号处理函数,用于处理与I/O操作相关的信号。然后,程序发起一个异步的I/O操作,并继续执行其他任务。当I/O操作完成时,操作系统会发送一个信号(如SIGIO)给程序,程序在信号处理函数中得以知晓该I/O操作已经完成,然后可以进行数据读取或相应的处理操作。
信号驱动I/O模型的优点是可以异步地进行I/O操作,而无需阻塞程序或进行轮询,从而提高了程序的并发性能和响应性。它在某些情况下可以替代多线程或多进程模型,减少了上下文切换和线程/进程创建的开销。
需要注意的是,信号驱动I/O模型对于支持信号驱动的I/O设备和操作系统的支持是必要的。不是所有的I/O设备和操作系统都能完全支持信号驱动I/O模型。在实际应用中,需要仔细考虑和评估使用信号驱动I/O模型的可行性和适用性。
总结而言,信号驱动I/O模型通过使用信号来通知程序I/O操作的完成,允许程序在进行I/O操作时继续执行其他任务,提高了并发性能和响应性。然而,其适用性受到设备和操作系统的限制。
异步 I/O 模型 (asynchronous IO)
异步I/O(Asynchronous I/O)模型是一种高级的I/O处理模型,与阻塞式I/O、非阻塞式I/O和信号驱动I/O模型有所不同。在异步I/O模型中,当一个I/O操作发起后,程序可以继续执行其他任务而无需等待该I/O操作完成。当I/O操作完成时,程序会得到通知,并可以处理已完成的操作。
在异步I/O模型中,程序发起一个异步的I/O请求,并指定一个回调函数或事件处理程序。然后,程序可以继续执行其他任务,而无需等待I/O操作完成。当I/O操作完成时,操作系统会通知程序,并调用预先指定的回调函数来处理已完成的操作。通过回调函数,程序可以获取到操作的结果或数据,并进行相应的处理。
异步I/O模型的优点是可以实现真正的并发操作,不需要主动轮询或阻塞线程等待I/O操作完成。相对于其他模型,它可以更高效地处理大量的并发I/O操作,提高系统的吞吐量和性能。
在实际应用中,异步I/O模型通常需要使用特定的异步I/O机制或库来实现,例如Windows系统上的IOCP(Input/Output Completion Ports)和Unix-like系统上的AIO(Asynchronous I/O)。这些机制提供了异步I/O操作的支持,并管理I/O操作的状态、回调处理和资源管理等。
需要注意的是,异步I/O模型的编程模式相对于其他模型更加复杂,需要合理设计和管理回调函数、事件处理程序以及可能的并发访问。但在需要处理大量并发I/O操作或具有高性能要求的应用中,异步I/O模型可以是一种有效的选择。
总结而言,异步I/O模型允许程序在发起I/O操作后继续执行其他任务,并通过回调函数或事件处理程序来处理已完成的操作。它可以实现真正的并发操作,提高系统的并发性能和吞吐量。然而,相对于其他模型,它的编程模式更加复杂。
五种 IO 对比
阻塞式I/O:
- 当一个I/O操作发起时,程序会阻塞等待操作完成。
- 阻塞式I/O是传统的I/O模型,适用于简单的应用场景。
- 当有多个并发请求时,性能较差,因为每个请求都需要等待I/O操作完成。
非阻塞式I/O:
- 当一个I/O操作发起后,程序可以继续执行其他任务,而无需等待操作完成。
- 需要通过轮询或者选择性地进行非阻塞I/O操作的状态查询。
- 提高了并发性能,但仍然需要不断轮询I/O操作的状态。
I/O多路复用:
- 通过系统调用(如select、poll、epoll)在多个I/O通道上监听事件。
- 可以同时处理多个I/O通道,避免了阻塞和轮询的开销。
- 提高了并发性能和响应性,适用于大量并发连接的场景。
信号驱动I/O:
- 使用信号来通知程序I/O操作的完成或数据的可读取。
- 可以异步进行I/O操作,不需要阻塞或轮询。
- 提高了并发性能和响应性,但需要设备和操作系统的支持。
异步I/O:
- 发起异步I/O请求后,程序可以继续执行其他任务,通过回调函数处理操作完成的通知。
- 真正的并发操作,不需要阻塞、轮询或信号等待。
- 需要特定的异步I/O机制或库的支持,编程模式相对复杂。
综合比较,阻塞式I/O模型简单但性能较差,非阻塞式I/O模型通过非阻塞操作提高了性能,I/O多路复用模型可以同时处理多个I/O通道,信号驱动I/O模型可以异步进行I/O操作,而异步I/O模型可以实现真正的并发操作。选择适当的模型取决于应用需求、并发量和性能要求等因素。
5.2Nginx架构
模块化结构的思想是一个很久的概念,但也正是这个概念造就了Nginx现在的领先优越性。
我们知道Nginx从总体上来讲是由许多个模块构成的。习惯将Nginx分为5大模块分别为:核心模块,标准HTTP模块,可选HTTP模块,邮件服务模块和第三方模块。
- 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
- 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
- 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
- Stream服务模块: 实现反向代理功能,包括TCP协议代理
- 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
Nginx的大致架构就是遵循一个这样的逻辑:
1.Nginx启动后,会产生一个主进程,主进程执行一系列的工作后会产生一个或者多个工作进程;
2.在客户端请求动态站点的过程中,Nginx服务器还涉及和后端服务器的通信。Nginx将接收到的Web请求通过代理转发到后端服务器,由后端服务器进行数据处理和组织;
3.Nginx为了提高对请求的响应效率,降低网络压力,采用了缓存机制,将历史应答数据缓存到本地。保障对缓存文件的快速访问;
6. nginx总结核心配置和优化。
Nginx核心配置
在学习 Nginx之前,要熟知它的配置文件,毕竟,下面需要做的所有配置(反向代理、负载均衡、动静分离等),都是基于它的配置文件。
Nginx默认的配置文件是在安装目录下的 conf目录下,后续对 Nginx的使用基本上都是对此配置文件进行相应的修改。完整的配置文件,可以看一下文章最后。修改过nginx.conf配置文件,记得要重启Nginx服务(☆☆☆☆☆)
配置文件中有很多#号,该符号表示注释内容,去掉所有以 #开头的段落,精简之后的配置文件内容如下(PS:其实注释掉的地方,都是一些功能的使用代码,需要用到的时候,取消注释即可):
# 主进程叫master,负责管理子进程,子进程叫worker
# worker_processes配置项表示开启几个业务进程,一般和cpu核数有关
worker_processes 1;
events {
worker_connections 1024;
}
http {
# include表示可以引入其他文件,此处表示引入http mime类型
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 虚拟主机,可以配置多个
server {
listen 80;
server_name localhost;
location / {
# 路径匹配之后,哪个目录下去匹配相应的网页,html是相对路径
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
去掉注释信息后,可以将 nginx.conf 配置文件分为三部分:
第一部分:全局块
worker_processes 1;
从配置文件开始到events块之间的内容,主要会设置一些影响Nginx服务器整体运行的配置指令,主要包括:配置运行Nginx服务器的用户(组)、允许生成的 worker process 数,进程PID存放路径、日志存放路径和类型以及配置文件的引入等。
上面这行 worker_processes 配置,是 Nginx 服务器并发处理服务的关键配置,该值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的约束。
第二部分:events 块
events {
worker_connections 1024;
}
events 块涉及的指令主要影响Nginx服务器与用户的网络连接,常用的设置包括:是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等
上述例子就表示每个 work process 支持的最大连接数为 1024。这部分的配置对Nginx的性能影响较大,在实际中应该灵活配置。
第三部分:http 块
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
这部分是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http 块也可以包括 http 全局块、server 块。下面的反向代理、动静分离、负载均衡都是在这部分中配置
1)http 全局块:http 全局块配置的指令包括:文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
2)server 块:这块和虚拟主机有密切关系,从用户角度看,虚拟主机和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机。而每个server块也分为全局server块,以及可以同时包含多个locaton块。
全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是:基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
# 若请求路径像这样:www.xxxx/img/example.png
# 则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件
location /img/ {
root /var/www/image;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
以上就是Nginx核心配置文件详解的全部内容。
7. 使用脚本完成一键编译安装nginx任意版本。
#!/bin/bash
SRC_DIR=/usr/local/src
NGINX_URL=http://nginx.org/download/
NGINX_FILE=nginx-1.20.2
#NGINX_FILE=nginx-1.18.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
else
color '开始下载 nginx 源码包' 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'`
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 /dev/null || { color "nginx 启动失败,退出!" 1 ; exit; }
color "nginx 安装完成" 0
}
check
install
8. 任意编译一个第3方nginx模块,并使用。
新建一个 PC web 站点
#定义子配置文件路径
[root@centos8 ~]# mkdir /apps/nginx/conf/conf.d
[root@centos8 ~]# vim /apps/nginx/conf/nginx.conf
http {
......
include /apps/nginx/conf/conf.d/*.conf; #在配置文件的最后面添加此行,注意不要放在最前面,会导致前面的命令无法生效
}
#创建PC网站配置
[root@centos8 ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
server_name www.magedu.org;
location / {
root /data/nginx/html/pc;
}
}
[root@centos8 ~]# mkdir -p /data/nginx/html/pc
[root@centos8 ~]# echo "pc web" > /data/nginx/html/pc/index.html
[root@centos8 ~]# systemctl reload nginx
#访问测试
新建一个 Mobile web 站点
[root@centos8 ~]# cat /apps/nginx/conf/conf.d/mobile.conf
server {
listen 80;
server_name m.magedu.org; #指定第二个站点名称
location / {
root /data/nginx/html/mobile;
}
}
[root@centos8 ~]# mkdir -p /data/nginx/html/mobile
[root@centos8 ~]# echo "mobile web" >> /data/nginx/html/mobile/index.html
[root@centos8 ~]# systemctl reload nginx
root 与 alias
root:指定web的家目录,在定义location的时候,文件的绝对路径等于 root+location
server {
listen 80;
server_name www.magedu.org;
location / {
root /data/nginx/html/pc;
}
location /about {
root /opt/html; #必须要在html目录中创建一个名为about的目录才可以访问,否则报错。
}
}
[root@centos8 ~]# mkdir -p /opt/html/about
[root@centos8 ~]# echo about > /opt/html/about/index.html
#重启Nginx并访问测试
alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制;仅能用于 location上下文,此指令使用较少
server {
listen 80;
server_name www.magedu.org;
location / {
root /data/nginx/html/pc;
}
location /about { #注意about后不要加/ , 使用alias的时候uri后面如果加了斜杠,则下面的路径
配置必须加斜杠,否则403
alias /opt/html/about; #当访问about的时候,会显示alias定义的/opt/html/about里面的
内容。
}
}
#重启Nginx并访问测试
注意:location中使用root指令和alias指令的意义不同
root 给定的路径对应于location中的/uri 左侧的/
alias 给定的路径对应于location中的/uri 的完整路径
Nginx 状态页
基于nginx 模块 ngx_http_stub_status_module 实现,在编译安装nginx的时候需要添加编译参数 -- with-http_stub_status_module,否则配置完成之后监测会是提示语法错误
注意: 状态页显示的是整个服务器的状态,而非虚拟主机的状态
#配置示例:
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;
}
#状态页用于输出nginx的基本状态信息:
#输出信息示例:
Active connections: 291
server accepts handled requests
16630948 16630948 31070465
上面三个数字分别对应accepts,handled,requests三个值
Reading: 6 Writing: 179 Waiting: 106
Active connections: #当前处于活动状态的客户端连接数,包括连接等待空闲连接数
=reading+writing+waiting
accepts:#统计总值,Nginx自启动后已经接受的客户端请求连接的总数。
handled:#统计总值,Nginx自启动后已经处理完成的客户端请求连接总数,通常等于accepts,除非有因
worker_connections限制等被拒绝的连接
requests:#统计总值,Nginx自启动后客户端发来的总的请求数。
Reading:#当前状态,正在读取客户端请求报文首部的连接的连接数,数值越大,说明排队现象严重,性能不足
Writing:#当前状态,正在向客户端发送响应报文过程中的连接数,数值越大,说明访问量很大
Waiting:#当前状态,正在等待客户端发出请求的空闲连接数,开启 keep-alive的情况下,这个值等于
active – (reading+writing)
Nginx 第三方模块
第三模块是对nginx 的功能扩展,第三方模块需要在编译安装Nginx 的时候使用参数--addmodule=PATH指定路径添加,有的模块是由公司的开发人员针对业务需求定制开发的,有的模块是开 源爱好者开发好之后上传到github进行开源的模块,nginx的第三方模块需要从源码重新编译进行支持
nginx-module-vts 模块实现流量监控
github.com/vozlt/nginx…
[root@centos8 ~]#cd /usr/local/src
[root@centos8 src]#git clone git://github.com/vozlt/nginx-module-vts.git
[root@centos8 src]#cd nginx-1.18.0/
[root@centos8 nginx-1.18.0]#./configure --prefix=/apps/nginx --addmodule=/usr/local/src/nginx-module-vts
[root@centos8 nginx-1.18.0]#make && make install
[root@centos8 ~]#vim /apps/nginx/conf/nginx.conf
http {
......
vhost_traffic_status_zone;
......
server {
......
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
......
}
}
[root@centos8 ~]#systemctl restart nginx
#浏览器访问:http:///status 可以看到下面显示