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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

核心交换机新增了一个网段,现在下面PC可以获取地址访问内网 ,访问外网说DNS有问题不通

环境: SANGFOR AF 8.0.75 SANGFOR AC 13.0.47 H3C S6520-26Q-SI 问题描述: 1.在核心交换机上新规划了一个网段192.168.200.0/24,现在下面PC可以正常获取IP地址和DNS,正常访问内网服务和其它地址段IP ,访问外网说DNS有问题不通打不开网页 2.DNS解析失败,ping dns服务…

Kubernetes高可用集群二进制部署(二)ETCD集群部署

Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署(二)ETCD集群部署 Kubernetes高可用集群二进制部署(三)部署…

第四次作业 运维高级 安装tomcat8和部署jpress应用

1. 简述静态网页和动态网页的区别。 静态网页 静态网页是指存放在服务器文件系统中实实在在的HTML文件。当用户在浏览器中输入页面的URL,然后回车,浏览器就会将对应的html文件下载、渲染并呈现在窗口中。早期的网站通常都是由静态页面制作的。 静态网页…

银河麒麟V10 wireshark安装说明(断网离线)

下载离线安装包 链接:https://pan.baidu.com/s/11QFRmCGlIJrJaiKcHh9Hag?pwdu9wv 提取码:u9wv 安装步骤 tar zxvf wireshark.tar.gz cd wireshark sudo dpkt -i *.deb wireshark

构建vue项目配置和环境配置

目录 1、环境变量process.env配置2、vue package.json多环境配置vue-cli-service serve其他用法vue-cli-service build其他用法vue-cli-service inspect其他用法3、vue导出webpack配置4、配置打包压缩图片文件5、打包去掉多余css(由于依赖问题暂时未实现)6、打包去除console.…

【每日一题】—— C. Challenging Cliffs(Codeforces Round 726 (Div. 2))

🌏博客主页:PH_modest的博客主页 🚩当前专栏:每日一题 💌其他专栏: 🔴 每日反刍 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮,缓称…

Spring Boot 系列4 -- 统一功能处理

目录 前言 1. Spring AOP 用户统⼀登录验证的问题 1.1 自定义拦截器 1.2 配置拦截器并配置拦截的规则 1.3 拦截器的原理源码分析 2. 统一异常处理 2.1 实现统一异常处理 2.2 测试统一异常处理 3. 统一的数据格式返回 3.1 统⼀数据返回格式的实现 3.2 测试统一的数据返…

智慧水务和物联网智能水表在农村供水工程中的应用

摘 要:随着社会的进步和各项事业的飞速发展,人民生活水平的逐步提升,国家对农村饮水安全有了更高的要求,为了进一步提升农村供水服务的质量,利用现代化、信息化科学技术提升农村供水服务质量,提高用水管理效…

GB28181智能安全帽方案探究及技术实现

什么是智能安全帽?​ 智能安全帽是一种集成先进科技的安全帽,可基于GB28181规范,适用于铁路巡检、电力、石油化工等高风险行业的作业人员,以及消防、救援等紧急情况下的安全防护。 智能安全帽通常具有以下功能: 实时…

RocketMQ发送消息超时异常

说明:在使用RocketMQ发送消息时,出现下面这个异常(org.springframework.messging.MessgingException:sendDefaultImpl call timeout……); 解决:修改RocketMQ中broke.conf配置,添加下…

git使用(由浅到深)

目录流程图 1. 分布式版本控制与集中式版本控制 1.1 集中式版本控制 集中式版本控制系统有:CVS和SVN它们的主要特点是单一的集中管理的服务器,保存所有文件的修订版本;协同开发人员通过客户端连接到这台服务器,取出最新的文件或者提交更新…

天气API强势对接

🤵‍♂️ 个人主页:香菜的个人主页,加 ischongxin ,备注csdn ✍🏻作者简介:csdn 认证博客专家,游戏开发领域优质创作者,华为云享专家,2021年度华为云年度十佳博主 🐋 希望…

“苏豪 x 莱佛士”再度携手,惊艳亮相上海发型师节!

2023年6月28日,以“为爱启航”为主题的第16届AHF亚洲发型师节在上海跨国采购中心盛大开幕。继上次在施华蔻专业2023春夏新季风发布会上,苏豪x莱佛士合作的大秀,赢得了现场观众阵阵掌声。这次“Kraemer苏豪x莱佛士”再度携手,惊艳亮…

【雕爷学编程】MicroPython动手做(25)——语音合成与语音识别

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

Linux 入侵痕迹清理技巧(仅限学习安全知识)

vim ~/.bash_history 查看历史操作命令:history history记录文件:more ~/.bash_history history -c echo " " > ~/.bash_history #使用vim打开一个文件 vi test.txt # 设置vim不记录命令,Vim会将命令历史记录,保存…

2023年华数杯B题

B 题 不透明制品最优配色方案设计 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此,不透明 制品的配色对其外观美观度和市场竞争力起着重要作用。然而,传统的人工配色 存在一定的局限性,如主观性强、效率低下等。因此&#xff0…

Django实现音乐网站 ⑷

使用Python Django框架制作一个音乐网站,在系列文章3的基础上继续开发, 本篇主要是后台歌曲类型表、歌单表模块功能开发。 目录 表结构设计 歌曲类型表结构 歌单表结构 创建表模型 创建表 后台注册表模型 引入表模型 后台自定义 总结 表结构设计…

为Stable Diffusion web UI开发自己的插件实战

最近,Stable Diffusion AI绘画受到了广泛的关注和热捧。它的Web UI提供了了一系列强大的功能,其中特别值得一提的是对插件的支持,尤其是Controlnet插件的加持,让它的受欢迎程度不断攀升。那么,如果你有出色的创意&…

Jmeter远程服务模式运行时引用csv文件的路径配置

问题 在使用jmeter过程中,本机的内存等配置不足,启动较多的线程时,可以采用分布式运行。 在分布式运行的时候,jmeter会自动将脚本从master主机发送到remote主机上,所以不需要考虑将脚本拷贝到remote主机。但是jmeter…

【图论】强连通分量进阶

一.作用 强连通分量可以判断环和进行缩点。还有一系列作用.... 这篇文章介绍缩点 二.题目 https://www.luogu.com.cn/problem/P2341 三.思路 我们分析可以知道当一个点没有出度时,则为最受欢迎的牛。但如果有多个出度,则没有最受欢迎的牛。 这是只有…