【Nginx13】Nginx学习:HTTP核心模块(十)Types、AIO及其它配置

news2024/11/15 10:51:10

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 标签。

eb99792d6b5a269bb6a73a528cfb25ac.png

另外,假如有专门的下载路径,我们也可以这样配置,强制走这个路径的所有请求都走下载。

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

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

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

相关文章

植物大战僵尸修改器制作--从入门到入土

文章目录 基础准备基址偏移表常规项目卡槽植物种植无冷却无限阳光浓雾透视基本原理HOOK除雾代码 种植植物基本原理远程线程注入dll函数远程线程卸载dll函数关键dll函数失败代码远程线程代码注入(推荐) 种植僵尸基本原理种植僵尸函数--dll注入版远程代码注入版 完整程序代码参考…

npm ERR! code EPERM npm ERR! syscall unlink npm ERR!错误解决方法

npm ERR! code EPERM npm ERR! syscall unlink npm ERR!错误解决方法 1、问题描述2、解决方法 1、问题描述 由于之前电脑系统的原因,电脑重置了一下,之前安装的环境都没了,然后在重新安装node.js后在使用npm安装时总是报如下错误&#xff1a…

如何在免费版 pycharm 中使用 github copilot (chatGPT)?

起因 在 vscode 中使用了 github copilot 以后,感觉这个人工智能还不错。 但 vscode 对于 python 项目调试并不是特别方便,所以想在 Pycharm 中也能使用同一个 github 账号,用上 copilot 的功能。 不需要等待,安装即用&#xff…

Android复习(Android基础-四大组件)—— Service

1. Service的概述 Service是一个可以在后台长期运行并且不需要和用户进行交互的应用组件。 主要负责:不需要和用户交互而且还要求长期运行的任务,比如耗时操作。 Service不是运行在一个独立的进程当中,不依赖于任何用户界面。 其依赖于创建…

无线电蓝牙音频-BES数字音频系统音频流图

+我V hezkz17进数字音频系统研究开发交流答疑群(课题组) (1)音乐播放音频流图 Decode"(解码)是指将编码后的数据转换回原始格式或可读取的形式的过程,SBC解码成PCM

Linux第三章之重定向 管道命令 环境变量PATH

一、了解Linux目录配置标准FHS FHS本质一套规定Linux目录结构,软件建议安装位置的标准。 使用Linux来开发产品或者发布软件的公司、个人太多,如果每家公司或者个人都按照自己的意愿来配置文件或者软件的存放位置,这无疑是一场灾难。 #进入…

WordPress--关闭主题和插件的自动更新

原文网址:WordPress--关闭主题和插件的自动更新_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何关闭WordPress主题和插件的自动更新提示。 方法 使用插件:Eay Updates Manager 安装完插件后,所有插件被管理,并自动关闭更新&…

PDM系统的协同优势

在现代制造业中,产品的复杂性和多样性日益增加,要实现高效的生产和交付,协同合作显得尤为重要。而PDM系统(Product Data Management,产品数据管理)作为关键工具,正是提升协同效率的有力支持。让…

NLP实战9:Transformer实战-单词预测

目录 一、定义模型 二、加载数据集 三、初始化实例 四、训练模型 五、评估模型 🍨 本文为[🔗365天深度学习训练营]内部限免文章(版权归 *K同学啊* 所有) 🍖 作者:[K同学啊] 模型结构图: &a…

【编程语言 · C语言 · malloc函数】

【编程语言 C语言 malloc函数】https://mp.weixin.qq.com/s?__bizMzg4NTE5MDAzOA&mid2247491503&idx1&sn856b0ee891614a00ae78e84161861e48&chksmcfade356f8da6a404f586365f1987cfc193c0465faf51d959bed9dc5e5e8ce6c112f607f18f3&payreadticketHOUhzlYV…

css图标 | 来自 fontawesome 字体文件的586 个小图标

1. css效果 /*!* Font Awesome 4.4.0 by davegandy - http://fontawesome.io - fontawesome* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)*/.fa-glass:before {content:"\f000"} .fa-music:before {content:"\f001"…

云原生势不可挡,如何跳离云原生深水区?

云原生是云计算领域一大热词,伴随云原生概念而来的是数字产业迎来井喷、数字变革来临、数字化得以破局以及新一波的技术红利等等。云原生即“云”原生,顾名思义是让“应用”最大程度地利用云的能力,发挥云价值的最佳路径。具体来说&#xff0…

transformers里的AutoTokenizer之返回值token_type_ids(二)

在很多案例中,AutoTokenizer会返回token_type_ids这个结果: token_type_ids的解释: 对于两个句子对来说,上一句都标识为0,下一句都标识为1。

ChatGPT + Stable Diffusion + 百度AI + MoviePy 实现文字生成视频,小说转视频,自媒体神器!(一)

ChatGPT Stable Diffusion 百度AI MoviePy 实现文字生成视频,小说转视频,自媒体神器!(一) 前言 最近大模型频出,但是对于我们普通人来说,如何使用这些AI工具来辅助我们的工作呢,或者参与进入我们的生活…

K8s的详细介绍

1.编写yaml文件的方式 2.yaml里面的内容介绍 Pod实现机制:(1)共享网络(2)共享存储 共享网络:通过Pause容器,把其他业务容器加入到Pause容器里面,让所有业务容器在同一个名称空间中,…

Linux 基础入门篇

挂载点 先在这块新的存储上做文件系统,但是并不是挂载到全局目录树的根上了,你是想让/home 目录和它关联,所以你需要把它挂载到/home目录上 新的粉色的存储设备上的文件系统挂载在了/home 目录,全局目录树/home就和粉色文件系统的…

一起学算法(二维数组篇)

1.概念定义 1.矩阵的定义 矩阵A(nm)的定义时按照长方形排列的复数或实数集合,其中n代表的是行数,m代表的是列数。如下所示,代表的是一个4x3的矩阵 在Java中,我们可以用A[n][m]来代表一个n*m的矩阵,其中A[i][j]代表的是…

Java如何实现将类文件打包为jar包

目录 将类文件打包为jar包 1.写类文件2.编译3.测试4.打jar包jar包应该怎么打? 1.首先确保你的项目2.选中你的项目,点右键3.选择runnable jar file4.如下图,直接看图5.然后点finish 将类文件打包为jar包 为实际项目写了一个工具类,但是每次使用时都需要…

记录--一个好用的轮子 turn.js 实现仿真翻书的效果

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 国际惯例,官网链接 官网传送门 Github地址 github上有几个demos例子,介绍了基础用法。 我参考官网的例子,写了一个demo示例 安装 turn.js 依赖 jquery 库&#xff0…

C++设计模式之建造者设计模式

C建造者设计模式 什么是建造者设计模式 建造者设计模式是一种创建型设计模式,它是一种将复杂对象的分解为多个独立部分的模式,以便于构建对象的过程可以被抽象出来并独立变化。 该模式有什么优缺点 优点 灵活性:建造者设计模式允许对象的…