【Nginx13】Nginx学习:HTTP核心模块(十)Types、AIO及其它配置
Nginx学习:HTTP核心模块(十)Types、AIO及其它配置
今天学习的内容也比较简单,主要的是 Types 相关的配置,另外还会了解一下 AIO 以及部分没有特别大的分类归属的配置指令的使用。后面的内容都是 HTTP 核心模块中比较小或者比较简单的部分了。有很多配置项其实我们平常并不常用,甚至很多在学习之前我都不知道有它们的存在。做为扩展知识眼界来说,非常有意义,也能够学习到很多之前并不了解或者概念模糊的内容。
Types
这是啥?类型?是的,真的就是类型的意思,不过它指的是我们请求访问的资源类型。大家应该都了解,最初的互联网就是静态页面,而静态页面对应的就是一个个的实实在在的文件。只不过随着技术的发展,动态页面通过各种后端语言占据了主导地位。但对于很多资源来说,比如图片、视频这类大型资源,还有 js、css 这类文件,以及前后端分离的前端部分,还是会通过普通文件的形式进行部署访问。
那么在请求资源的时候,浏览器是怎么知道要以何种方式解析某个文件呢?比如说,我们访问一个 .mp3 结尾的链接,现在的浏览器都会直接展示一个播放器让大家可以直接听歌。这就是通过 MIME 类型来实现的。
最典型的就是对于普通网页,响应头中会返回一个 Content-Type: text/html;
的内容。它就是告诉浏览器要用什么方式来处理当前响应返回的数据。
类似的还有 text/css、image/gif、image/jpeg、image/gif、text/plain、application/javascript、application/json、application/octet-stream、audio/mpeg、video/mp4 等等。具体都是什么意思就不多解释了,大家应该都多少有过了解。这些内容,其实在 Nginx 的配置文件中就有。
……
http{
……
include mime.types;
……
}
在大部分默认的 nginx.conf 文件中,应该都可以找到这样一个 include 语句。之前我们已经学习过 include 可以加载一个文件进来,这个文件的配置信息就会被嵌入到 include 的这个位置。那么我们就再来看看这个 mime.types 文件是啥。
在 nginx.conf 所在的同级目录中找到 mime.types 文件,打开它就会发现它定义了很多内容。
types{text/html html htm shtml;text/css css;text/xml xml;image/gif…………video/x-ms-asf asx asf;video/x-ms-wmv wmv;video/x-msvideo avi;
}
可以看到,它也是一个类似于小模块一样的配置,有一对花括号。里面定义的其实是文件扩展名与响应的 MIME 类型的映射表。也就是说,后面对应的文件后缀名,在返回响应的时候就会响应成前面的 MIME 码。如果有特殊需要,你也可以自己修改或者添加不同的 MIME 。
default_type
定义响应的默认MIME类型。
default_type mime-type;
默认值是 text/plain ,但直接安装后都会给一个 application/octet-stream 。其实也就是在 types 中找不到类型,就会走这个默认值。我们可以来简单测试下。
location /mimetest/ {alias /usr/local/nginx/html/;types {}default_type text/plain;
}
配置一个 /mimetest 的 location ,然后将 types{} 设置为 空的。types 可以设置在 http、server、location 下,以最下层的为准。然后设置 default_type 为 text/plain 。现在访问 /mimetest ,就会发现默认的 index.html 会以文本的形式直接输出出来 ,包括 html 标签。
另外,假如有专门的下载路径,我们也可以这样配置,强制走这个路径的所有请求都走下载。
location /download/ {alias /usr/local/nginx/html/;types { }default_type application/octet-stream;
}
types_hash_bucket_size
设置MIME类型哈希桶大小,其默认值取决于处理器的缓存线长度。
types_hash_bucket_size size;
默认值取决于处理器缓存线的大小,将来学习哈希表的时候再说。
types_hash_max_size
设置MIME类型哈希表的最大size(容量)。
types_hash_max_size size;
默认值是 1024, 将来学习哈希表的时候再说。
AIO
AIO 是啥东西?它是 Linux 和 FreeBSD 这类操作系统下的一种异步 IO 功能。它的作用是可以允许进程发起很多 IO 操作,而不用阻塞或等待任何操作完成。稍后在收到 IO 操作完成的通知时,进程就可以检索 IO 操作的结果。注意,它和 epoll 不是一个东西,是操作系统的 aio 系列函数调用。而且 Nginx 中可以组合 aio 和 epoll 来一起使用。AIO 相关的配置项都可以用于 http、server、location 各个模块中。
aio
aio on | off | sendfile;
这个配置的默认值是 off 。另外还可以设置为 on 和 sendfile 。sendfile 只能用于 FreeBSD 5.2.1 之后的系统中,之前的版本和 Linux 下需要关闭 sendfile 。在 FreeBSD 第5版和第6版,静态启动 AIO ,或者在系统启动时动态加载 AIO ,都会触发网络子系统使用一把大锁,进而对整个系统的性能造成负面影响。这个限制在 2009 年发布的 FreeBSD 6.4稳定版和 FreeBSD 7 中被消除。虽然如此,仍有方法在 5.3 及以上版本的 FreeBSD 中开启 AIO 而不触发网络子系统的大锁,那就是在内核启动以后加载AIO模块。
如果是在 Linux 系统中,使用 AIO 需要同时开启 directio 配置项,并且 directio 的配置必须是 512 才有效,启用了 directio 会自动关闭 sendfile。为什么它们两个不兼容呢?其实 AIO 是将数据读到缓冲区,而 sendfile 则是直接将数据发送走,因此,这俩货是对头,没法一起使用。FreeBSD 系统从来没用过,也不知道它为什么可以让 AIO 和 sendfile 并存,这个也不在我们的讨论范围内了。
aio_write
aio_write on | off;
这个指令是 aio 的一个附属指令,表示如果启用 aio 的话,则指定它是否用于写入文件。目前,这仅在使用aio线程时有效,并且仅限于使用从代理服务器接收的数据写入临时文件。
如果开启了 AIO ,那么 Nginx 中会将 aio 和 epoll 事件模型(假设 Nginx 使用 epoll 事件模型)组合起来使用,当请求的 IO 操作完成时调用 epoll 相关函数通知应用程序来读取。根据 Nginx 官网论坛来看,在 Linux 系统的大部分场景下,目前因使用 AIO 功能附加的限制而带来的实际效果并不太理想。而且这个我也不知道咋测,直接压力测试嘛?算了,咱们也不测了,平常保持默认的关闭好了。
关于 AIO 更详细的资料还是需要去深入的学习一下操作系统相关的知识,在这里我也就不深究了,记下这一笔,将来深入的学习操作系统时再进行详细的学习。
其它
这些配置指令没有大的归属,不过也有一些是比较常见的,下篇文章也会继续讲一些其它配置指令,今天先来看一部分。
auth_delay
主要是权限配置相关的,当我们配置并使用了 auth_basic、auth_request 或者 auth_jwt 相关的模块时,定义一个超时时间,用于防止定时攻击。
auth_delay time;
默认 0s ,其实也就是没有开启。定时攻击其实也叫时序攻击,根据加密的不同,我们在加密过程中的返回速度是不一样,但是也已经有很多加密算法是可以预防时序攻击的,之前在 PHP的Hash信息摘要扩展框架https://mp.weixin.qq.com/s/1qAkPkMWcxq_kIoq8b2vOw 这篇文章中我们就已经学习过,这里就不多说了。
Nginx 可以通过这个命令来保证超过指定加密时间直接返回一个 401 错误,具体就不演示了,因为我也不知道咋演示。
chunked_transfer_encoding
允许关闭HTTP/1.1中的分块传输编码。
chunked_transfer_encoding on | off;
默认值是 on ,在客户端软件不支持分块传输编码或者不希望使用分块传输的时候,这条指令可以关掉它。自己试了半天,也不知道咋测,有了解的小伙伴可以留言哦!
connection_pool_size
允许微调为每个连接分配的内存。
connection_pool_size size;
这条指令对 Nginx 的性能影响非常小,一般不应该使用。默认情况下,该大小在 32 位平台上等于 256 字节,在 64 位平台上等于 512 字节。在 1.9.8 版本之前,所有平台上的默认值均为 256 。
log_not_found
开启或者关闭在 error_log 中记录文件不存在的错误。
log_not_found on | off;
默认值是 on ,这个配置主要就是我们访问一个不存在的页面,找不到对应的文件,一般会报出一个 404 错误,并且对应的 error_log 日志文件中会记录一条信息。
2022/08/07 20:52:41 [error] 868#0: *1 open() "/usr/local/nginx/html/123.html" failed (2: No such file or directory), client: 192.168.56.1, server: core.nginx.test, request: "GET /123.html HTTP/1.1", host: "192.168.56.88"
但如果我们将它设置为 off ,则在错误日志中就不会记录这条信息了,只会在 access_log 中记录那个 404 的请求。
log_subrequest
开启或者关闭在 access_log 中记录子请求的访问日志
log_subrequest on | off;
默认值是 off ,查了半天也没查到怎么发子请求,使用 addition、auth_request 之类的文档中写着可以发子请求的模块测试也没效果。网上搜的很多是自己写模块或者使用一些第三方模块,有了解的小伙伴可以留言哈,这个咱们就先不测试了。
merge_slashes
开启或者关闭将请求 URI 中相邻两个或更多斜线合并成一个的功能。
merge_slashes on | off;
默认值是 on ,比如说我们经常可能在输入 URL 的时候多打了一个斜杠,比如 /slashes/aaa.html 打成了 //slashes/aaa.html 。这种情况下,如果 merge_slashes 的配置是 off 的话,那么对于 location /slashes/
这个配置就无法匹配成功了。查看日志,会报出这样的错误。
2022/08/07 22:26:19 [error] 1611#0: *87 open() "/usr/local/nginx/html//slashes/aaa.html" failed (2: No such file or directory), client: 192.168.56.1, server: core.nginx.test, request: "GET //slashes/aaa.html HTTP/1.1", host: "192.168.56.88"
也就是说,访问的 URI 按照普通的路径 /usr/local/nginx/html//slashes/aaa.html
来进行访问了。在 Linux 中,这种访问方式也是不被允许的。
[root@localhost html]# ll /usr/local/nginx/html//slashes/aaa.html
ls: cannot access '/usr/local/nginx/html//slashes/aaa.html': No such file or directory
另外还需要注意的是,如果URI中包含 base64 编码的内容,必须将斜线压缩调整成 off ,因为 base64 编码本身会使用 “/” 字符。出于安全方面的考虑,最好还是不要关闭压缩。这条指令可以指定在默认虚拟主机的 server 配置级别。这样的话,这个配置可以覆盖监听同一地址和端口的所有虚拟主机。
msie_padding
msie_padding on | off;
默认 on ,在响应状态码大于等于 400 时,在响应正文中添加一段注释,使响应正文达到512字节。本指令可以为 MSIE 客户端开启或关闭这个功能。IE 相关的配置咱们就不试了,我这也没有现成的 IE 浏览器。
msie_refresh
msie_refresh on | off;
默认 off ,为 MSIE 客户端开启或者关闭用页面刷新取代页面重定向的功能。IE 相关的配置咱们就不试了,我这也没有现成的 IE 浏览器。
总结
是不是感觉大开眼界了?平常我们以为多打两个斜杠没事,但其实是 Nginx 默认帮我们处理了。响应类型的概念相信也让大家对浏览器如何处理响应头有了新的认识,原来 Nginx 也是根据文件的后缀名来进行判断的。最后,还有一大堆配置指令等着我们呢,别急,下篇文章见。
参考文档:
http://nginx.org/en/docs/http/ngx_http_core_module.html
相关文章:

