Nginx相关介绍
Nginx
httpd MPM(multi-processing module多路处理模块 )工作模型
prefork:进程模型,两级结构,主进程master负责生成子进程,每个子进程负责响应一个请求
worker:线程模型,三级结构,主进程master负责生成子进程,每个子进程负责生成多个线程,每个线程响应一个请求
event:线程模型,三级结构,主进程master负责生成进程,每个子进程响应多个请求
I/O介绍
由于进程是不可直接访问外部设备的,所以只能调用内核去调用外部的设备(上下文切换),然后外部设备比如磁盘,读出存储在设备自身的数据传送给内核缓冲区,内核缓冲区在copy数据到用户进程的缓冲区。在外部设备响应的给到用户进程过程中,包含了两个阶段;由于数据响应方式的不同,所以就有了不同的I/O模型。
网络I/O:本质是socker读取
磁盘I/O:
每次I/O都要经历两个阶段:
第一步:将数据从磁盘文件优先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长
第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短
I/O模型
I/O模型: 阻塞型、非阻塞型、复用型、信号驱动型、异步
同步/异步关注的是消息通知机制
1)同步:synchronous,调用者等待被调用者返回消息,才能继续执行
2)异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态
阻塞/非阻塞:调用者在等待结果返回之前所处的状态
阻塞:blocking,指I/O操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起
非阻塞:nonblocking,指I/O操作被调用后立即返回给用户一个状态值,无需等到I/O操作彻底完成,最终的调用结果返回之前,调用者不会被挂起
同步阻塞IO模型:当用户进程发起一个请求,需要从磁盘获取一个数据时,应用进程发送一个请求给recvfrom(内核中的系统调用),通过发送一个api接口让内核来完成(也就是系统调用发送一个指令,希望获取一个磁盘文件),第一,从磁盘获取文件到内核。第二,从内核把文件复制到用户空间的缓冲区中,然后返回一个成功的指令,当数据调用完成,用户进程得到数据,才可以去做其它的事,在这期间,用户线程是阻塞的
1)同步阻塞IO模型是最简单的IO模型,用户线程在内核进行IO操作时被阻塞
2)用户线程通过系统调用read发起IO操作,由用户空间转到内核空间,内核等到数据包到达后,然后将接收到的数据拷贝到用户空间,完成read操作
3)用户需要等待read将数据读取到buffer后,才继续处理接收的数据。整个IO请求过程中,用户线程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够
同步非阻塞IO模型:当用户进程需要一个资源的时候,发送一个请求给内核,内核通过系统调用(recvfrom)来完成这个请求,但是否完成请求我并不知道,只能通过一次一次的问,反复调用recvfrom,由于他是非阻塞型的IO模型,应用进程发送了请求之前,进程并不会阻塞,仍然可以处理其它事情,当数据从磁盘调到内核之后,他便认为数据准备完成,不再继续询问,等待数据从内核拷贝到应用空间,然后返回成功指令
1)用户线程发起IO请求时立即返回,但并未读取到任何数据,用户线程需要不断地发起IO请求,直到数据到达后,才能真正的读取到数据,继续执行,即“轮询”
2)整个IO请求过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断的轮询,重复请求,消耗大量的CPU的资源
3)是比较浪费CPU的方式,一般很少直接使用这种模型,而是在其它IO模型中使用非阻塞IO这一特性
IO多路复用模型:当用户进程需要获取资源时,发送请求给内核,内核把这些请求统一交给系统调用(select)来完成,当数据从有磁盘调到内核后,便通知这个用户进程来取数据,这个时候再发起系统调用(recvfrom)将数据从内核拷贝到用户空间,然后返回成功指令
1)多个连接共用一个等待机制,本模型会阻塞进程,但是进程是阻塞在select或者poll这两个系统调用上,而不是阻塞在真正的IO操作上
2)用户首先将需要进行IO操作添加到select中,继续执行做其它的工作(异步),同时等待select返回系统调用返回,当数据到达时,IO被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行
3)从流程上看,使用select函数进行IO请求同步阻塞模型没有太大的区别,甚至还多了添加IO监视,以及调用系统select函数的额外操作,效率更差,并且阻塞了两次,但是第一次阻塞在select上时,select可以监控多个IO上是否已有IO操作准备就绪,即可达到在同一个线程内同时处理多个IO请求的目的,而不是像阻塞IO那样,一次只监视一个IO
4)虽然上述方式允许单线程内处理多个IO请求,但是每个IO请求的过程还是阻塞的(阻塞在select函数),平均时间甚至比同步阻塞IO模型还要长,如果用户线程只是注册自己需要的IO请求,然后去做其它事情,等到数据到来时再进行处理,则可以提高CPU效率
5)IO多路复用是最常使用的IO模型,但是其异步程度还不够“彻底”,因它使用了会阻塞线程的select系统调用,因此IO多路复用只能称为异步阻塞IO模型,而非真正的异步IO
6)IO多路复用是指内核一量发现进程指定的一个或者多个IO条件准备读取,就通知该进程
7)IO多路复用适用于如下场合:
1、当客户端处理多个描述符(一个文件需要占用一个描述符)时(一般是交互式输入和网络套接口),必须使用IO复用
2、当一个客户端同时处理多个套接字时,此情况很少出现
3、当一个TCP服务器既要处理监听套接字,又要处理已连接套接字,一般也要用到IO复用
4、当一个服务器即要处理TCP,又要处理UDP,一般要使用IO复用
5、当一个服务器要处理多个服务或多个协议,一般要使用IO复用
信号驱动IO模型:当进程发送请求,我要得到一个文件时,在数据从磁盘调到内核的过程中,进程只需要把请求交给内核,便可以继续处理其它的事,当数据调到内核后,便会通知进程来取数据,这个时候进程向内核发起系统调用(recvfrom)请求,将数据从内核拷贝到用户空间,然后返回成功指示,在这个过程中,进程首先把请求交给内核,内核将请求分派给系统调用(sigaction),建立SIGAC的信号处理程序,然后返回处理信号,将数据从磁盘中调到内核,当数据准备完成以后,便递交数据准备完成的信号,通知进程来提取数据,这个时候进程发起正式提取数据的请求给内核,内核便让系统调用(recvfrom)将数据从内核拷贝到用户空间,然后返回成功指示
1)信号驱动IO:signal-driven I/O
2)用户进程可以通过sigaction系统调用注册一个信号处理程序,然后主程序可以继续执行,当有IO操作准备就绪时,由内核通知触发一个SIGIO信号处理程序执行,然后将用户进程所需要的数据从内核空间拷贝到用户空间
3)此模型的优势在于等待数据报文到达期间进程不被阻塞,用户主程序可以继续执行,只要等待来自信号处理函数的通知
4)该模型并不常用
异步IO模型:当用户进程需要一个数据时,只需要把请求发送给内核,内核便从磁盘把数据调到内核,再从内核拷贝到用户空间,拷贝完成后,发送成功指示,中间进程继续执行,没有中断。在这个模型中,进程只需要发送请求,所有的工作都由内核来完成,减轻了进程的压力,可以同时处理更多的事
1)异步IO与信号驱动IO最主要的区别是信号驱动IO是由内核通知何时可以进行IO操作,而异步IO则是由内核告诉用户进程IO操作何时完成,信号驱动IO当内核通知触发信号处理程序时,信号处理程序还需要阻塞在从内核空间缓冲区拷贝数据到用户空间缓冲区这个阶段,而异步IO直接是在第二个阶段完成后,内核直接通知用户线程可以进行后续操作
2)相比于IO多路复用,异步IO并不十分常用,不少高性能并发服务程序使用IO多路复用模型+多线程任务处理的架构基本可以满足需求。目前操作系统对异步IO的支持并非特别完善,更多的是采用IO多路复用模型模拟异步IO的方式(IO事件触发时不直接通知用户线程,而是将数据读写完毕后放到用户指定的缓冲区中)
IO模型的具体实现
主要实现方式:
-
Select:Linux实现对应,IO复用模型,BSD4.2最早实现
-
Poll:Linux实现对应,IO复用模型,System V unix最早实现
-
Epoll:Linux实现对应,IO复用模型,具有信号驱动IO模型某些特性
-
Kqueue:FreeBSD实现,对应IO复用模型,具有信号驱动IO模型某些特性
-
/dev/poll:SUN的Solaris实现,对应IO复用模型,具有信号驱动IO模型的某些特性
-
Iocp:Windows实现,对应异步IO模型
对比select/poll/epoll
|
select
|
poll
|
epoll
|
操作方式
|
遍历
|
遍历
|
回调
|
底层实现
|
数组
|
链表
|
哈希表 |
IO效率
|
每次调用都进行线性遍历,时间复杂为O(n) |
每次调用都进行线性遍历,时间复杂为O(n)
|
事件通知方式,每当fd就绪,系统注册的回调函数就被调用,将就绪fd放到rdlist里面,时间复杂度O(1)
|
最大连接数
|
1024(x86)或2048(x64)
|
无上限
|
无上限
|
FD拷贝
|
每次调用select,都需要把fd集合从用户态拷贝到内核态
|
每次调用poll,都需要把fd集合从用户态拷贝到内核态
|
调用poll_ct时拷贝进内核并保存,之后每次epoll_wait不拷贝
|
遍历:线程询问数据准备好了没的时候,一个一个的去查找
回调:完成之后主动通知线程
poll:
1)本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态
2)其没有最大连接数的限制,原因是它是基于链表来存储的
3)大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义
4)poll特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时再次报告该fd
5)边缘触发:只通知一次
epoll:在linux2.6内核中提出的select和poll的增强版本
1)支持水平触发LT和边缘触发ET,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只通知一次
2)使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活fd,epoll_wait便可以收到通知
优点:
1)没有最大并发连接的限制:能打开的FD的上限远大于1024(1G的内存监听约10万个端口)
2)效率提升:非轮询的方式,不会随着FD数目的增加而效率下降;只有活跃可用的FD都会调用callback函数,即epoll最大的优点就在于它只管理“活跃”的连接,而跟连接总数无关
3)内存拷贝,利用mmap(Memory Mapping)加速与内核空间的消息传递;即epoll使用mmap减少了复制开销
Nginx介绍
特性:
-
模块化设计,较好的扩展性
-
高可靠性
-
支持热新部署:不停机更新配置文件,升级版本,更换日志文件
-
低内存消耗:10000个keep-alive连接模式下的非活动连接,仅2.5M内存
-
event-driven,aio,mmap,sendfile
基本功能:
-
静态资源的web服务器
-
http协议反向代理服务器
-
pop3/imap4协议反向代理服务器
-
FastCGI(LNMP),uWSGI(python )等协议
-
模块化(非DSO),如zip,SSL模块
Ngnix的程序架构
web服务相关的功能:
-
虚拟主机(server)
-
支持keep-alive和管道连接
-
访问日志(支持基于日志缓冲提高其性能)
-
url rewirte
-
路径别名
-
基于IP及用户的访问控制
-
支持速率限制及并发数限制
-
支持速率限制及并发数限制
-
重新配置和在线升级而无须中断客户的工作进程
-
Memcached的GET接口
Ngnix的程序架构
master/worker结构
-
一个master进程:负载加载和分析配置文件、管理worker进程、平滑升级
-
一个或多个worker进程:处理并响应用户请求
-
缓存相关进程:
cache loader:载入缓存对象
cache manager:管理缓存对象
Nginx模块
-
nginx高度模块化,但其模块早期不支持DSO机制;1.9.11版本开始支持动态装载和卸载
-
模块化分类:
核心模块:core module
标准模块:
HTTP模块:ngx_http_*
HTTP Core modules 默认功能
HTTP Optional modules 需编译时指定
Mail模块:ngx_mail_*
Stream模块:ngx_stream_* ,解决TCP协议代理
第三方模块:
Nginx的功用
-
静态的web资源器
html,图片,js,css,txt等静态资源
-
结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
-
HTTP/HTTPS协议的反向代理
-
imap/pop3协议反向代理
-
tcp/udp协议的请求转发代理(反向代理)
Nginx目录结构和命令
ls /usr/local/ngnix/
html 是测试页目录 sbin 主程序目录 conf 配置文件目录 logs 日志文件目录
nginx 默认为启动nginx
-h 查看帮助信息
-V 查看版本和配置选项
-t 测试nginx语法错误
-c 指定配置文件(默认/etc/nginx/nginx.conf)
-s 发送信号给master进程,signal:stop,quit,reopen,reload
如:ngnix -s stop 停止ngnix
ngnix -s reload 加载配置文件
-g 在命令行中指明全局指令
Nginx的配置文件
主配置文件:nginx.conf
子配置文件:include conf.d/*.conf
注:
1)指令必须以分号结尾
2)支持使用配置变量
内建变量:由nginx模块引入,可直接引用
自定义变量:由用户使用set命令定义
set variable_name value
引用变量:$variable_name
主配置文件共分为四部分
主配置部分:全局配置,对所有服务都有效
events{
........
} 事件驱动相关配置
http{
......
} http/https协议相关配置
mail{
......
} mail协议相关配置
stream{
......
} stream 服务器相关配置
http协议相关的配置结构
http {
... 各server的公共配置
server {
listen 80; #监听端口
server_name liujuan520.com.cn; #虚拟主机名
location / {
root html/wordpress; #网页文档根目录
index index.php index.html index.htm; #网页文件
}
location ~ \.php$ {
root html/wordpress; #PHP网页文档根目录
fastcgi_pass 127.0.0.1:9000; #php-fpm的监听地址
fastcgi_index index.php; #php网页文件
include fastcgi.conf; #用include调用fastcgi_conf样本配置(查找文件所在位置并修改)
}
nginx配置
-
正常运行必备的配置
1、user
Syntax: user user[group]
Default: nobody nobody
Context: main
指定worker进程的运行身份,如组不指定,默认和用户名同名
2、pid /PATH/TO/PID_FILE
指定存储nginx主进程PID的文件路径
pid logs/nginx.pid;
3、include file | mask
指定包含进来的其它配置文件片断
4、load_module file
模块加载配置文件:/usr/share/nginx/modules/*.conf
指明要装载的动态模块路径:/usr/lib64/nginx/modules
-
性能优化相关的配置:
1、worker_processes number | auto
worker进程的数量;通常应该为当前主机的cpu的物理核心数
2、worker_cpu_affinity cpumask ...
worker_cpu_affinity auto [cpumask] 提高缓存命中率
CPU MASK:00000001:0 第一颗CPU
00000010:1 第二颗CPU
10000000:7 第八颗CPU
3、worker_priority number
指定worker进程的nice值,设定worker进程优先级:[-20,19]
4、worker_rlinit_nofile number
worker进程所能够打开的文件数量上限,如65535
worker_processes 4; #worker进程数
worker_cpu_affinity 0001; #绑定在第几颗CPU
worker_priority -10; #进程优先级
worker_rlimit_nofile 10000; #每个进程能够服务的用户请求数,可根据实际情况调整
[root@web ~]# ps -axo pid,cmd,psr | grep nginx #查看进程工作在那颗CPU上
14960 nginx: master process /usr/ 0
14961 nginx: worker process 0
19306 vim nginx.conf 0
23834 grep --color=auto nginx 0
[root@web ~]# yum -y install httpd-tools #ab命令工具包
[root@web ~]# ab -c 1000 -n 2000 http://106.54.201.234/
[root@web ~]# watch -n 0.5 'ps -axo pid,cmd,psr | grep nginx' #每隔0.5s执行一次ps -axo pid,cmd,psr命令
Every 0.5s: ps -axo pid,cmd,psr | grep nginx
2061 grep nginx 0
14960 nginx: master process /usr/ 0
14961 nginx: worker process 0
19306 vim nginx.conf 0
[root@web ~]# ps -axo pid,cmd,psr,nice | grep nginx #查看优先级
[root@web ~]# ps -axo pid,cmd,psr,nice | grep nginx
14960 nginx: master process /usr/ 0 0
18948 nginx: worker process 0 -10
18949 nginx: worker process 0 -10
18950 nginx: worker process 0 -10
18951 nginx: worker process 0 -10
-
事件驱动相关配置
1、worker_connections number
每个worker进程所能够打开的最大并发连接数数量
2、use method
指明并发连接请求的处理方法,默认自动选择最优方法
3、accept_mutex on | off 互斥
处理新的连接请求的方法;on指由各个worker轮流处理新的请求,off指每个新请求的到达都会通知(唤醒)所有的worker进程,但只有一个进程可获得连接,造成“惊群”,影响性能
events {
worker_connections 1024; #每个worker支持的并发连接数量,可根据实际情况调整
accept_mutex on #开启worker轮流处理
}
-
调试和定位问题:
1、daemon on | off
是否以守护进程方式运行ngnix,默认是守护进程方式
2、master_process on | off
是否以master/worker模型运行nginx;默认on
3、error_log file [level]
错误日志文件及其级别;出于调试需要,可设定debug;但debug仅在编译时使用了“--with-debug”选项时才有效
error_log /usr/local/nginx/logs/error.log;
Nginx的相关模块
一、 核心模块
-
ngx_http_core_module
-
与套接字相关的配置
1、创建一个虚拟主机
[root@web ~]# vim /usr/local/nginx/conf/nginx.conf
include /usr/local/nginx/conf/vhosts/*.conf;
[root@web ~]# mkdir /usr/local/nginx/conf/vhosts/
[root@web ~]# vim /usr/local/nginx/conf/vhosts/a.com.conf
server {
listen 80 default_server; #监听端口, 并设置为默认访问网页
server_name www.a.com; #主机名
root html; #指定网页存放目录
index a.html; #网页文件
}
2、listen
listen address 后跟[:PORT] [default_server] [ssl] [http2|spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
default_server 设定为默认虚拟主机
ssl 限制仅能够通过ssl连接提供服务
backlog=number 超过并发连接数后,新请求进入后援队列的长度
rcvbuf=size 接收缓冲区大小
sndbuf=size 发送缓冲区大小
注意:
1)基于port;
listen PORT; 指定监听在不同的端口
2)基于IP的虚拟主机
listen IP:PORT IP地址不同
3)基于hostname
server_name www.a.com 指定不同的主机名
3、server_name
1)虚拟主机的主机名称后可跟多个由空白字符分隔的字符串
2)支持*通配任意长度的任意字符
如:server *.a.com或www.a.*
3)支持~起始的字符做正则表达式模式匹配,性能原因慎用
如:~^www\d+\.a\.com$
说明:\d 表示 [0-9]
4)匹配优先级机制从高到低
-
首先是字符中精确匹配 如:www.a.com
-
左侧*通配符 如:*.a.com
-
右侧*通配符 如:www.a.*
-
正则表达式 如:~^www\d+\.a\.com$
-
default_server
4、tcp_nodelay on|off;
在keepalived模式下的连接是否启用TCP_NODELAY选项
当为off时,延迟发送,合并多个请求后再发送
默认为on时,不延迟发送
5、sendfile on|off;
是否启用sendfile功能,在内核中封装报文直接发送,默认off
6、server_tokens on | off | build | string
是否在响应报文的server首部显示nginx版本
-
与定义路径相关配置
7、root
设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径,可用于http,server,if in location
server {
..........
root html;
}
8、location [= | ~ | ~* | ^~ ] uri {...}
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;nginx会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置
=: 对URI做精确匹配
^~: 对URI的左边部分做匹配检查,不区分字符大小写
~: 对URI做正则表达式模糊检查,区分字符大小写
~*: 对URI做正则表达式模式匹配,不区分字符大小写
不带符号:匹配起始于此URI的所有URI
匹配优先级:= , ^~, ~/~*,不带符号
server {
listen 80;
server_name liujuan520.com.cn;
location / {
root html/wordpress;
index index.php index.html index.htm;
}
location ~ \.php$ {
root html/wordpress; #PHP网页文档根目录
fastcgi_pass 127.0.0.1:9000; #php-fpm的监听地址
fastcgi_index index.php; #php网页文件
include fastcgi.conf; #用include调用fastcgi_conf样本配置(查找文件所在位置并修改)
}
9、alias path;
路径别名,文件映射的另一种机制;仅能用于location上下文
server {
listen 80 default_server;
server_name www.a.com;
root html/;
index index.html;
location /index.html {
root html/vhosts/;
}
}
[root@web nginx]# curl www.a.com
/usr/share/nginx/html/vhosts/index.html
server {
listen 80 default_server;
server_name www.a.com;
root html/;
index index.html;
location /vhosts {
root html/vhosts/;
}
}
[root@web nginx]# curl www.a.com
/usr/share/nginx/html/index.html
注意:location中使用root命令和alias指令的不同
1)root,给定的路径对应于location中的/uri左侧的/
2)alias,给定的路径对应于location中的/uri右侧的/
10、 index
index index.html
指定默认网页文件,注意:ngx_http_index_module模块
11、error_page_code
error_page 404 /404.html;
error_page 404 =200 /404.html;
定义错误页,以指定的响应状态码进行响应
可放在位置:http,server,location,if in location
server {
listen 80 default_server;
server_name www.a.com;
root /usr/share/nginx/html/;
error_page 404 =200 /404.html; #404后面=200,可以防止返回错误页面时劫持,可以不跟
location /404.html {
root /data/;
}
}
[root@web nginx]# vim /data/404.html
<h1> not found page<h1>
[root@web nginx]# curl www.a.com/xxx.html
<h1> not found page<h1>
12、try_files
try_files $uri /images/default.jpg; #这里也可返回404,也可指定一个默认网页
按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向,最后一个参数是回退URI且必须存在,否则会出现内部500错误,这样即使路径写错了也没关系,他会有一个默认的网页给你
[root@web nginx]# mkdir /usr/share/nginx/html/images
[root@web nginx]# mkdir /data/images
[root@web nginx]# locate *.jpg
[root@web nginx]# cp -a /usr/share/backgrounds/day.jpg /data/images/
[root@web nginx]# cp -a /usr/share/backgrounds/default.jpg /data/images/
[root@web nginx]# vim /etc/nginx/conf.d/www.a.com
server {
listen 80 default_server;
server_name www.a.com;
root html/;
index index.html;
location /images {
try_files $uri /images/default.jpg;
}
}
13、keepalive_timeout
keepalive_timeout 75
设定保持连接超时时长,0表示禁止长连接,默认为75s
14、keepalive_requests
keepalive_requests 100
在一次长连接上所允许请求的资源的最大数量,默认为100
15、keepalive_disable none|browser
对哪种浏览器禁用长连接
16、send_timeout
send_timeout
向客户端发送响应报文的超时时长,此处是指两次写操作之间的间隔时长,而非整个响应过程的传输时长
17、client_body_buffer_size
用于接收每个客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将被暂时存到磁盘上的由下面client)_body_temp_path指令所定义的位置
18、client_body_temp_path
client_body_temp_path path level1 level2 level3
设定存储客户端请求报文的body部份的临时存储路径及子目录结构和数量目录名为16进制的数字
client_body_temp_path /var/tmp/client_body 1 2 3
1 1级目录占1位16进制,即2^4=16个目录 0-f
2 2级目录占2位16进制,即2^8=256个目录 00-ff
2 3级目录占2位16进制,即2^8=256个目录 00-ff
19、limit_rate
限制响应给客户端的传输速率,单位是bytes/secnod
默认值为0,表示无限制
20、limit_except
仅用于location限制客户端使用除了指定的请求方法之外的其它方法
method:GET,HEAD,POST,PUT,DELETE,MKCOL,COPY,MOVE,OPTIONS,PROPFIND,PROPPATCH,LOCK,UNLOCK,PATH
limit_except GET {
allow 192.168.1.0/24;
deny all;
}
除了GET和HEAD之外其它方法仅允许192.168.1.0/24网段主机使用
21、aio on | off | threads[=pool];
是否启用aio功能
22、directio size | off;
当文件大于等于给定大小时,例如directio 4m,同步(直接)写磁盘,而非写缓存
23、open_file_cache off;
open_file_cache max=N [inactive=time];
nginx可以缓存以下三种信息:
1)文件元数据:文件的描述符、文件大小和最近一次的修改时间
2)打开的目录结构
3)没有找到的或者没有权限访问的文件的相关信息
max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现管理
inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_users指令所指定的次数的缓存项即为非活动项,将被删除
24、open_file_cache_errors on|off;
是否缓存查找时发生错误的文件一类的信息
默认值off
25、open_file_cache_min_uses number;
open_file_cache指令的inactive参数指定的时长内,至少被命中此处指定的次数方可被归类为活动项
默认值为1
26、open_file_cache_valid time;
缓存项在效性的检查频率
默认为60s
ngx_http_access_module
ngx_http_access_module模块
实现基于ip的访问控制功能
-
allow address
-
deny address
自上而下检查,一旦匹配,将生效,条件严格的罗置前
如:
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;}
ngx_http_auth_basic_module模块
实现基于用户的访问控制,使用basic机制进行用户认证
-
auth_basic string | off;
-
auth_basic_user_file file;
location /admin/ {
auth_basic "login info";
auth_basic_user_file /etc/nginx/conf.d/nginxuser;
}
用户口令文件:
-
明文文本:格式name:password:comment
-
加密文本:由htpasswd命令实现
httpd-tools所提供
ngx_http_stub_status_module模块
用于输出nginx的基本状态信息
输出信息示例:
Active connections:291
server accepts handled requests
16630948 16630948 31070465
上面三个数字分别对应accepts,handled,requests三个值
Reading:6 Writing:179 Waiting:106
accepts:统计总值,已经接受的客户端请求的总数
handled:统计总值,已经处理完成的客户端请求的总数
requests:统计总值,客户端发来的总的请求数
Reading:当前状态,正在读取客户端请求报文首部的连接的连接数
Writing:当前状态,正在向客户端发送响应报文过程中的连接数
Writing:当前状态,正在等待客户端发出请求的空闲连接数
1、stub_status;
示例:
location /status {
stub_status;
allow 172.16.0.0/16;
deny all;
}
ngx_http_log_module模块
指定日志格式记录请求
-
log_format name string ...;
string可以使用nginx核心模块及其它模块内嵌的变量
-
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
访问日志文件路径,格式及相关的缓冲的配置
buffer=size
flush=time