快速带你玩转高性能web服务器

news2024/11/24 17:02:19

目录

一.Web 服务基础介绍

​编辑1.1 互联网发展历程回顾

1.2 Web 服务介绍

1.2.1 Apache的图标

1.2.2 NGINX的图标:

1.2.3 Apache 经典的 Web 服务端

1.2.3.1 Apache prefork 模型

1.2.3.2 Apache worker 模型

1.2.3.3 Apache event模型

1.2.4 Nginx-高性能的 Web 服务端

1.2.5 用户访问体验和性能 

1.2.5.1 用户访问体验统计

1.2.5.2 影响用户体验的因素

1.2.6 服务端 I/O 流程

1.2.6.1 磁盘 I/O

1.2.6.2 网络 I/O

1.3 I/O 模型

二.Nginx 架构和安装

2.1 Nginx 概述

2.1.1 Nginx 介绍

2.1.2 Nginx 功能介绍

2.2.3 基础特性

2.2.4 Web 服务相关的功能

2.2 Nginx 架构和进程

2.2.1 Nginx 进程结构

2.2.2 Nginx 进程间通信

2.2.3 Nginx 启动和 HTTP 连接建立

2.2.4 HTTP 处理过程

2.3 Nginx 模块介绍

2.4 Nginx 安装

2.4.1 Nginx版本和安装方式

2.4.2.Nginx 编译安装

2.4.2.1 编译安装 Nginx

2.4.2.2 验证版本及编译参数

2.4.2.3使用安装完成的二进制文件nginx

2.4.2.4 Nginx 启动文件

2.6 平滑升级和回滚

2.6.2 平滑升级和回滚案例

三 Nginx 核心配置详解

3.1 配置文件说明

3.2 全局配置

3.3 http 配置块

3.4 核心配置示例

3.4.1 新建一个 PC web 站点

3.4.2 root 与 alias

3.4.3 location 的详细使用

3.4.3.1 匹配案例-精确匹配

3.4.3.2 匹配案例-区分大小写

3.4.3.3 匹配案例-不区分大小写

3.4.3.4 匹配案例-URI开始

3.4.3.5 匹配案例-文件名后缀

3.4.3.6 匹配案例-优先级

3.4.3.7 生产使用案例

3.4.4 Nginx 账户认证功能

​编辑3.4.5 自定义错误页面

3.4.6 自定义错误日志

3.4.7 检测文件是否存在

3.4.8 长连接配置

3.4.9 作为下载服务器配置

四 Nginx 高级配置


.Web 服务基础介绍

正常情况下的单次web服务访问流程:

1.1 互联网发展历程回顾

  • 199332日,中国科学院高能物理研究所租用AT&T公司的国际卫星信道建立的接入美国SLAC国家实 验室的64K专线正式开通,成为我国连入Internet的第一根专线。
  • 1995年马云开始创业并推出了一个web网站 中国黄页
  • 1999年创建阿里巴巴www.alibabagroup.com
  • 2003510日创立淘宝网
  • 200412月,马云创立第三方网上支付平台支付宝(蚂蚁金服旗下,共有蚂蚁金服支付宝、余额宝、招财宝、蚂蚁聚宝、网商银行、蚂蚁花呗、芝麻信用等子业务板块)
  • 2009年开始举办双十一购物狂欢节,以下是历年交易成交额:
2009 年双十一: 5000 万元
2010 年双十一: 9.36 亿元
2011 年双十一: 33.6 亿元
2012 年双十一: 191 亿元
2013 年双十一: 350 亿元
2014 年双十一: 571 亿元
2015 年双十一: 912.17 亿元
2016 年双十一: 1207 亿元
2017 年双十一: 1682.69 亿元
2018 年双十一: 2135 亿元
2019 年双十一: 2684 亿元
2020 年双十一: 4982 亿元
2021 年双十一: 5403 亿元
2022 年双十一: 5571 亿元
  • 2012111日淘宝商城正式更名为天猫
  • 2014919日里巴巴集团于纽约证券交易所正式挂牌上市

1.2 Web 服务介绍

1.2.1 Apache的图标

1.2.2 NGINX的图标:

1.2.3 Apache 经典的 Web 服务端

  • Apache起初由美国的伊利诺伊大学香槟分校的国家超级计算机应用中心开发
  • 目前经历了两大版本分别是1.X2.X
  • 其可以通过编译安装实现特定的功能
1.2.3.1 Apache prefork 模型
  • 预派生模式,有一个主控制进程,然后生成多个子进程,使用select模型,最大并发1024
  • 每个子进程有一个独立的线程响应用户请求
  • 相对比较占用内存,但是比较稳定,可以设置最大和最小进程数
  • 是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景
优点:稳定
缺点:每个用户请求需要对应开启一个进程 , 占用资源较多,并发性差 , 不适用于高并发场景

1.2.3.2 Apache worker 模型
  • 一种多进程和多线程混合的模型
  • 有一个控制进程,启动多个子进程
  • 每个子进程里面包含固定的线程
  • 使用线程程来处理请求
  • 当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,
  • 由于其使用了线程处理请求,因此可以承受更高的并发
优点:相比 prefork 占用的内存较少,可以同时处理更多的请求
缺点:使用 keepalive 的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用 (该问题在prefork模式下,同样会发生)

1.2.3.3 Apache event模型
Apache 中最新的模式, 2012 年发布的 apache 2.4.X 系列正式支持 event 模型 , 属于事件驱动模型 (epoll)
每个进程响应多个请求,在现在版本里的已经是稳定可用的模式
它和 worker 模式很像,最大的区别在于,它解决了 keepalive 场景下长期被占用的线程的资源浪费问题
(某些线程因为被 keepalive ,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时) event MPM 中,会有一个专门的线程来管理这些 keepalive 类型的线程
当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力
优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理 keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
缺点:没有线程安全控制

1.2.4 Nginx-高性能的 Web 服务端

