【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 更换过程 使用螺丝刀拧走后盖的螺丝(为了避免会出问题要再次打开,我到现在还没有把螺丝拧回…...

2.04 商品搜索功能实现
根据关键字获取分类查询对应的分页商品信息,并可以价格和销量进行排序切换 步骤1:mapper.xml编写sql语句 <!-- k: 默认,代表默认排序,根据name--> <!-- c: 根据销量排序--> <!-- p: 根据价格排序--> <sel…...

【SEO基础】百度权重是什么意思及网站关键词应该怎么选?
百度权重是什么意思及网站关键词应该怎么选? 正文共:3253字 20图 预计阅读时间:9分钟 1.什么是网站权重? 这段时间和一些朋友聊到网站权重以及关键词,发现蛮多人对于这两个概念的认知还是存在一些错误的…...

Unity实现在3D模型标记
Canvas 模式是UI与3D混合模式(Render modelScreen space-Camera) 实现在3D模型标记,旋转跟随是UI不在3D物体下 代码: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public clas…...

iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动
iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动 在之前的开发中,遇到了实时音视频呼叫通知,当App未打开或者App在后台时候,需要通知到用户,用户点击通知栏后是否接入实时音视频的视频或者音频通话。 在…...

性能调试【学习笔记】
什么是调优? 每执行一个Java命令,就分配一个JVM,调优时不要混淆。 根据需求进行JVM规划和预调优优化运行JVM的运行环境(慢、卡顿)解决JVM运行过程中出现的各种问题(内存泄露、内存溢出OOM) 生…...

【taro react】---- 获取元素的位置和宽高等信息
1. 需求分析 添加节点的布局位置的查询请求。相对于显示区域,以像素为单位。其功能类似于 DOM 的 getBoundingClientRect。返回 NodesRef 对应的 SelectorQuery。区分小程序和H5的环境,调用 getBoundingClientRect 获取对应的信息。 2. H5 实现 判断传…...

Java【Spring】项目创建、存储和获取 Bean 的基本方式
文章目录 前言一、创建 Spring 项目1, 创建 Maven 项目2, 添加 Spring 依赖3, 创建启动类 二、存储 Bean 的基本方式1, 创建 Bean2, 存储 Bean 三、获取 Bean 的基本方式1, 获取上下文对象2, 获取 Bean3, 使用 Bean 总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的…...

docker minio安装
1.介绍 Minio是一款开源的对象存储服务,它可以在任何硬件或云平台上提供高性能、高可用性和高安全性的存储解决方案。Minio最新版是2021年11月发布的RELEASE.2021-11-24T23-19-33Z,它带来了以下几个方面的改进和新特性: - 支持S3 Select AP…...

设计模式-命令模式在Java中的使用示例-桌面程序自定义功能键
场景 欲开发一个桌面版应用程序,该应用程序为用户提供了一系列自定义功能键,用户可以通过这些功能键来实现一些快捷操作。 用户可以将功能键和相应功能绑定在一起,还可以根据需要来修改功能键的设置,而且系统在未来可能还会增加…...

分冶算法 剑指 07 重建二叉树 排序算法:剑指45 把数组排成最小的数 10-I 斐波那契数列
来记录几个注意事项 1.vector容器里利用find()函数 不同于map(map有find方法),vector本身是没有find这一方法,其find是依靠algorithm来实现的。 所以要包含头文件 #include <iostream> #include <…...