【Nginx13】Nginx学习:HTTP核心模块(十)Types、AIO及其它配置
Nginx学习:HTTP核心模块(十)Types、AIO及其它配置 今天学习的内容也比较简单,主要的是 Types 相关的配置,另外还会了解一下 AIO 以及部分没有特别大的分类归属的配置指令的使用。后面的内容都是 HTTP 核心模块中比较小…...
2023年华数杯数学建模C题思路分析
文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor 1 竞赛信息 为了培养学生的创新意识及运用数…...

安卓手机变身Linux服务器
文章目录 前言一、准备工作1、安卓手机2、下载软件二、开始安装1、检查系统,确认版本并安装2、配置(安卓7.0 及以上的用户忽略此步)3、问题处理【没有异常的小伙伴忽略】总结前言 在实际开发中有很多地方都需要服务器资源,但是服务器资源不论在哪里都是比较紧缺的资源,今…...

【Ansible】Ansible自动化运维工具之playbook剧本
playbook 一、playbook 的概述1. playbook 的概念2. playbook 的构成 二、playbook 的应用1. 安装 httpd 并启动2. 定义、引用变量3. 指定远程主机 sudo 切换用户4. when条件判断5. 迭代6. Templates 模块6.1 添加模板文件6.2 修改主机清单文件6.3 编写 playbook 7. tags 模块 …...
Yolov8目标检测
Yolov8目标检测 目录 Yolov8目标检测一、准备数据集二、源码下载配置2.1 下载库2.2 修改配置2.3 训练2.4 验证2.5 测试2.6 模型导出2.7 本地测试 一、准备数据集 Yolov8只支持yolo格式的数据,所以,需要将数据集格式调整为 datasets|images|train|00000…...

