开发者学堂课程【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
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
现在访问没有问题
但是此时下载断掉,如果现在重启,shutting down 将会强制关闭
输入 ps -ef | grep nginx
刚才 shutting down 的进程强制关闭,显示为如图
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
输入 vim /apps/nginx/conf/nginx.conf
再在 server 上增加 server_tokens off; 隐藏掉版本
再来输入 /apps/nginx/sbin/nginx -s reload
刷新显示如图
网站上的版本都会修改,一般修改为和品牌或者公司相关的版本,例如小米官网上