Nginx 是由 1994 年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯 rambler.ru 公司开发的,开发工作最早从2002 年开始,第一次公开发布时间是 2004 10 4 日,版本号是 0.1.0
2019 3 11 F5 NGINX 达成协议 ,F5 将收购 NGINX 的所有已发行股票,总价值约为 6.7 亿美元。6.7亿美金约合 44.97 亿人民币 ,nginx 核心模块代码长度 198430 (包括空格、注释),所以一行代码约为2.2万人民币
官网地址 www.nginx.org
Nginx 历经十几年的迭代更新( https://nginx.org/en/CHANGES ), 目前功能已经非常完善且运行稳定,另外Nginx 的版本分为开发版、稳定版和过期版, nginx 以功能丰富著称,它即可以作为 http 服务器,也可以作为反向代理服务器或者邮件服务器能够快速的响应静态网页的请求
支持 FastCGI/SSL/Virtual Host/URL Rwrite /Gzip / HTTP Basic Auth/http 或者 TCP 的负载均衡 (1.9 版本以上且开启stream 模块 ) 等功能,并且支持第三方的功能扩展。
天猫 淘宝 京东 小米 163 新浪等一线互联网公司都在用Nginx或者进行二次开发
基于Nginx的工作场景:

1.2.5 用户访问体验和性能 

1.2.5.1 用户访问体验统计
互联网存在用户速度体验的 1-3-10 原则,即 1 秒最优, 1-3 秒较优, 3~10 秒比较慢, 10 秒以上用户无法接受。用户放弃一个产品的代价很低,只是换一个URL 而已。

  • 全球最大搜索引擎 Google:慢500ms = 20% 将放弃访问。
  • 全球最大的电商零售网站亚马逊:慢100ms = 1% 将放弃交易
  • 有很多研究都表明,性能对用户的行为有很大的影响:
  • 79%的用户表示不太可能再次打开一个缓慢的网站
  • 47%的用户期望网页能在2秒钟以内加载
  • 40%的用户表示如果加载时间超过三秒钟,就会放弃这个网站
  • 页面加载时间延迟一秒可能导致转换损失7%,页面浏览量减少11%
  • 8秒定律:用户访问一个网站时,如果等待网页打开的时间超过8秒,会有超过30%的用户放弃等待
1.2.5.2 影响用户体验的因素
据说马云在刚开始创业在给客户演示时,打开一个网站花了不到四个小时。
影响用户体验的因素
1. 客户端
  • 客户端硬件配置
  • 客户端网络速率
  • 客户端与服务端距离
2. 服务器
  • 服务端网络速率
  • 服务端硬件配置
  • 服务端架构设计
  • 服务端应用程序工作模式
  • 服务端并发数量服务端响应文件大小及数量 buffer cache
  • 服务端I/O压力1.2.4 服务端 I/O 流程

1.2.6 服务端 I/O 流程

I/O 在计算机中指 Input/Output IOPS (Input/Output Per Second) 即每秒的输入输出量 ( 或读写次数 ), 是衡量磁盘性能的主要指标之一。IOPS 是指单位时间内系统能处理的 I/O 请求数量,一般以每秒处理的I/O请求数量为单位, I/O 请求通常为读或写数据操作请求。
一次完整的 I/O 是用户空间的进程数据与内核空间的内核数据的报文的完整交换,但是由于内核空间与用户空间是严格隔离的,所以其数据交换过程中不能由用户空间的进程直接调用内核空间的内存数据,而是需要经历一次从内核空间中的内存数据copy 到用户空间的进程内存当中,所以简单说 I/O 就是把数据从内核空间中的内存数据复制到用户空间中进程的内存当中。
服务器的 I/O
  • 磁盘I/O
  • 网络I/O : 一切皆文件,本质为对socket文件的读写
1.2.6.1 磁盘 I/O
磁盘 I/O 是进程向内核发起系统调用,请求磁盘上的某个资源比如是 html 文件或者图片,然后内核通过相应的驱动程序将目标文件加载到内核的内存空间,加载完成之后把数据从内核内存再复制给进程内存,如果是比较大的数据也需要等待时间
机械磁盘的寻道时间、旋转延迟和数据传输时间:
寻道时间:是指磁头移动到正确的磁道上所花费的时间,寻道时间越短则 I/O 处理就越快,目前磁盘的寻道时间一般在3-15 毫秒左右。
旋转延迟:是指将磁盘片旋转到数据所在的扇区到磁头下面所花费的时间,旋转延迟取决于磁盘的转速,通常使用磁盘旋转一周所需要时间的1/2 之一表示,比如 7200 转的磁盘平均训传延迟大约为
60*1000/7200/2=4.17 毫秒,公式的意思为 (每分钟 60 *1000 毫秒每秒 /7200 转每分 /2 ),如果是
15000 转的则为 60*1000/15000/2=2 毫秒。
数据传输时间:指的是读取到数据后传输数据的时间,主要取决于传输速率,这个值等于数据大小除以传输速率,目前的磁盘接口每秒的传输速度可以达到600MB ,因此可以忽略不计。
常见的机械磁盘平均寻道时间值:
7200 / 分的磁盘平均物理寻道时间: 9 毫秒
10000 / 分的磁盘平均物理寻道时间: 6 毫秒
15000 / 分的磁盘平均物理寻道时间: 4 毫秒
常见磁盘的平均延迟时间:
7200 转的机械盘平均延迟: 60*1000/7200/2 = 4.17ms
10000 转的机械盘平均延迟: 60*1000/10000/2 = 3ms
15000 转的机械盘平均延迟: 60*1000/15000/2 = 2ms
每秒最大 IOPS 的计算方法:
7200 转的磁盘 IOPS 计算方式: 1000 毫秒 /(9 毫秒的寻道时间 +4.17 毫秒的平均旋转延迟时
)=1000/13.13=75.9 IOPS
10000 转的磁盘的 IOPS 计算方式: 1000 毫秒 /(6 毫秒的寻道时间 +3 毫秒的平均旋转延迟时
)=1000/9=111IOPS
15000 转的磁盘的 IOPS 计算方式: 15000 毫秒 /(4 毫秒的寻道时间 +2 毫秒的平均旋转延迟时
)=1000/6=166.6 IOPS
1.2.6.2 网络 I/O
网络通信就是网络协议栈到用户空间进程的 IO 就是网络 IO
网络 I/O 处理过程
  • 获取请求数据,客户端与服务器建立连接发出请求,服务器接受请求(1-3
  • 构建响应,当服务器接收完请求,并在用户空间处理客户端的请求,直到构建响应完成(4
  • 返回数据,服务器将已构建好的响应再通过内核空间的网络 I/O 发还给客户端(5-7
不论磁盘和网络 I/O
每次 I/O ,都要经由两个阶段:
  • 第一步:将数据从文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长
  • 第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短

1.3 I/O 模型

在这里就不过多介绍,如果想要了解可以查看http://t.csdnimg.cn/NR5LT

.Nginx 架构和安装

2.1 Nginx 概述

2.1.1 Nginx 介绍

Nginx engine X 2002 年开发,分为社区版和商业版 (nginx plus )
2019 3 11 F5 Networks 6.7 亿美元的价格收购
Nginx 是免费的、开源的、高性能的 HTTP 和反向代理服务器、邮件代理服务器、以及 TCP/UDP 代理服务器
解决 C10K 问题( 10K Connections
Nginx 官网: http://nginx.org
nginx 的其它的二次发行版:
  • Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从201112月开始,Tengine成为一个开源项目官网: http://tengine.taobao.org/
  • OpenResty:基于 Nginx Lua 语言的高性能 Web 平台, 章亦春团队开发,官网:http://openresty.org/cn/

2.1.2 Nginx 功能介绍

  • 静态的web资源服务器html,图片,jscsstxt等静态资源
  • http/https协议的反向代理
  • 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
  • tcp/udp协议的请求转发(反向代理)
  • imap4/pop3协议的反向代理

2.2.3 基础特性

  • 模块化设计,较好的扩展性
  • 高可靠性
  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件
  • 低内存消耗:10000keep-alive连接模式下的非活动连接,仅需2.5M内存
  • event-driven,aio,mmapsendfile

2.2.4 Web 服务相关的功能

  • 虚拟主机(server
  • 支持 keep-alive 和管道连接(利用一个连接做多次请求)
  • 访问日志(支持基于日志缓冲提高其性能)url rewirte
  • 路径别名
  • 基于IP及用户的访问控制
  • 支持速率限制及并发数限制
  • 重新配置和在线升级而无须中断客户的工作进程

2.2 Nginx 架构和进程

2.2.1 Nginx 进程结构

web 请求处理机制
  • 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求
  • 多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
Nginx 是多进程组织模型,而且是一个由 Master 主进程和 Worker 工作进程组成。

主进程 (master process) 的功能:
  • 对外接口:接收外部的操作(信号)
  • 对内转发:根据外部的操作的不同,通过信号管理 Worker
  • 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
  • 读取Nginx 配置文件并验证其有效性和正确性
  • 建立、绑定和关闭socket连接
  • 按照配置生成、管理和结束工作进程
  • 接受外界指令,比如重启、升级及退出服务器等指令
  • 不中断服务,实现平滑升级,重启服务并应用新的配置
  • 开启日志文件,获取文件描述符
  • 不中断服务,实现平滑升级,升级失败进行回滚处理
  • 编译和处理perl脚本
工作进程( worker process )的功能:
  • 所有 Worker 进程都是平等的
  • 实际处理:网络请求,由 Worker 进程处理
  • Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争
  • CPU资源,
  • 增加上下文切换的损耗
  • 接受处理客户的请求
  • 将请求依次送入各个功能模块进行处理
  • I/O调用,获取响应数据
  • 与后端服务器通信,接收后端服务器的处理结果
  • 缓存数据,访问缓存索引,查询和调用缓存数据
  • 发送请求结果,响应客户的请求
  • 接收主程序指令,比如重启、升级和退出等

2.2.2 Nginx 进程间通信

工作进程是由主进程生成的,主进程使用 fork() 函数,在 Nginx 服务器启动过程中主进程根据配置文件决定启动工作进程的数量,然后建立一张全局的工作表用于存放当前未退出的所有的工作进程,主进程生成工作进程后会将新生成的工作进程加入到工作进程表中,并建立一个单向的管道并将其传递给工作进程,该管道与普通的管道不同,它是由主进程指向工作进程的单向通道,包含了主进程向工作进程发出的指令、工作进程ID 、工作进程在工作进程表中的索引和必要的文件描述符等信息。
主进程与外界通过信号机制进行通信,当接收到需要处理的信号时,它通过管道向相关的工作进程发送正确的指令,每个工作进程都有能力捕获管道中的可读事件,当管道中有可读事件的时候,工作进程就会从管道中读取并解析指令,然后采取相应的执行动作,这样就完成了主进程与工作进程的交互。
worker 进程之间的通信原理基本上和主进程与 worker 进程之间的通信是一样的,只要 worker 进程之间能够取得彼此的信息,建立管道即可通信,但是由于worker 进程之间是完全隔离的,因此一个进程想要知道另外一个进程的状态信息, 就只能通过主进程来实现。
为了实现 worker 进程之间的交互, master 进程在生成 worker 进程之后,在 worker 进程表中进行遍历,将该新进程的PID 以及针对该进程建立的管道句柄传递给 worker 进程中的其他进程,为 worker 进程之间的通信做准备,当worker 进程 1 worker 进程 2 发送指令的时候,首先在 master 进程给它的其他 worker 进程工作信息中找到2 的进程 PID ,然后将正确的指令写入指向进程 2 的管道, worker 进程 2 捕获到管道中的事件后,解析指令并进行相关操作,这样就完成了worker 进程之间的通信。
worker 进程可以通过共享内存来通讯的,比如 upstream 中的 zone ,或者 limit_req limit_conn 中的zone等。操作系统提供了共享内存机制

2.2.3 Nginx 启动和 HTTP 连接建立

  • Nginx 启动时,Master 进程,加载配置文件
  • Master 进程,初始化监听的 socket
  • Master 进程,fork 出多个 Worker 进程
  • Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求

2.2.4 HTTP 处理过程

2.3 Nginx 模块介绍

nginx 有多种模块
  • 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
  • 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
  • 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash
  • 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
  • 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
  • Stream服务模块: 实现反向代理功能,包括TCP协议代理
  • 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 持等
nginx 高度模块化,但其模块早期不支持 DSO 机制 ;1.9.11 版本支持动态装载和卸载

模块分类:

核心模块: core module
标准模块:
HTTP 模块: ngx_http_*
        HTTP Core modules #默认功能
        HTTP Optional modules #需编译时指定
Mail 模块 : ngx_mail_*
Stream 模块 ngx_stream_*
第三方模块

2.4 Nginx 安装

2.4.1 Nginx版本和安装方式

Nginx 版本
  • Mainline version 主要开发版本,一般为奇数版本号,比如1.19
  • Stable version 当前最新稳定版,一般为偶数版本,:1.20
  • Legacy versions 旧的稳定版,一般为偶数版本,:1.18
Nginx 安装可以使用 yum 或源码安装,但是推荐使用源码编译安装
  • yum的版本比较旧
  • 编译安装可以更方便自定义相关路径
  • 使用源码编译可以自定义相关功能,更方便业务的上的使用

2.4.2.Nginx 编译安装

编译器介绍
源码安装需要提前准备标准的编译器, GCC 的全称是( GNU Compiler collection ),其有 GNU 开发,并以GPL即 LGPL 许可,是自由的类 UNIX 即苹果电脑 Mac OS X 操作系统的标准编译器,因为 GCC 原本只能处理 C 语言,所以原名为GNU C 语言编译器,后来得到快速发展,可以处理 C++,Fortran pascal objective C, java以及 Ada 等其他语言,此外还需要 Automake 工具,以完成自动创建 Makefile 的工作, Nginx 的一些模块需要依赖第三方库,比如: pcre (支持 rewrite ), zlib (支持 gzip 模块)和 openssl (支持 ssl 模块)等。
2.4.2.1 编译安装 Nginx
官方源码包下载地址:
https://nginx.org/en/download.html

编译安装示例:

[root@nginx ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y        #下载
[root@nginx ~]# useradd -s /sbin/nologin -M nginx        #添加一个不能登录的nginx用户

[root@nginx ~]# tar zxf nginx-1.24.0.tar.gz

nginx-1.24.0        #解压目录

nginx-1.24.0.tar.gz        #gzip压缩包

[root@nginx ~]# cd nginx-1.24.0/

[root@nginx nginx-1.24.0]# ls
auto     CHANGES.ru  configure  html     man     src
CHANGES  conf        contrib    LICENSE  README
[root@nginx nginx-1.24.0]# ./configure  --prefix=/usr/local/nginx \

--user=nginx \                                       # 指定nginx运行用户
--group=nginx \                                     # 指定nginx运行组
--with-http_ssl_module \                       # 支持https://
--with-http_v2_module \                        # 支持http版本 2
--with-http_realip_module \                   # 支持ip 透传
--with-http_stub_status_module \         # 支持状态页面
--with-http_gzip_static_module \           # 支持压缩
--with-pcre \                                           # 支持正则
--with-stream \                                       # 支持tcp反向代理
--with-stream_ssl_module \                   # 支持tcp的 ssl 加密
--with-stream_realip_module                # 支持tcp 的透传 ip
[root@nginx nginx-1.24.0]# make && make install 

nginx完成安装以后,有四个主要的目录

[root@nginx nginx-1.24.0]# ls /usr/local/nginx/
conf  html  logs  sbin

conf :保存 nginx 所有的配置文件,其中 nginx.conf nginx 服务器的最核心最主要的配置文件,其他的.conf 则是用来配置 nginx 相关的功能的,例如 fastcgi 功能使用的是 fastcgi.conf fastcgi_params两个文件,配置文件一般都有一个样板配置文件,是以.default 为后缀,使用时可将其复制并将 default 后缀去掉即可。
html 目录中保存了 nginx 服务器的 web 文件,但是可以更改为其他目录保存 web 文件 , 另外还有一个 50x web文件是默认的错误页面提示页面。
logs :用来保存 nginx 服务器的访问日志错误日志等日志, logs 目录可以放在其他路径,比
/var/logs/nginx 里面。
sbin :保存 nginx 二进制启动脚本,可以接受不同的参数以实现不同的功能。
2.4.2.2 验证版本及编译参数

[root@nginx vim ~/.bash_profile

export PATH=$PATH:/usr/local/nginx/sbin

[root@nginx ~]# source ~/.bash_profile

[root@nginx ~]# 

[root@nginx ~]# nginx -V
nginx version: nginx/1.24.0
built by gcc 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC) 
built with OpenSSL 3.0.1 14 Dec 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --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-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

2.4.2.3使用安装完成的二进制文件nginx

[root@nginx ~]# nginx -?
nginx version: nginx/1.24.0
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
             [-e filename] [-c filename] [-g directives]

Options:
  -?,-h         : this help
  -v            : show version and exit
  -V            : show version and configure options then exit        #显示版本和编译参数
  -t            : test configuration and exit                        #测试配置文件是否异
  -T            : test configuration, dump it and exit                #测试并打印
  -q            : suppress non-error messages during configuration testing        #静默模式

  -s signal     : send signal to a master process: stop, quit, reopen, reload        

# 发送信号,reload 信号 会生成新的 worker, master 不会重新生成

  -p prefix     : set prefix path (default: /usr/local/nginx/)        #指定Nginx 目录
  -e filename   : set error log file (default: logs/error.log)        #错误日志文件
  -c filename   : set configuration file (default: conf/nginx.conf)        # 配置文件路径

  -g directives : set global directives out of configuration file

# 设置全局指令 , 注意和配置文件不要同时配置, 否则冲突

nginx命令应用示例:

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

worker_processes  1;  注释这行之后在执行nginx -g "worker_processes 6;"命令

#没注释前

[root@nginx ~]# nginx -g "worker_processes 6;"
nginx: [emerg] "worker_processes" directive is duplicate in /usr/local/nginx/conf/nginx.conf:3

#注释后

[root@nginx ~]# nginx -g "worker_processes 6;"

[root@nginx ~]# 

[root@nginx ~]# ps -aux | grep nginx
avahi        869  0.0  0.1  15516  6240 ?        Ss   14:41   0:00 avahi-daemon: running [nginx.local]
root       37493  0.0  0.0   9836   932 ?        Ss   16:41   0:00 nginx: master process nginx -g worker_processes 6;
nginx      37494  0.0  0.1  13724  4856 ?        S    16:41   0:00 nginx: worker process
nginx      37495  0.0  0.1  13724  4856 ?        S    16:41   0:00 nginx: worker process
nginx      37496  0.0  0.1  13724  4856 ?        S    16:41   0:00 nginx: worker process
nginx      37497  0.0  0.1  13724  4856 ?        S    16:41   0:00 nginx: worker process
nginx      37498  0.0  0.1  13724  4856 ?        S    16:41   0:00 nginx: worker process
nginx      37499  0.0  0.1  13724  4856 ?        S    16:41   0:00 nginx: worker process
root       37505  0.0  0.0 221796  2328 pts/0    S+   16:43   0:00 grep --color=auto nginx

[root@nginx ~]# netstat -atulnp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      37493/nginx: master

[root@nginx ~]# nginx -s quit
[root@nginx ~]# ps -aux | grep nginx
avahi        869  0.0  0.1  15516  6240 ?        Ss   14:41   0:00 avahi-daemon: running [nginx.local]
root       37529  0.0  0.0 221796  2252 pts/0    S+   16:49   0:00 grep --color=auto nginx


#前台运行

[root@nginx ~]# nginx -g "daemon off;"

2.4.2.4 Nginx 启动文件

[root@nginx ~]# vim /lib/systemd/system/nginx.service

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target


[root@nginx ~]# systemctl daemon-reload 

[root@nginx ~]# systemctl restart nginx.service 
[root@nginx ~]#

2.6 平滑升级和回滚

有时候我们需要对 Nginx 版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级

2.6.1 平滑升级流程

  • 将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
  • master进程发送USR2信号
  • master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
  • master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx主进程共同提供Web服务,当前新的请求仍然由旧Nginxworker进程进行处理,将新生成的master进程的PID存放至新生成的pid文件nginx.pid
  • 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
  • 向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
  • 如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT

2.6.2 平滑升级和回滚案例

[root@nginx ~]# tar zxf nginx-1.26.1.tar.gz 
[root@nginx ~]# ls

nginx-1.26.1
nginx-1.26.1.tar.gz

[root@nginx ~]# cd nginx-1.26.1/
 

# 开始编译新版本
[root@nginx nginx-1.26.1]# ./configure --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 无需要 make install
[root@nginx nginx-1.26.1]# make

# 查看两个版本
[root@nginx nginx-1.26.1]# ll objs/nginx /usr/local/nginx/sbin/nginx
-rwxr-xr-x 1 root root 5753736 Aug 20 17:13 objs/nginx
-rwxr-xr-x 1 root root 5679504 Aug 20 16:23 /usr/local/nginx/sbin/nginx

 
# 把之前的旧版的 nginx 命令备份
[root@nginx sbin]# cd /usr/local/nginx/sbin/
[root@nginx sbin]# cp nginx nginx2.4
# 把新版本的 nginx 命令复制过去
[root@nginx sbin]# \cp -f /root/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin/
# 检测一下有没有问题
[root@nginx sbin]# nginx -t        #刚开始可能没有,但直接点y就行
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@nginx sbin]# kill -USR2 37820         #nginx worker ID
#USR2 平滑升级可执行程序 , 将存储有旧版本主进程 PID 的文件重命名为 nginx.pid.oldbin ,并启动新的nginx
# 此时两个 master 的进程都在运行 , 只是旧的 master 不在监听 , 由新的 master 监听 80
# 此时 Nginx 开启一个新的 master 进程,这个 master 进程会生成新的 worker 进程,这就是升级后的 Nginx 进程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。
[root@nginx sbin]# ps -aux | grep nginx
avahi        869  0.0  0.1  15516  6240 ?        Ss   14:41   0:00 avahi-daemon: running [nginx.local]
root       37820  0.0  0.0   9836  2672 ?        Ss   16:58   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      37821  0.0  0.1  13724  4832 ?        S    16:58   0:00 nginx: worker process
root       41021  0.0  0.1   9840  5956 ?        S    17:22   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody     41022  0.0  0.1  13728  4616 ?        S    17:22   0:00 nginx: worker process
root       41024  0.0  0.0 221796  2244 pts/1    S+   17:23   0:00 grep --color=auto nginx
[root@nginx ~]# curl -I 192.168.10.140
HTTP/1.1 200 OK
Server: nginx/1.24.0            ##
依旧是旧版本生生效    
Date: Tue, 20 Aug 2024 09:25:25 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 20 Aug 2024 08:23:09 GMT
Connection: keep-alive
ETag: "66c4526d-267"
Accept-Ranges: bytes
# 回收旧版本
[root@nginx sbin]# kill -WINCH 37820
[root@nginx sbin]# ps -aux | grep nginx
avahi        869  0.0  0.1  15516  6240 ?        Ss   14:41   0:00 avahi-daemon: running [nginx.local]
root       37820  0.0  0.0   9836  2672 ?        Ss   16:58   0:00 nginx: master process /usr/local/nginx/sbin/nginx
root       41021  0.0  0.1   9840  5956 ?        S    17:22   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody     41022  0.0  0.1  13728  4616 ?        S    17:22   0:00 nginx: worker process
root       41028  0.0  0.0 221796  2264 pts/1    S+   17:26   0:00 grep --color=auto nginx
# 检测版本信息

[root@nginx ~]# curl -I 192.168.10.140
HTTP/1.1 200 OK
Server: nginx/1.26.1                #新版本生效
Date: Tue, 20 Aug 2024 09:28:40 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 20 Aug 2024 08:23:09 GMT
Connection: keep-alive
ETag: "66c4526d-267"
Accept-Ranges: bytes

# 回滚
# 如果升级的版本发现问题需要回滚 , 可以重新拉起旧版本的 worker
[root@nginx sbin]# cp nginx nginx.26
[root@nginx sbin]# ls
nginx  nginx2.4  nginx.26

[root@nginx sbin]# mv nginx2.4 nginx
mv: overwrite 'nginx'? y
[root@nginx sbin]# 

[root@nginx sbin]# kill -HUP 37820
[root@nginx sbin]# ps -aux | grep nginx
avahi        869  0.0  0.1  15516  6240 ?        Ss   14:41   0:00 avahi-daemon: running [nginx.local]
root       37820  0.0  0.0   9836  2672 ?        Ss   16:58   0:00 nginx: master process /usr/local/nginx/sbin/nginx
root       41021  0.0  0.1   9840  5956 ?        S    17:22   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody     41022  0.0  0.1  13728  4616 ?        S    17:22   0:00 nginx: worker process
nginx      41045  0.0  0.1  13724  4836 ?        S    17:32   0:00 nginx: worker process
root       41047  0.0  0.0 221796  2312 pts/1    S+   17:32   0:00 grep --color=auto nginx


[root@nginx sbin]# kill -WINCH 41021
[root@nginx sbin]# ps -aux | grep nginx
avahi        869  0.0  0.1  15516  6240 ?        Ss   14:41   0:00 avahi-daemon: running [nginx.local]
root       37820  0.0  0.0   9836  2672 ?        Ss   16:58   0:00 nginx: master process /usr/local/nginx/sbin/nginx
root       41021  0.0  0.1   9840  5956 ?        S    17:22   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      41045  0.0  0.1  13724  4836 ?        S    17:32   0:00 nginx: worker process
root       41050  0.0  0.0 221796  2308 pts/1    S+   17:33   0:00 grep --color=auto nginx

[root@nginx ~]# curl -I 192.168.10.140
HTTP/1.1 200 OK
Server: nginx/1.24.0                #版本回滚完成
Date: Tue, 20 Aug 2024 09:34:53 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 20 Aug 2024 08:23:09 GMT
Connection: keep-alive
ETag: "66c4526d-267"
Accept-Ranges: bytes

Nginx 核心配置详解

3.1 配置文件说明

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

nginx 配置文件格式说明

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

Nginx 主配置文件的配置指令方式:

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

主配置文件结构:四部分

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

默认的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
}

3.2 全局配置

Main 全局配置段常见的配置指令分类
  • 正常运行必备的配置
  • 优化性能相关的配置
  • 用于调试及定位问题相关的配置
  • 事件驱动相关的配置

全局配置说明:

user nginx nginx;                 #启动Nginx 工作进程的用户和组
worker_processes [number | auto]; # 启动 Nginx 工作进程的数量 , 一般设为和 CPU 核心数相同
worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ;
# Nginx 工作进程绑定到指定的 CPU 核心,默认 Nginx 是不进行进程绑定的,绑定并不是意味着当前 nginx 进程独占以一核心CPU ,但是可以保证此进程不运行在其他核心上,这就极大减少了 nginx 的工作进程在不同的cpu核心上的来回跳转,减少了 CPU 对进程的资源分配与回收以及内存管理等,因此可以有效的提升 nginx 服务器的性能。
CPU MASK: 00000001 0 CPU
00000010 1 CPU
10000000 7 CPU
# 示例
worker_cpu_affinity 0001 0010 0100 1000; 0 --- 3 CPU
worker_cpu_affinity 0101 1010;
# 示例
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
worker_processes 4;
worker_cpu_affinity 00000010 00001000 00100000 10000000;
[root@nginx ~]# systemctl restart nginx.service 
[root@nginx ~]# 


[root@nginx ~]# ps axo pid,cmd,psr | grep nginx
  41119 nginx: master process /usr/   0
  41121 nginx: worker process         0
  41122 nginx: worker process         0
  41123 nginx: worker process         0
  41124 nginx: worker process         0
  41130 grep --color=auto nginx       0

# 错误日志记录配置,语法: error_log file [debug | info | notice | warn | error | crit
| alert | emerg]
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log /usr/local/nginx/logs/error.log error;
#pid 文件保存路径
pid                 /usr/local/nginx/logs/nginx.pid;
worker_priority 0;         #工作进程优先级, -20~20(19)
worker_rlimit_nofile 65536;         #所有 worker 进程能打开的文件数量上限 ,
                                                        #包括:Nginx的所有连接(例如与代理服务器的连接等)
                                                        #而不仅仅是与客户端的连接
                                                        #另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制
                                                        #最好与ulimit -n 或者limits.conf的值保持一致,
# 修改 pam 限制
[root@nginx ~]# sudo -u nginx ulimit -n
1024
[root@nginx ~]# vim /etc/security/limits.conf
<domain>      <type>  <item>         <value>

*        -       nofile       100000
[root@nginx ~]# sudo -u nginx ulimit -n
100000

daemon off; # 前台运行 Nginx 服务用于测试、 docker 等环境。
master_process off|on; # 是否开启 Nginx master-worker 工作模式,仅用于开发调试场景 , 默认为
on
events {
        worker_connections 65535;         #设置单个工作进程的最大并发连接数
        use epoll;                                         #使用epoll事件驱动,
                                                                #Nginx支持众多的事件驱动,
                                                                #比如:select、poll、epoll,只能设置在events 模块中设置
         accept_mutex on;                         #on为同一时刻一个请求轮流由work进程处理 ,
                                                                  #而防止被同时唤醒所有worker
                                                                  #避免多个睡眠进程被唤醒的设置,默认为off
                                                                #新请求会唤醒所有worker进程,此过程也称为"惊群"
                                                                #因此nginx刚安装完以后要进行适当的优化。建议设置为on
         multi_accept on;                         #on时Nginx服务器的每个工作进程可以同时接受多个新的网络连接
                                                                #此指令默认为off,
                                                                #即默认为一个工作进程只能一次接受一个新的网络连接
                                                                #打开后几个同接受多个。建议设置为on
}

示例: 实现 nginx 的高并发配置

[root@nginx ~]#  ulimit -n 102400
[root@nginx ~]# ab -c 5000 -n 10000 http://192.168.10.140/

apr_socket_recv: Connection refused (111)
 

# 默认配置不支持高并发 , 会出现以下错误日志
[root@nginx ~]# tail /usr/local/nginx/logs/error.log 
2024/08/20 16:56:44 [emerg] 37811#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2024/08/20 16:56:44 [emerg] 37811#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2024/08/20 16:56:44 [emerg] 37811#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
2024/08/20 16:56:44 [emerg] 37811#0: still could not bind()
2024/08/20 16:58:32 [alert] 37593#0: unlink() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
2024/08/20 17:22:28 [notice] 41021#0: using inherited sockets from "6;"
2024/08/20 17:49:19 [alert] 41123#0: sched_setaffinity() failed (22: Invalid argument)
2024/08/20 17:49:19 [alert] 41122#0: sched_setaffinity() failed (22: Invalid argument)
2024/08/20 17:49:19 [alert] 41124#0: sched_setaffinity() failed (22: Invalid argument)
2024/08/20 17:49:19 [alert] 41121#0: sched_setaffinity() failed (22: Invalid argument)
# 修改配置
[root@nginx ~]# vim /etc/security/limits.conf
*        -       nproc       100000
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
worker_rlimit_nofile 100000;
[root@nginx ~]# systemctl restart nginx.service 
[root@nginx ~]# 
#测试
[root@nginx ~]# ab -c 5000 -n 10000 http://192.168.10.140/

This is ApacheBench, Version 2.3 <$Revision: 1879490 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.10.140 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        nginx/1.24.0
Server Hostname:        192.168.10.140
Server Port:            80

Document Path:          /
Document Length:        615 bytes

Concurrency Level:      5000
Time taken for tests:   0.636 seconds
Complete requests:      10000
Failed requests:        2688
   (Connect: 0, Receive: 0, Length: 1344, Exceptions: 1344)
Total transferred:      7340288 bytes
HTML transferred:       5323440 bytes
Requests per second:    15731.04 [#/sec] (mean)
Time per request:       317.843 [ms] (mean)
Time per request:       0.064 [ms] (mean, across all concurrent requests)
Transfer rate:          11276.40 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   87  17.3     84     130
Processing:    26  132  50.3    128     232
Waiting:        0   93  57.1     90     195
Total:         93  219  63.1    231     335

Percentage of the requests served within a certain time (ms)
  50%    231
  66%    260
  75%    270
  80%    277
  90%    301
  95%    325
  98%    329
  99%    331
 100%    335 (longest request)

3.3 http 配置块

# 在响应报文中将指定的文件扩展名映射至 MIME 对应的类型
include /etc/nginx/mime.types;
default_type application/octet-stream; # mime.types 中的类型外
# 指定其它文件的默认 MIME 类型,浏览
器一般会提示下载
types {
text/html html;
image/gif gif;
image/jpeg jpg;
}
示例 :识别 php 文件为 text/html
[root@nginx ~]# vim /usr/local/nginx/html/lee.php
<?php
        phpinfo();
?>

[root@nginx ~]# curl -I 192.168.10.140/lee.php
HTTP/1.1 200 OK
Server: nginx/1.24.0

Date: Tue, 20 Aug 2024 11:37:16 GMT
Content-Type: application/octet-stream
Content-Length: 21
Last-Modified: Tue, 20 Aug 2024 11:36:57 GMT
Connection: keep-alive
ETag: "66c47fd9-15"
Accept-Ranges: bytes

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
default_type  text/html;
#如果是编译安装没有配置nginx启动文件
ps -aux | grep nginx
echo  41892 > /run/nginx.pid
[root@nginx ~]# nginx -s reload
[root@nginx ~]# 
#配置nginx启动文件
[root@nginx ~]# systemctl restart nginx.service 
[root@nginx ~]# 
 
[root@nginx ~]# curl -I 192.168.10.140/lee.php
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 20 Aug 2024 11:41:29 GMT
Content-Type: text/html
Content-Length: 21
Last-Modified: Tue, 20 Aug 2024 11:36:57 GMT
Connection: keep-alive
ETag: "66c47fd9-15"
Accept-Ranges: bytes

3.4 核心配置示例

基于不同的 IP 、不同的端口以及不用得域名实现不同的虚拟主机,依赖于核心模块
ngx_http_core_module 实现。

3.4.1 新建一个 PC web 站点

# 定义子配置文件路径
[root@nginx ~]# mkdir /usr/local/nginx/conf.d/
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
http {
......
include "/usr/local/nginx/conf.d/*.conf";       #在配置文件的最后面添加此行
                                                                #注意不要放在最前面,会导致前面的命令无法生效
}
# 创建虚拟主机网站配置
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    location / {
        root /webdata/nginx/timinglee.org/lee/html;
    }
}
[root@nginx ~]# mkdir -p /webdata/nginx/timinglee.org/lee/html
[root@nginx ~]# echo server-192.168.10.140 > /webdata/nginx/timinglee.org/lee/html/index.html
[root@nginx ~]# nginx -s reload
[root@nginx ~]# 
#访问测试
[root@nginx ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.140    nginx.com lee.timinglee.org
[root@nginx ~]# curl lee.timinglee.org         # 注意在访问主机中设解析
server-192.168.10.140
#如果需要在浏览器访问的话,需要在本地主机C:\Windows\System32\drivers\etc\hosts中添加你的虚拟机的IP和配置文件中写的主机名

3.4.2 root alias

root :指定 web 的家目录,在定义 location 的时候,文件的绝对路径等于 root+location
root 示例:
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    location / {
        root /webdata/nginx/timinglee.org/lee/html;
    }
    location /oppo {                 # 必须建立 /mnt/oppo 才能访问
        root /mnt;
    }
}
[root@nginx ~]# mkdir /mnt/oppo
[root@nginx ~]# echo xixi123 > /mnt/oppo/index.html
[root@nginx ~]# nginx -s reload
[root@nginx ~]# 
# 重启 Nginx 并访问测试
[root@nginx sbin]# curl lee.timinglee.org/oppo/
xixi123
#浏览器访问

alias :定义路径别名,会把访问的路径重新定义到其指定的路径 , 文档映射的另一种机制 ; 仅能用于
location 上下文 , 此指令使用较少
alias 示例:
server {
    listen 80;
    server_name lee.timinglee.org;
    location / {
        root /webdata/nginx/timinglee.org/lee/html;
    }
    location /oppo {
        root /mnt;
    }
    location /haha {        
                                                #注意about后不要加/
                                                #使用alias的时候uri后面如果加了斜杠, 则下面的路径配置
必须加斜杠,否则 403
        alias /mnt/oppo;                         
                                                #当访问alias的时候,会显示alias定义的/mnt/dirtest
里面的内容

       
    }
}

[root@nginx ~]# nginx -s reload
[root@nginx ~]#

# 重启 Nginx 并访问测试

[root@nginx sbin]# curl lee.timinglee.org/haha/
xixi123

#在浏览器上访问

location中使用root指令和alias指令的意义不同

root         #给定的路径对应于 location 中的 /uri 左侧的 /
alias         #给定的路径对应于 location 中的 /uri 的完整路径

3.4.3 location 的详细使用

  • 在一个serverlocation配置段可存在多个,用于实现从uri到文件系统的路径映射;
  • ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配,
  • 而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri
  • uri是用户请求的字符串,即域名后面的web文件路径
  • 然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理
  • 此请求。
# 语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }
=         #只能精确指定文件,用于标准uri 前,需要请求字串与 uri 精确匹配,大小敏感 , 如果匹配成功就停止向下匹配并立即处理请求
^~         #用于标准 uri 前,表示包含正则表达式 , 并且匹配以指定的正则表达式开头
                #对uri 的最左边部分做匹配检查,不区分字符大小写
~         #用于标准 uri 前,表示包含正则表达式 , 并且区分大小写
~*              #用于标准uri前,表示包含正则表达式 , 并且不区分大写
不带符号         # 匹配起始于此 uri 的所有的 uri
\                 #用于标准uri 前,表示包含正则表达式并且转义字符。可以将 . * ? 等转义为普通符号
# 匹配优先级从高到低:
#对目录匹配:(~* = ~) >不带符号 > ^~ > =        #=不能指定目录所以排在最后
#对文件匹配:= > (~* = ~) > 不带符号  >  ^~
3.4.3.1 匹配案例-精确匹配
server 部分使用 location 配置一个 web 界面,例如:当访问 nginx 服务器的 /logo.jpg 的时候要显示指定html文件的内容,精确匹配一般用于匹配组织的 logo 等相对固定的 URL, 匹配优先级最高

1.精确匹配 logo

[root@nginx ~]# mkdir /webdata/nginx/timinglee.org/lee/images -p

[root@nginx ~]# cd /webdata/nginx/timinglee.org/lee/images

[root@nginx images]# ls
logo.png
[root@nginx ~]# ll /webdata/nginx/timinglee.org/lee/images -Zd
drwxr-xr-x 2 root root ? 6 Aug 20 20:41 /webdata/nginx/timinglee.org/lee/images

[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    location / {
        root /webdata/nginx/timinglee.org/lee/html;
    }
    location /oppo {
        root /mnt;
    }
    location /haha {
        alias /mnt/oppo;
    }
    location = /logo.png {
        root /webdata/nginx/timinglee.org/lee/images;
    }
}

# 上传 logo.jpg 图片到 /webdata/nginx/timinglee.org/lee/images ,重启 Nginx 并访问测试
# 访问测试: http://lee.timinglee.org/logo.png

3.4.3.2 匹配案例-区分大小写
实现区分大小写的模糊匹配 . 以下范例中 ,
如果访问 uri 中包含大写字母的 logo.PNG ,则以下 location 匹配 logo.png 条件不成功
因为 ~ 区分大小写,当用户的请求被执行匹配时发现 location 中定义的是小写的 png   
本次访问的 uri 匹配失败,后续要么继续往下匹配其他的 location (如果有),要么报错给客户端

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

server {
    listen 80;
    server_name lee.timinglee.org;
    location / {
        root /webdata/nginx/timinglee.org/lee/html;
    }
    location /oppo {
        root /mnt;
    }
    location /haha {
        alias /mnt/oppo;
    }
    #location = /logo.png {
    #   root /webdata/nginx/timinglee.org/lee/images;
    #}
    location ~ /logo.PNG {
        root /webdata/nginx/timinglee.org/lee/images;
    }
}

# 重启 Nginx 并访问测试
#http://lee.timinglee.org/logo.PNG # 访问失败,系统中没有 logo.PNG 文件
[root@nginx ~]# nginx -s reload
[root@nginx ~]#

3.4.3.3 匹配案例-不区分大小写

~* 用来对用户请求的 uri 做模糊匹配, uri 中无论都是大写、都是小写或者大小写混合,此模式也都会匹配,通常使用此模式匹配用户request 中的静态资源并继续做下一步操作 , 此方式使用较多
注意: 此方式中,对于Linux文件系统上的文件仍然是区分大小写的,如果磁盘文件不存在,仍会提示404

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

server {
    listen 80;
    server_name lee.timinglee.org;
    location / {
        root /webdata/nginx/timinglee.org/lee/html;
    }
    location /oppo {
        root /mnt;
    }
    location /haha {
        alias /mnt/oppo;
    }
    #location = /logo.png {
    #   root /webdata/nginx/timinglee.org/lee/images;
    #}
    #location ~ /logo.PNG {
    #   root /webdata/nginx/timinglee.org/lee/images;
    #}
    location ~* /logo.PNG {
        root /webdata/nginx/timinglee.org/lee/images;
    }
}

# 重启 Nginx 并访问测试
#http://lee.timinglee.org/logo.png
[root@nginx ~]# nginx -s reload
[root@nginx ~]# 

3.4.3.4 匹配案例-URI开始

[root@nginx ~]#  mkdir /webdata/nginx/timinglee.org/lee/images/images{1,2}
[root@nginx ~]# echo image1 > /webdata/nginx/timinglee.org/lee/images/images1/index.html
[root@nginx ~]# echo image1 > /webdata/nginx/timinglee.org/lee/images/images2/index.html

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

server {
    listen 80;
    server_name lee.timinglee.org;
    location / {
        root /webdata/nginx/timinglee.org/lee/html;
    }
    location /oppo {
        root /mnt;
    }
    location /haha {
        alias /mnt/oppo;
    }
    #location = /logo.png {
    #   root /webdata/nginx/timinglee.org/lee/images;
    #}
    #location ~ /logo.PNG {
    #   root /webdata/nginx/timinglee.org/lee/images;
    #}
    #location ~* /logo.PNG {
    #   root /webdata/nginx/timinglee.org/lee/images;
    #}
    location ^~ /images {
        root /webdata/nginx/timinglee.org/lee/images;
        index index.html;
    }
    location /images1 {
        root /webdata/nginx/timinglee.org/lee/images;
    }

}
#重启Nginx并访问测试,实现效果是访问/images1/images2返回内容一样

[root@nginx ~]# nginx -s reload
[root@nginx ~]# 

[root@nginx ~]# curl lee.timinglee.org/images1/
image1
[root@nginx ~]# curl lee.timinglee.org/images2/
image1

3.4.3.5 匹配案例-文件名后缀

[root@nginx ~]# mkdir -p /webdata/nginx/timinglee.org/lee/images
#上传一个图片到/webdata/nginx/timinglee.org/lee/images

server {
    listen 80;
    server_name lee.timinglee.org;
    location / {
        root /webdata/nginx/timinglee.org/lee/html;
    }
    location /oppo {
        root /mnt;
    }
    location /haha {
        alias /mnt/oppo;
    }
    #location = /logo.png {
    #   root /webdata/nginx/timinglee.org/lee/images;
    #}
    #location ~ /logo.PNG {
    #   root /webdata/nginx/timinglee.org/lee/images;
    #}
    #location ~* /logo.PNG {
    #   root /webdata/nginx/timinglee.org/lee/images;
    #}
    #location ^~ /images {
    #    root /webdata/nginx/timinglee.org/lee/images;
    #    index index.html;
    #}
    #location /images1 {
    #    root /webdata/nginx/timinglee.org/lee/images;
    #}
    location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js|css)$ {
        root /webdata/nginx/timinglee.org/lee/images;
    index index.html;
    }

}

# 重启 Nginx 并访问测试
[root@nginx ~]# nginx -s reload
[root@nginx ~]#

3.4.3.6 匹配案例-优先级

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

server {
    listen 80;
    server_name lee.timinglee.org;
    location / {
        root /webdata/nginx/timinglee.org/lee/html;
    }

    location = /logo.png {
        root /webdata/nginx/timinglee.org/lee/images;
    }

   location ^~ /images {
        root /webdata/nginx/timinglee.org/lee/images;
        index index.html;
    }

    location /images1 {
        root /webdata/nginx/timinglee.org/lee/images;

    location ~ /logo.PNG {
        root /webdata/nginx/timinglee.org/lee/images;
    }

    location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js|css)$ {
        root /webdata/nginx/timinglee.org/lee/images;
    index index.html;
    }
    
}
 

# 匹配优先级从高到低:
#对目录匹配:(~* = ~) >不带符号 > ^~ > =        #=不能指定目录所以排在最后
#对文件匹配:= > (~* = ~) > 不带符号  >  ^~
3.4.3.7 生产使用案例
# 直接匹配网站根会加速 Nginx 访问处理
location = /index.html {
......;
}
location / {
......;
}
# 静态资源配置方法 1
location ^~ /static/ {
......;
}
# 静态资源配置方法 2, 应用较多
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
......;
}
# 多应用配置
location ~* /app1 {
......;
}
location ~* /app2 {
......;
}

3.4.4 Nginx 账户认证功能


ngx_http_auth_basic_module 模块提供此功能
示例:
[root@nginx ~]# htpasswd -cmb /usr/local/nginx/conf/.htpasswd admin lee   #-b 表示非交互建立用户认证
Adding password for user admin
[root@nginx ~]# htpasswd -mb /usr/local/nginx/conf/.htpasswd lee lee
Adding password for user lee
[root@nginx ~]#  cat /usr/local/nginx/conf/.htpasswd
admin:$apr1$KUThZ23.$eiK/WqTnyIKgICXC2ku8l0
lee:$apr1$RwbP9nz.$S0FMCUvrAYFJNF8p20z2S.
[root@nginx ~]#  mkdir /webdata/nginx/timinglee.org/lee/login
[root@nginx ~]# echo login > /webdata/nginx/timinglee.org/lee/login/index.html
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf 

server {
    listen 80;
    server_name www.timinglee.org;

    location /login {
    root /webdata/nginx/timinglee.org/lee;
    index index.html;
    auth_basic "login password";
    auth_basic_user_file "/usr/local/nginx/conf/.htpasswd";
    }
}


#重启Nginx并访问测试

[root@nginx ~]# nginx -s reload
[root@nginx ~]# 

[root@nginx images]# curl www.timinglee.org/login/ -u lee:lee
login
[root@nginx images]# curl www.timinglee.org/login/ -u admin:leelogin

#在浏览器上访问

3.4.5 自定义错误页面

自 定义错误页,同时也可以用指定的响应状态码进行响应 , 可用位置: http, server, location, if in
location
error_page code ... [=[response]] uri;

示例:

listen 80;
server_name www.timinglee.org;
error_page 500 502 503 504 /error.html;
location = /error.html {
root /data/nginx/html;
}
# 重启 nginx 并访问不存在的页面进行测试

示例:自定义错误页面

[root@nginx ~]# mkdir /webdata/nginx/timinglee/lee/errors -p

[root@nginx ~]# echo error page > /webdata/nginx/timinglee/lee/errors/40x.html

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

server {
    listen 80;
    server_name www.timinglee.org;
    error_page 404 /40x.html;
    location = /40x.html {
        root /webdata/nginx/timinglee/lee/errors;
    }
}

测试:
[root@nginx ~]# nginx -s reload
[root@nginx ~]# 

[root@nginx ~]# curl www.timinglee.org/40x.html/
error page

3.4.6 自定义错误日志

可以自定义错误日志
Syntax: error_log file [level];
Default:
error_log logs/error.log error;
Context: main, http, mail, stream, server, location
level: debug, info, notice, warn, error, crit, alert, emerg

示例:

[root@nginx ~]#  mkdir "/var/log/nginx" -p
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf 

server {
    listen 80;
    server_name www.timinglee.org;
    error_page 404 /40x.html;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    location = /40x.html {
        root /webdata/nginx/timinglee/lee/errors;
    }
}


#重启nginx并访问不存在的页面进行测试并验证是在指定目录生成新的日志文件

[root@nginx ~]# nginx -s reload
[root@nginx ~]# curl www.timinglee.org/40x.html/
error page
[root@nginx ~]# cd /var/log/nginx/
[root@nginx nginx]# ls
access.log  error.log

3.4.7 检测文件是否存在

try_files 会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI 的指向。最后一个参数是回退 URI 且必须存在,否则会出现内部500 错误
语法格式
Syntax: try_files file ... uri;
try_files file ... =code;
Default: —
Context: server, location
示例 : 如果不存在页面 , 就转到 default.html 页面
[root@nginx nginx]# mkdir -p /webdata/nginx/timinglee.org/lee/error/
[root@nginx nginx]# echo "index.html is not exist" > /webdata/nginx/timinglee.org/lee/error/default.html
[root@nginx nginx]# vim /usr/local/nginx/conf.d/vhosts.conf 

server {
    listen 80;
    server_name www.timinglee.org;

    #location /login {
    #    root /webdata/nginx/timinglee.org/lee;
    #    index index.html;
    #    auth_basic "login password";
    #    auth_basic_user_file "/usr/local/nginx/conf/.htpasswd";
    #}
    root /webdata/nginx/timinglee.org/lee;
    error_page 404 /40x.html;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    try_files $uri $uri.html $uri/index.html /error/default.html;
    location = /40x.html {
        root /webdata/nginx/timinglee/lee/errors;
    }
}
#测试:

[root@nginx ~]# nginx -s reload

[root@nginx ~]# curl www.timinglee.org/40x.html/
index.html is not exist

3.4.8 长连接配置

keepalive_timeout timeout [header_timeout];         #设定保持连接超时时长, 0 表示禁止长连接,默认为75s
                                                                        #通常配置在http字段作为站点全局配置
keepalive_requests 数字;                                 #在一次长连接上所允许请求的资源的最大数量
                                                                                #默认为100次,建议适当调大,比如:500
示例:
keepalive_requests 3;
keepalive_timeout 65 60;
# 开启长连接后,返回客户端的会话保持时间为 60s ,单次长连接累计请求达到指定次数请求或 65 秒就会被断
开,第二个数字 60 为发送给客户端应答报文头部中显示的超时时间设置为 60s :如不设置客户端将不显示超时时间。
Keep-Alive:timeout=60                         #浏览器收到的服务器返回的报文
                                                        #如果设置为0表示关闭会话保持功能,将如下显示:
                                                                #Connection:close 浏览器收到的服务器返回的报文
# 使用命令测试:
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
keepalive_timeout  65 60;
keepalive_requests  500;

[root@nginx ~]# telnet www.timinglee.org 80
Trying 192.168.10.140...
Connected to www.timinglee.org.
Escape character is '^]'.
GET / HTTP/1.1                ##输入动作
HOST: www.timinglee.org        ##
输入访问HOST

                                                    ##输入回车

HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 20 Aug 2024 14:51:18 GMT
Content-Type: text/html
Content-Length: 24
Last-Modified: Tue, 20 Aug 2024 14:36:54 GMT
Connection: keep-alive
Keep-Alive: timeout=60
ETag: "66c4aa06-18"
Accept-Ranges: bytes

index.html is not exist

Trying 192.168.10.140...
Connected to www.timinglee.org.
Escape character is '^]'.
GET / HTTP/1.1                    #第一次操作     
HOST: www.timinglee.org                #
第二次操作

                                                        #第三次操作

HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 20 Aug 2024 14:51:18 GMT
Content-Type: text/html
Content-Length: 24
Last-Modified: Tue, 20 Aug 2024 14:36:54 GMT
Connection: keep-alive
Keep-Alive: timeout=60
ETag: "66c4aa06-18"
Accept-Ranges: bytes

index.html is not exist

Connection closed by foreign host.          # 自动断开链接

3.4.9 作为下载服务器配置

ngx_http_autoindex_module 模块处理以斜杠字符 "/" 结尾的请求,并生成目录列表 , 可以做为下载服务
配置使用
相关指令:
autoindex on | off; # 自动文件索引功能,默为 off
autoindex_exact_size on | off; # 计算文件确切大小(单位 bytes ), off 显示大概大小(单位 K、 M),默认 on
autoindex_localtime on | off ; # 显示本机时间而非 GMT( 格林威治 ) 时间,默认 off
autoindex_format html | xml | json | jsonp; # 显示索引的页面文件风格,默认 html
limit_rate rate; # 限制响应客户端传输速率 ( GET HEAD 以外的所有方法 ) ,单位
B/s,bytes/second # 默认值 0, 表示无限制 , 此指令由ngx_http_core_module提供
set $limit_rate 4k; # 也可以通变量限速 , 单位 B/s, 同时设置 , 此项优级高 .
示例:实现下载站点
# 注意 :download 不需要 index.html 文件
[root@nginx ~]#  mkdir -p /webdata/nginx/timinglee.org/lee/download
[root@nginx ~]# cp /root/anaconda-ks.cfg /webdata/nginx/timinglee.org/lee/download
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf 

server {
    listen 80;
    server_name www.timinglee.org;
    root /webdata/nginx/timinglee.org/lee;
    error_page 404 /40x.html;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    try_files $uri $uri.html $uri/index.html /error/default.html;
    location = /40x.html {
        root /webdata/nginx/timinglee/lee/errors;
    }
    location /download {
        autoindex on;        #自动索引功能
        autoindex_exact_size on;     #计算文件确切大小(单位bytes),此为默认值,off只显示

大概大小(单位 kb mb gb)


        autoindex_localtime on;        #on表示显示本机时间而非GMT(格林威治)时间,默为为off显示GMT时间

        limit_rate 1024k;        #限速,默认不限速
    }
}

# 重启 Nginx 并访问测试下载页面

Nginx 高级配置

由于后续内容太多,所以如果想要了解可以查看 http://t.csdnimg.cn/RueKQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2058281.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PanDownload 网页复刻版最新PHP源码

源码介绍 PanDownload 网页复刻版&#xff0c;PHP语言版&#xff0c;PanDownload在线解析下载的优点&#xff0c;速度快&#xff0c;受用户自身带宽限制&#xff0c;就是说你的宽度交多少决定你下载的速度&#xff0c;不用下载百度网盘客户端&#xff0c;你可以直接使用解析所…

PingCAP 携手 CCF 数据库专委会打造“开源数据库领域拔尖创新人才培育计划”,共塑数据库教育未来丨NDBC 2024

2024 年 8 月 7 日 - 10 日&#xff0c;由中国计算机学会主办、中国计算机学会数据库专业委员会和新疆大学承办、新疆 IT 三会等单位协办的第 41 届中国数据库学术会议&#xff08;NDBC 2024&#xff09;在新疆乌鲁木齐成功举办。 大会上 PingCAP 联合创始人黄东旭发表了主题演…

LabVIEW深度监测系统

随着果园机械化作业的迅速发展&#xff0c;传统的人工监测方式已难以满足现代农业的高效率与精准性需求。本文介绍了一种基于LabVIEW软件的果园开沟深度监测系统&#xff0c;该系统通过集成先进的传感技术与数据处理算法&#xff0c;实现了对开沟深度的实时精确监测和自动控制&…

11.SPI通信

SPI理论 常规四线&#xff1a;SCLK、CS、MOSI(主向从发)、MISO(从向主发) 同步、串行、全双工、速率(MHz) 一主一从、一主多从、不能多主 工作模式&#xff1a; CPOL 0&#xff1a;总线空闲状态时钟为低电平&#xff0c;1&#xff1a;总线空闲状态时钟为高电平 CPHA 0&#…

【Python系列】执行 Shell 命令的六种方法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

0.91寸OLED迷你音频频谱

一、简介 音频频谱在最小0.91寸OLED 屏幕上显示&#xff0c;小巧玲珑 二、应用场景 本模块为音频频谱显示模块&#xff0c;用来获取声音频谱并展示频谱&#xff0c;跟随音乐声音律动 三、产品概述 基于主控芯片设计的将声音采集分析频谱&#xff0c;显示到0.91寸OLED的功能…

【Git】常见命令的使用

Git 介绍流程安装常见命令本地仓与远程仓关联 介绍 Git、Svn&#xff1a;版本控制器&#xff08;用于多人团队协作&#xff09; Svn&#xff1a;集中式版本控制器&#xff1b;版本库集中放在中央服务器&#xff0c;操作非常简单&#xff0c;鼠标右键提交、新增、下载 Git&…

华为OD机试 - 模拟目录管理 - 栈(Java 2024 D卷 100分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

博弈论,CF 1600E - Array Game

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1600E - Array Game 二、解题报告 1、思路分析 记最长递增前缀长度为L&a…

点云倒角距离(Chamfer Distance,CD)

本文为专栏《Python三维点云实战宝典》系列文章&#xff0c;专栏介绍地址“【python三维深度学习】python三维点云从基础到深度学习_python3d点云从基础到深度学习-CSDN博客”。配套书籍《人工智能点云处理及深度学习算法》提供更加全面和系统的解析。 点云倒角距离&#xff08…

零基础5分钟上手亚马逊云科技-高可用Web系统设计最佳实践

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我会每天介绍一个基于亚马逊云科技…

DT浏览器使用教程之如何使用智能问答

DT浏览器使用教程之如何使用智能问答&#xff0c; 在DT浏览器首页点智能问答&#xff0c; 在智能问答页面写上相关问题&#xff0c;点提问&#xff0c; 等待一会儿就可以显示出相关答案了&#xff0c; 点右上角保存&#xff0c;可以保存到DT浏览器的笔记本 DT浏览器是一款适合…

450nm 高功率蓝光激光模组使用多长时间需要更换

450nm蓝光激光模组以其独特的波长特性和高功率输出&#xff0c;成为了市场上备受瞩目的产品。然而&#xff0c;对于用户而言&#xff0c;了解这类高功率激光模组的使用寿命及何时需要更换&#xff0c;是确保工作效率和设备安全性的重要环节。本文将带大家了解450nm 高功率蓝光激…

华为流程框架梳理及实施

获取全部108页完成PPT材料&#xff0c;见下图

游戏发行技术体系

游戏发行技术体系 自认为一个合格的发行技术体系应该包括以下11个部分&#xff0c;并且进行了大致的初步能力划分。 其中&#xff0c;大部分的技术平台在市面上存在三方系统&#xff0c;固在左侧单独的列了一个三方&#xff0c;用来补充后续一些替代品、个人有所遗漏的内容。…

PostgreSQL案例:planning time超长问题分析

问题分析概述 库总是OOM&#xff0c;分析到是执行计划生成有问题&#xff0c;planning time 1秒&#xff0c;planning shared hit 100w。一通分析&#xff0c;定位到是统计信息基表pg_statistic膨胀&#xff0c;由于会话首次SQL执行时的CatCacheMiss&#xff0c;导致backend访…

学习C语言 第十九天

第一项 C 内存管理 内存是通过指针变量来管理的。通过一些函数和运算符&#xff0c;可以对内存进行操作&#xff0c;包括分配、释放、移动和复制等。 序号函数和描述1void *calloc(int num, int size); 在内存中动态地分配 num 个长度为 size 的连续空间&#xff0c;并将每一…

【安全靶场】-DC-7

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 一、收集信息 1.查看主机是否存活 nmap -T4 -sP 192.168.216.149 2.主动扫描 看开放了哪些端口和功能 n…

企业差旅报销管理:如何管控差旅成本?

如何高效地管理和控制差旅成本,是每个企业财务部门都要面对的重要课题。作为一体化差旅报销管理平台,分贝通提供了从事前、事中到事后的全流程差旅费控方案,帮助企业实现精细化管理和成本控制。本文将详细介绍分贝通如何通过其全流程差旅费控方案帮助企业管控差旅成本,提升管理…

Ansible初识

ansible初识 Ansible是一种自动化工具&#xff0c;用于配置管理、应用程序部署和任务自动化。它基于Python语言开发&#xff0c;使用SSH协议进行通信&#xff0c;并且不需要在被管理的主机上安装任何客户端。Ansible使用简单的YAML语言来描述任务和配置&#xff0c;使得操作简…