Jmeter用于接口测试中,关联如何实现
Jmeter用于接口测试时,后一个接口经常需要用到前一次接口返回的结果,应该如何获取前一次请求的结果值,应用于后一个接口呢,拿一个登录的例子来说明如何获取。 1、打开jmeter, 使用的3.3的版本,新建一个测试计划&#x…...

线程状态
从卖包子的案例学习进程间的通信 public class Test {public static void main(String[] args) {Object objnew Object();Thread th1new Thread(){Overridepublic void run() {synchronized (obj){System.out.println("来三个包子!");try {obj.wait(); /…...

HTML一些基础知识
1、Web标准:主要包含结构、表现、行为。结构用于对网页元素进行整理和分类,主要指HTML。表现用于设置网页元素的板式、颜色、大小等外观样式,主要指的是CSS。行为主要指的是网页模型的定义以及交互的编写,主要是js文件。 Html相当…...
git 命令总结
一、本地分支和仓库里的分支不同步(本地看不到最新的分支) 1.使用 git fetch origin 或者git remote update origin --prune命令更新 2.git branch -r 查看 即可 二、git 合并代码 1. git 如何把分支代码合并到master 1.1 首先切换到分支 git checkou…...
【Django】如何优化数据库访问
原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、数据库层面优化常用优化postgresql查询分库分表 二、内存层面优化三、代码层面优化 前言 Django是一个高级的Web框架,它…...
常压室温超导材料:揭开物理学的新篇章
常压室温超导材料:揭开物理学的新篇章 目录 引言超导现象简介常压室温超导材料的重要性常压室温超导材料的研究进展常压室温超导材料的挑战与前景结论 1. 引言 自从1911年荷兰物理学家海克卡默林奥涅斯发现超导现象以来,超导技术在许多领域都有着广泛…...
【《C# 10 和 .NET 6入门与跨平台开发(第6版)》——一本循序渐进的C#指南】
这个新版本对上一版做了全面修订,涵盖C# 10和.NET 6的所有新功能. 本书讨论面向对象编程、编写函数、测试函数、调试函数、实现接口以及继承类等主题;介绍.NET API,这些API可执行多种任务,如管理和查询数据,监视和改进…...

2.5 BUMP图改进
一、Bump Mapping介绍 凹凸贴图映射技术是对物体表面贴图进行变化然后进行光计算的一种技术。例如给法线分量添加噪音,或者在一个保护扰动值的纹理图中进行查找。这是一个提升物理真实感的有效方法,但却不需要额外的提升物体的几何复杂度。这种法式在提…...
第六篇-ChatGLM2-6B-CentOS7安装部署-GPU版
环境 系统:CentOS-7 CPU: 14C28T 显卡:Tesla P40 24G 驱动: 515 CUDA: 11.7 cuDNN: 8.9.2.26模型文件 https://huggingface.co/THUDM/chatglm2-6b 下载模型相关文件到自己目录 我的是/models/chatglm2-6b [rootai-server chatglm2-6b]# pwd /models/c…...
dotnet 依赖注入-批量注入Controller,service,Dao
此类为扩展注入类,使用autofuc 仅供参考 注入接口和实现。 使用方法: //配置项调用ConfigContainer public void ConfigureContainer(ContainerBuilder builder){TestMicroService.ConfigContainer(builder);} //service调用RegisteApiController …...
【Spring】Spring对IoC的实现
根据 【动力节点】最新Spring框架教程,全网首套Spring6教程,跟老杜从零学spring入门到高级 以及老杜的原版笔记 https://www.yuque.com/docs/share/866abad4-7106-45e7-afcd-245a733b073f?# 《Spring6》 进行整理, 文档密码:mg9b…...
正则表达式中的大括号-花括号{}有什么用?
在正则表达式中,花括号 {} 是用于指定匹配次数的量词元字符。它可以用来表示匹配的次数范围或精确匹配次数。 具体来说,花括号 {m} 表示前面的模式匹配恰好出现 m 次,而 {m, n} 表示前面的模式匹配出现 m 到 n 次。 以下是一些常见的用法示…...
Flutter 状态栏完美攻略
1. 沉浸式状态栏 Scaffold(extendBodyBehindAppBar: true,appBar: AppBar(toolbarHeight: 0,),body: Container(color:Colors.red) ) 2. 状态栏的背景颜色 Scaffold(appBar: AppBar(backgroundColor: Colors.transparent,),body: Container(color:Colors.red) ) 3. 状态栏的…...

Packet Tracer - 连接有线和无线 LAN
Packet Tracer - 连接有线和无线 LAN 地址分配表 设备 接口 IP 地址 连接到 云 Eth6 N/A Fa0/0 Coax7 N/A Port0 电缆调制解调器 Port0 N/A Coax7 Port1 N/A 互联网 Router0 控制台端口 N/A RS232 Fa0/0 192.168.2.1/24 Eth6 Fa0/1 10.0.0.1/24 Fa…...

02 笔记本电脑m.2硬盘更换
1 工具展示 SN570的2T硬盘。够用了。 对于这台华为,使用的螺丝刀批头是4或5毫米的六边形批头。如果出现打滑的情况,请不要用蛮力哦。 2 更换过程 使用螺丝刀拧走后盖的螺丝(为了避免会出问题要再次打开,我到现在还没有把螺丝拧回…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...