AIO、第三方模块及自定义变量(一)|学习笔记

简介: 快速学习 AIO、第三方模块及自定义变量

开发者学堂课程【Nginx 企业级 Web 服务实战:AIO、第三方模块及自定义变量】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/649/detail/10759


AIO、第三方模块及自定义变量(一)

内容介绍:

一、前言

二、AIO

三、Nginx 高级配置

四、内置变量


一、前言

上节讲到作为上传服务器怎么去配置,通常会有路径 upload

/upload {

proxy_pass.http://1.2.3.4;

}

还有别的参数,比如在这里限制某些方法,限制不允许上传

limit_except GET {

allow 172.18.200.101;

deny all;

}

主要是下载界面可以限制上传


二、AIO

Aio 是在 epoll 模式上做了一些优化及性能提升,平时 epoll 已经满足大多数场合,如果要再调优,开启 aio

aio on | off  #是否启用 asynchronous file I/O(AIO) 功能,需要编译开启

linux 2.6 以上内核提供以下几个系统调用来支持 aio:

1、SYS_io_setup:建立 aio 的 context  调用 setup 来建立 aio 上下文)

2、SYS_io_submit:提交 I/O 操作请求

3、SYS_io_getevents:获取已完成的 I/O 事件

4、SYS_io_cancel:取消 I/O 操作请求

5、SYS_io_destroy:毁销 aio 的 context

使用方法:

一般 Epoll+sendfile 满足大多数场景

但如果场景特殊需要做一些调优,使用 aio 则加上 directio,Aio+directio

Aio 是开启 epoll io 的,是让 Nginx 支持 epoll io,然后 Nginx 在读取下面的文件时,就会通过 epoll 的方式和内核建立多个连接,维持一个连接表,再由 Nginx 线程通过内核调用系统中的文件,大文件一般这样调,对于小文件使用 senfile。一般文件大小超过兆,就会使用 aio

directio size / off;  #directio 是直接读写文件到磁盘,启用直接 I/O,默认为关闭,当文件大于等于给定大小时,例如 directio 4m,可以和 sendfile 结合使用,比如当大于此值使用 AIO,当小于此值使用 sendfile。需要编译启用 asynchronous file I/O(AIO )功能。

如果不开启,在 Nginx 源码中输入

./configure  --help | grep aio

结果显示--with-file-aio     enable file AIO support

需要开启 AIO 的支持,如果不开启直接配置不能运行。

再输入

ps -ef | grep nginx

结果显示 worker process is shutting down

image.png

Nginx 中有多个线程,其中有一个还在处理未能关闭

再来输入

ps -ef |grep nginx

ps -ef |grep nginx

结果还在处理,后台还存在一个

ubuntu-18.04.3-desktop-amd64(1).iso 下载

再来试着将 aio 打开,输入

./configure --help | grep aio^C

再来编辑以下 apps 下的 nginx,输入

vim /apps/nginx/conf/conf.d/linux39-pc.conf

aio 能放置的位置有 http,server,location

现在对该 server 启用 aio,在 location 上输入 aio on;再来增加一个 directio 4m;设置一个数值

保存之后再来检查配置,输入 /apps/nginx/sbin/nginx -t

结果显示报错

nginx: [emerg] "aio on" is unsupported on this platform in /apps/nginx/conf/conf. d/linux39-pc.conf:8

nginx: configuration file /apps/nginx/conf/nginx.conf test failed

不支持,需要在编译时增加一个参数,先来注释 aio on directio 4m

#aio on

#directio 4m

注释完后先关闭,输入

/apps/nginx/sbin/nginx -t

/apps/nginx/sbin/nginx -s stop

关闭之后下载就被强制断开,停止之后再来编译,输入

ngettext /^C

/apps/nginx/sbin/nginx -V

.configure --prefix=/apps/nginx --with-http_ssl_module --wth-http_v2_module--with-http_realip_module --with-http_addition_module --with-http_image_filter_module --with-http_geoip_module --with-http_gunzip_module--with-http_stub_status_ module--with-http_gzip_static_module--with-pcre --with-stream--with-stream_ssl_module --with-stream_realip_module--with-select_module  --with-file-aio

加入 --with-file-aio 该参数后再重新编译,再输入 make

make install

再来检查输入 make^C

把刚才参数打开,

输入vim/apps/nginx/conf/conf.d/linux39-pc.conf,取消掉刚才 aio on 和directio 4m 的注释

再输入 /apps/nginx/sbin/nginx -t

/apps/nginx/sbin/nginx

现在访问没有问题

image.png

但是此时下载断掉,如果现在重启,shutting down 将会强制关闭

输入 ps -ef | grep nginx

刚才 shutting down 的进程强制关闭,显示为如图

image.png

open_file_cache off;  #是否缓存打开过的文件信息,可以理解为是否缓存用户访问过的信息,通过缓存来提升 nginx 的响应时间

但是打开后有一些连带的设置,缓存哪些信息,比如

open_file_cache max=N  [inactive=time];

缓存多长的有效时间,当超过时长后将不再缓存

缓存时间不能太长,否则会发生文件内容已经发生变化,但是缓存内容还未更新

nginx 可以缓存以下三种信息:

(1)文件元数据:文件的描述符、文件大小和最近一次的修改时间

(2)打开的目录结构(如图片之前放置在哪个路径下)

(3)没有找到的或者没有权限访问的文件的相关信息

max=N :可缓存的缓存项上限数量;达到上限后会使用 LRU(Least recently used,最近最少使用)算法实现管理

inactive=time: 缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于 open_file_cache_min_uses 指令所指定的次数的缓存项即为非活动项,将被删除

open_file_cache_errors on | off;

是否缓存查找时发生错误的文件一类的信息

默认值为off

Example:

open_file_cache   max=1000 inactive=20s ;

open_file_cache_yalid   30s ;

open_file_cache_min _uses   2;

open_file_cache_errors   on ;

open_file_cache_min_uses number;

open_file_cache 指令的 inactive 参数指定的时长内,至少被命中此处指定的次数方可被归类为活动项

默认值为1

open_file_cache_valid time;

缓存项有效性的检查验证频率,默认值为60s

open_file_cache max=10000 inactive=60s;  #最大缓存10000个文件,非活动数据超时时长60s

open_file_cache_valid  60s; #每间隔60s检查一下缓存数据有效性

open_file_cache_min_uses 5; #60秒内至少被命中访问5次才被标记为活动数据

open_file_cache_errors on; #缓存错误信息

演示:

输入

vim /apps/nginx/conf/conf.d/linux39-pc.conf

想要参数对全局生效,放到 http 字段中,输入

vim /apps/nginx/conf/nginx.conf

在 server 上输入

open_file_cache max=10000 inactive=60s;  

open_file_cache_valid  60s;

open_file_cache_min_uses 5;  

open_file_cache_errors on;

再重新 reload,输入

ps -ef | grep nginx^C

/apps/nginx/sbin/nginx -s reload

/apps/nginx/sbin/nginx -t

server_tokens off; #隐藏 Nginx server 版本。如图隐藏此处版本1.16

image.png

输入 vim /apps/nginx/conf/nginx.conf

再在 server 上增加 server_tokens off; 隐藏掉版本

再来输入 /apps/nginx/sbin/nginx -s reload

刷新显示如图

image.png

网站上的版本都会修改,一般修改为和品牌或者公司相关的版本,例如小米官网上

image.png

相关文章
|
6月前
|
缓存 Ubuntu 网络协议
Linux系统编程之文件I/O函数的使用:介绍文件I/O函数的基本概念、用法和实现方式
Linux系统编程之文件I/O函数的使用:介绍文件I/O函数的基本概念、用法和实现方式
105 1
|
Go
Golang 语言标准库 sync 包的 RWMutex 读写互斥锁怎么使用?
Golang 语言标准库 sync 包的 RWMutex 读写互斥锁怎么使用?
65 0
|
Go
go语言简单实现加载ini文件
go语言简单实现加载ini文件
129 0
go语言简单实现加载ini文件
|
Web App开发 Ubuntu 应用服务中间件
AIO、第三方模块及自定义变量(三)|学习笔记
快速学习 AIO、第三方模块及自定义变量
121 0
AIO、第三方模块及自定义变量(三)|学习笔记
|
应用服务中间件 开发工具 nginx
AIO、第三方模块及自定义变量(二)|学习笔记
快速学习 AIO、第三方模块及自定义变量
130 0
AIO、第三方模块及自定义变量(二)|学习笔记
|
编译器 Go 开发者
包使用注意事项和细节(1)|学习笔记
快速学习包使用注意事项和细节(1)
包使用注意事项和细节(1)|学习笔记
|
缓存 JavaScript 开发者
require 函数加载模块原理(被加载的模块会先执行一次)|学习笔记
快速学习 require 函数加载模块原理(被加载的模块会先执行一次)
require 函数加载模块原理(被加载的模块会先执行一次)|学习笔记
|
Go 微服务
从源码的角度看Go语言flag库如何解析命令行参数!
从源码的角度看Go语言flag库如何解析命令行参数
|
Java
线程池的7种创建方式,强烈推荐你用它...(4)
线程池的7种创建方式,强烈推荐你用它...(4)
147 0
线程池的7种创建方式,强烈推荐你用它...(4)
|
Java
线程池的7种创建方式,强烈推荐你用它...(5)
线程池的7种创建方式,强烈推荐你用它...(5)
164 0
线程池的7种创建方式,强烈推荐你用它...(5)