Web服务器Nginx搭建与配置

本章内容

· I/O模型
· Nginx介绍
· Nginx安装
· Nginx各种模块

用户速度体验的1-3-10原则

Web服务器Nginx搭建与配置(new) - 图1

性能影响

· 有很多研究都表明,性能对用户的行为有很大的影响:
· 79%的用户表示不太可能再次打开一个缓慢的网站
· 47%的用户期望网页能在2秒钟以内加载
· 40%的用户表示如果加载时间超过三秒钟,就会放弃这个网站
· 页面加载时间延迟一秒可能导致转换损失7%,页面浏览量减少11%
· 8秒定律:用户访问一个网站时,如果等待网页打开的时间超过8秒,会有超过30%的用户放弃等待

Http MPM

· httpd MPM:
· perfork:进程模型,两级结构,主进程master负责生成子进程,每个子进程负责相应一个请求
· worker:线程模型,三级结构,主进程master负责生成子进程,每个子进程负责生成多个线程,每个线程响应一个请求
· event:线程模型,三级结构,主进程master负责生成子进程,每个子进程响应多个请求

I/O介绍

· I/O:
· 网络IO:本质是socket读取
· 磁盘IO
· 每次IO,都要经由两个阶段:
· 第一步:将数据从磁盘文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长
· 第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短
Web服务器Nginx搭建与配置(new) - 图2

I/O模型

· 同步异步:关注的是消息通信机制
· 同步:synchronous,调用者等待被调用者返回消息,才能继续执行
· 异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态
· 阻塞/非阻塞:关注调用者在等待结果返回之前所处状态
· 阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起
· 非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成,最终的调用结果返回之前,调用者不会被挂起
· I/O模型:
阻塞型、非阻塞型、复用型、信号驱动型、异步

同步阻塞IO模型

Web服务器Nginx搭建与配置(new) - 图3
· 同步阻塞IO模型是最简单的IO模型,用户线程在内核进行IO操作时被阻塞
· 用户线程通过系统调用read发起IO读操作,由用户空间转到内核空间。内核等到数据包到达后,然后将接收的数据拷贝到用户空间,完成read操作
· 用户需要等待read将数据读取到buffer后,才能继续处理接收的数据。整个IO请求的过程中,用户线程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够

同步非阻塞IO模型

Web服务器Nginx搭建与配置(new) - 图4
· 用户线程发起IO请求时立即返回。但并未读取到任何数据,用户线程需要不断发起IO请求,直到数据到达后,才真正读取到数据,继续执行。即“轮询”机制
· 整个IO请求的过程中,虽然用户线程每次发起Io请求后可以立即返回,但是为了等到数据,仍需要不断地轮询、重复请求,消耗了大量地CPU的资源
· 是比较浪费CPU的方式,一般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性

IO多路复用模型

Web服务器Nginx搭建与配置(new) - 图5
· 多个连接共用一个等待机制,本模型会阻塞进程,但是进程是阻塞在select或者poll这两个系统调用上,而不是阻塞在真正的IO操作上
· 用户首先将需要进行IO操作添加到select中,继续执行做其他的工作(异步),同时等待select系统调用返回。当数据到达时,IO被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行。
从流程上来看,使用select函数进行IO请求和同步阻塞模式没有太大区别,甚至还多了添加监控IO,以及调用select函数的额外操作,效率更差,并且阻塞了两次,但是第一次阻塞在select上时,select可以监控多个IO是否已有IO操作准备就绪,即可达到在同一个线程内同时处理多个IO请求的目的。而不像阻塞IO那种,一次只能监控一个IO
· 虽然上述方式允许单线程内处理多个IO请求,但是每个IO请求的过程还是阻塞的(在select函数上阻塞),平均时间甚至比同步阻塞IO模型还要长。如果用户线程只是注册自己需要的IO请求,然后去做自己的事情,等到数据到来时再进行处理,则可以提高CPU的利用率
· IO多路复用是最常使用的IO模型,但是其异步程度还不够“彻底”,因它使用了会阻塞线程的select系统调用。因此IO多路复用只能称为异步阻塞IO模型,而非真正的异步IO

多路IO复用模型

· IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,就通知该进程
· IO多路复用适用如下场合:
Ø 当客户端处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用
Ø 当一个客户端同时处理多个套接字时,此情况可能的但很少出现
Ø 当一个TCP服务器既要处理监听套接字,又要处理已连接套接字,一般也用用到I/O复用
Ø 当一个服务器既要处理TCP,又要处理UDP,一般要使用I/O复用
Ø 当一个服务器要处理多个服务或多个协议,一般要使用I/O复用

信号驱动的IO模型

Web服务器Nginx搭建与配置(new) - 图6
· 信号驱动IO:signal-driven I/O
· 用户进程可以通过sigaction系统调用注册一个信号处理程序,然后主程序可以继续向下执行,当有IO操作准备就绪时,由内核通知触发一个SIGIO信号处理程序执行,然后将用户进程所需要的数据从内核空间拷贝到用户空间
· 此模式的优势在于等待数据报到达期间进程不被阻塞。用户主程序可以继续执行,只要等待来自信号处理函数的通知
· 该模式并不常用

异步IO模型

Web服务器Nginx搭建与配置(new) - 图7
· 异步IO与信号驱动IO最主要的区别是信号驱动IO是由内核通知何时可以进行IO操作,而异步IO则是由内核告诉用户线程IO操作何时完成。信号驱动IO当内核通知触发信号处理程序时,信号处理程序还需要阻塞在从内核空间缓冲区拷贝数据到用户空间缓冲区这个阶段,而异步IO直接是在第二个阶段完成后,内核直接通知用户线程可以进行后续操作了
· 相比于IO多路复用模型,异步IO并不十分常用,不稍高性能并发服务程序使用IO多路复用模型+多线程任务处理的架构基本可以满足需求。目前操作系统对异步IO的支持并非特别完善,更多的是采用IO多路复用模型模拟异步IO的方式(IO事件触发时不直接通知用户线程,而是将数据读写完毕后放到用户指定的缓冲区中)
五种I/O模型
Web服务器Nginx搭建与配置(new) - 图8
I/O模型的具体实现
· 主要实现方式有以下几种:
l Select:Linux实现对应,I/O复用模型,BSD4.2最早实现
l Poll:Linux实现,对应I/O复用模型,System V unix最早实现
l Epoll:Linux实现,对应I/O复用模型,具有信号驱动I/O模型某些特性
l Kqueue:FreeBSD实现,对应I/O复用模型,具有信号驱动I/O模型某些特性
l /dev/poll:SUN的Solaris实现,对应I/O复用模型,具有信号驱动I/O模型的某些特性
l Iocp Windows实现,对应第5种(异步I/O)模型
select/poll/epoll
Web服务器Nginx搭建与配置(new) - 图9
Web服务器Nginx搭建与配置(new) - 图10
· Select:POSIX所规定,目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理
· 缺点
Ø 单个进程可监控的fd数量被限制,即能监听端口的数量有限
§ cat /proc/sys/fs/file-max
Ø 对socket是线性扫描,即采用轮询的方法,效率较低
Ø select采用了内存拷贝方法来实现内核将FD消息通知给用户空间,这样一来用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大
· poll
Ø 本质和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态
Ø 其没有最大连接数的限制,原因是它是基于链表来存储的
Ø 大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义
Ø poll特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd
Ø 边缘触发:只通知一次
· epoll:在Linux 2.6内核种提出的select和poll的增强版本
Ø 支持水平触发LT和边缘触发ET,最大的特点是在于边缘触发,它只告诉进程哪些fd刚刚变为就绪态,并且只会通知一次
Ø 使用“事件”的就绪通知方式,通过epollctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以接收到通知
· 优点:
Ø 没有最大并发连接的限制:能打开的fd的上线远大于1024(1G的内存能监听约10万个端口)
Ø 效率提升:非轮询的方式,不会随着fd数目的增加而效率下降;只有活跃可用的fd才会调用callback函数,即epoll最大的优点就在于它只管理“活跃”的连接,而跟连接总数无关
Ø 内存拷贝,利用mmap(Memory Mapping)加速与内核空间的消息传递;即epoll使用mmap减少复制开销
直接内存映射
Web服务器Nginx搭建与配置(new) - 图11
Nginx介绍
· Nginx:engine X,2002年,开源,商业版
· NGINX是免费,开源,高性能的HTTP和反向代理服务器,邮件代理服务器,通用TCP/UDP代理服务器
· 解决C10K问题(10K Connections)
· 官网:http://nginx,org
· 二次开发版:
Tengine,OpenResty(章亦春)
正向代理和反向代理
Web服务器Nginx搭建与配置(new) - 图12
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后向代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。 正向代理还可以使用缓冲特性(由mod_cache提供)减少网络使用率。
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。

Nginx介绍
· 特性:
· 模块化设计,较好的扩展性
· 高可靠性
· 支持热部署:不停机更新配置文件,升级版本,更换日志文件
· 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
· event-driven,aio,mmap,sendfile
· 基本功能:
· 静态资源的web服务器
· http协议反向代理服务器
· pop3/imap4协议反向代理服务器
· FastCGI(LNMP),uWSGI(python)等协议
· 模块化(非DSO),如zip,SSL模块
Nginx的程序架构
· web服务相关的功能:
虚拟主机(server)
支持keep-alive和管道连接
访问日志(支持基于日志缓冲提高其性能)
url rewrite
路径别名
基于IP及用户的访问控制
支持速率限制及并发数限制
重新配置和在线升级而无须中断客户的工作进程
Memcached的GET接口
· nginx的程序架构:
master/worker结构
· 一个master进程:
负载加载和分析配置文件、管理worker进程、平滑升级
· 一个或多个worker进程
处理并响应用户请求
· 缓存相关的进程:
cache loader:载入缓存对象
cache manager:管理缓存对象
Lnmp:Linux/nginx/mysql/php
Web服务器Nginx搭建与配置(new) - 图13
Web服务器Nginx搭建与配置(new) - 图14
nginx架构
Web服务器Nginx搭建与配置(new) - 图15

nginx模块
· nginx高度模块化,但其模块早期不支持DSO机制;1.9.11版本支持动态装载和卸载
· 模块分类:
· 核心模块:core module
· 标准模块:
· HTTP模块:ngx_http

· HTTP Core modules 默认功能
· HTTP Optional modules 需编译时指定
· Mail模块 ngxmail

· Stream 模块 ngxstream
· 第三方模块
nginx的功用
· 静态的web资源服务器
html,图片,js,css,txt等静态资源
· 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
· http/https协议的反向代理
· imap4/pop3协议的反向代理
· tcp/udp协议的请求转发(反向代理)
nginx的安装
· 官方:
http://nginx.org/packages/centos/7/x86_64/RPMS
· Fedora-EPEL:
https://mirrors.aliyun.com/epel/7/x86_64/
· 编译安装:
Ø yum install pcre-devel openssl-devel zlib-devel
Ø useradd -r nginx
Ø ./configure —prefix=/usr/local/nginx –conf-path=/etc/nginx/nginx.conf –err-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –pid-path=/var/run/nginx.pid –lock-path=/var/run/nginx.lock –user=nginx –group=nginx –with-http_ssl_module –with-http_v2_module –with-http_dav_module –with-http_stub_status_module –with-threads –with-file-aio
Ø make && make install
编译安装nginx选项
· 编译安装nginx选项:
Ø —prefix=/etc/nginx 安装路径
Ø —sbin-path=/usr/sbin/nginx 指明nginx程序文件安装路径
Ø —conf-path=/etc/nginx/nginx.conf 主配置文件安装位置
Ø —error-log-path=/var/log/nginx/error.log 错误日志文件安装位置
Ø —http-log-path=/var/log/nginx/access.log 访问日志文件安装位置
Ø —pid-path=/var/run/nginx.pid 指明pid文件安装位置
Ø —lock-path=/var/run/nginx.lock 锁文件安装位置
Ø —http-client-body-temp-path=/var/cache/nginx/client_temp 客户端body部分的临时文件存放路径,服务器允许客户端使用put方法提交大数据时,临时存放的磁盘路径
Ø —http-proxy-temp-path=/var/cache/nginx/proxy_temp 作为代理服务器,服务器响应报文的临时文件存放路径
Ø —http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp 作为fastcgi代理服务器,服务器响应报文的临时文件存放路径
Ø —http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp 作为uwsgi代理服务器,服务器响应报文的临时文件存放路径
Ø —http-scgi-temp-path=/var/cache/nginx/scgi_temp 作为scgi反代理服务器,服务器响应报文的临时文件存放路径
Ø —user=nginx 指明以哪个身份运行worker进程,主控master进程一般由root运行
Ø —group=nginx
Ø —with-http_ssl_module 表示把指定模块编译进来
nginx目录结构和命令
· ls /usr/local/nginx/ html是测试页,sbin是主程序
· ls /usr/local/nginx/sbin/ nginx只有一个程序文件
· ls /usr/local/nginx/html/ 50x.html index.html 测试网页
· Nginx:默认为启动nginx
-h 查看帮助选项
-V 查看版本和配置选项
-t 测试nginx语法错误
-c filename指定配置文件(default:/etc/nginx/nginx.conf)
-s signal发送信号给master进程,signal:stop,quit,reopen,reload
示例:nginx -s stop 停止nginx
nginx -s reload 加载配置文件
-g directives 在命令行中指明全局指令
nginx配置
· 配置文件的组成部分:
· 主配置文件:nginx.conf
· 子配置文件 include conf.d/
.conf
· fastcgi,uwsgi,scgi等协议相关的配置文件
· mime.type:支持的mime类型
· 主配置文件的配置指令:
· directive value [value2 …];
· 注意:
(1)指令必须以分号结尾
(2)支持使用配置变量
内建变量:由Nginx模块引入,可直接引用
自定义变量:由用户使用set命令定义
set variable_name value;
引用变量:$variable_name
· Main 全局配置段常见的配置指令分类
· 正常运行必备的配置
· 优化性能相关的配置
· 用于调试及定位问题相关的配置
· 事件驱动相关的配置
· 帮助文档
http://nginx.org/en/docs/
· 正常运行必备的配置:
· 帮助文档:http://nginx.org/en/docs/ngx_core_module.html
· 1、user
Syntax: user user [group];
Default: user nobody nobody;
Context: main
指定woker进程的运行身份,如组不指定,默认和用户名同名
· 2、pid /PATH/TO/PID_FILE
指定存储mginx主进程PID的文件路径
· 3、include file | mask
指明包含进来的其他配置文件片段
· 4、local_module file
指定加载配置文件:/usr/share/nginx/modules/.conf
指明要装载的动态模块路径:/usr/lib64/nginx/modules
l 性能优化相关的配置:
Ø 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:8号CPU
worker_cpu_affinity 0001 0010 0100 1000;
worker_cpu_affinity 0101 1010;
Ø 3、worker_priority number
指定worker进程的nice值,设定worker进程优先级:[-20,20]
Ø 4、worker_rlimit_nofile number
worker进程所能够打开的文件数量上限,如65535

nginx配置文件
l 主配置文件结构:四部
Ø main block:主配置段,即全局配置段,对http,mail都有效
event {

} 事件驱动相关的配置
Ø http {

} http/https协议相关配置段
Ø stream {

} stream服务器相关配置段
http协议相关的配置结构
http {

… 各server的公共配置
server { 每个server用于定义一个虚拟主机

}
server {

server_name 虚拟主机名
root 主目录
alias 路径别名
location [OPERATOR] URL { 指定URL的特性

if CONDITION {

}
}
}
}


1个master带两个worker
Web服务器Nginx搭建与配置(new) - 图16
Web服务器Nginx搭建与配置(new) - 图17
将配置文件中的用户改为nobody
nginx -t 检查语法
nginx -s reload 重新加载
Web服务器Nginx搭建与配置(new) - 图18
nginx配置
l 事件驱动相关的配置:
Ø event {

}
Ø 1、worker_connections number
每个worker进程所能够打开的最大并发连接数数,如10240
总最大并发数:worker_process
worker_connections
Ø 2、use method
指明并发连接请求的处理方法,默认自动选择最优方法
use epoll;
Ø 3、accept_mutex on | off 互斥
处理新的连接请求的方法;on指由各个worker轮流处理新请求,off指每个新请求的到达都会通知(唤醒)所有的worker进程,但只有一个进程可获得连接,造成“惊群”,影响性能
l 调试与定位问题:
Ø 1、daemon on|off
是否以守护进程方式运行nginx,默认是守护进程方式
Ø 2、master_process on | off
是否以master/worker模型运行nginx;默认为on
Ø 3、error_log file [level]
错误日志文件及其级别;出与调试需要,可设定为debug;但debug仅在编译时使用了“—with-debug”选项时才有效
方式:file /path/logfile;
stderr:发送到标准错误
syslog:server-address[,parameter=values]:发送到syslog memory:size 内存
level:debug|info|notice|warn|error|crit|alter|emerg

l http协议的相关配置:
http {
… …
server {

server_name
root
location [OPERATOR] /uri/ {

}
}
server {

}
}
ngx_http_core_module
· ngx_http_core_module
· 与套接字相关的配置:
· 1、server { … }
配置一个虚拟主机
server {
listen address[:PORT] | PORT;
server_name SERVER_NAME;
root /PATH/TO/DOCUMENT_ROOT;
}
· 2、listen PORT|address[:port]unix:/PATH/TO/SOCKET_FILE
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地址不同
· 基于hostname server_name fqdn; 指令指向不同的主机名
· 3、server_nane name …;
· 虚拟主机的主机名称后可跟多个由空白字符分隔的字符串
· 支持通配任意长度的任意字符
· server_name
.chaitc.com www.chaitc.
· 支持~起始的字符做正则表达式模式匹配,性能原因慎用
· server_name ~^www\d+.chaitc.com$
· 说明:\d表示[0-9]
· 匹配优先级机制从高到低:
· (1)首先是字符串精确匹配,如:www.chaitc.com
· (2)左侧
通配符 如:.chaitc.com
· (3)右侧
通配符 如:www.chaitc.
· (4)正则表达式 如:~^.
.chaitc.com$
· (5)default_server
· 4、tcp_nodelay on | off;
在keepalived模式下的连接是否启用TCP_NODELAY选项
当为off时,延迟发送,合并多个请求后再发送
默认On时,不延迟发送
可用于:http,server,location
· 5、sendfile on | off;
是否启用sendfile功能,在内核中封装报文直接发送
默认Off
· 6、server_tokens on | off | build | string
是否在响应报文的Server首部显示nginx版本

l 定义路径相关的配置
l 7、root
l 设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径,可用于http,server,location,if in location
server {

root /data/www/vhost1;
}
Ø 示例
http://www.chaitc.com/images/logo.jpg
/data/www/vhosts/images/logo.jpg
l 8、location [ = | ~ | ~ | ^~ ] uri {…}
location@name{…}
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;nginx会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置
l 示例:
server {…
server_name www.chaitc.com;
location /images/ {
root /data/imgs/;
}
}
http://www.chaitc.com/images/logo.jpg
/data/imgs/images/logo.jpg

l =:对URI做精确匹配:
location = /{

}
http://www.chaitc.com/ 匹配
http://www.chaitc.com/index.html 不匹配
l ^~: 对URI的最左边部分做匹配检查,不区分字符大小写
l ~: 对URI做正则表达式模式匹配,区分字符大小写
l ~
: 对URI做正则表达式模式匹配,不区分字符大小写
l 不带符号:匹配起始于此uri的所有的uri
l 匹配优先级从高到低:
=,^~,~/~,不带符号
l 示例:
Ø root /vhosts/www/htdocs/
http://www.chaitc.com/index.html
è /vhosts/www/htdocs/index.html
Ø server {
root /vhosts/www/htdocs/
location /admin/ {
root /webapps/app1/data/
}
}
http://www.chaitc.com/admin/index.html
è /webapps/app1/data/admin/index.html
location示例
Web服务器Nginx搭建与配置(new) - 图19
l 9、alias path;
路径别名,文档映射的另一种机制;仅能用于location上下文
l 示例:
http://www.chaitc.com/bbs/index.php
location /bbs/ {
alias /web/forum/;
}  /web/forum/index.html
location /bbs/ {
root /web/forum/;
}  /web/forum/bbs/index.html
Ø 注意:location中使用root指令和alias指令的意义不同
(a) root,给定的路径对应于location中的/uri/左侧的/
(b) alias,给定的路径对应于location中的/uri/右侧的/
l 10、index file …;
指定默认网页文件,注意:ngx_http_index_module模块

l 11、error_page_code …[=[response]] uri;
模块:ngx_http_core_module
定义错误页,以指定的响应状态码进行响应
可用位置:http,server,location,if in location
error_page 404 /404.html
error_page 404 =200 /404.html
Web服务器Nginx搭建与配置(new) - 图20

l 12、try_file file … uri;
try_file file …=code;
按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误
location /images/ {
try_files $uri /images/default.gif;
}
location / {
try_file $uri $uri/index.html $uri.html = 404;
}
l 定义客户端请求的相关配置
l 13、keepalive_timeout timeout [header_timeout];
设置保持连接超时时长,0表示禁止长连接,默认为75s
l 14、keepalive_requests number;
在一次长连接上所允许请求的资源的最大数量
默认为100
l 15、keepalive_disable none | browser …
对哪种浏览器禁用长连接
l 16、send_timeout time;
向客户端发送响应报文的超时时长,此处是指两次写操作之间的间隔时长,而非整个响应过程的传输时长。
l 17、client_body_buffer_size size;
用于接收每个客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将暂存到磁盘上的由下面client_body_temp_path指令所定义的位置
l 18、client_body_temp_path path [level1 [level2 [level3]]];
设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量
目录名为16进制的数字;
client_body_temp_path /var/tmp/client_body 1 2 2
1 1级目录占1位16进制,即2^4=16个目录0-f
2 2级目录占2位16进制,即2……8=256个目录00-ff
3 3级目录占2位16进制,即2……8=256个目录00-ff
l 对客户端进行限制的相关配置
l 19、limit_rate rate;
限制响应给客户端的传输速率,单位是bytes/second
默认值0表示无限制
l 20、limit_except method …{…} 仅用于location
限制客户端使用除了指定的请求方法之外的其他方法
method:GET,HEAD,POST,PUT,DELETE
MKCOL,COPY,MOVE,OPTIONS,PROPFIND,
PROPPATCH,LOCK,UNLOCK,PATCH
limit_except GET{
allow 192.168.1.0/24;
deny all;
} 除了GET和HEAD之外其它方法仅允许192.168.1.0/24网段主机使用
l 文件操作优化的配置
l 21、aio on | off | threads[=poll];
是否启用aio功能
l 22、directio size | off;
当文件大于等于给定大小时,例如directio 4m,同步(直接)写磁盘,而非写缓存
l 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指令所指定的次数的缓存项即为非活动项,将被删除
l 24、open_file_cache_error on | off;
是否缓存查找时发生错误的文件一类的信息
默认值为off
l 25、open_file_cache_min_uses number;
open_file_cache指令的inactive参数指定的时长内,至少被命中此处指定的次数方可被归类为活动项
默认值为1
l 26、open_file_cache_valid time;
缓存项有效性的检查频率
默认值为60s
ngx_http_access_module
l ngx_http_access_module
实现基于ip的访问控制功能
l 1、allow address | CIDR | unix: | all;
l 2、deny address | CIDR | unix: | all;
http,server,location,limit_except
自上而下检查,一旦匹配,将生效,条件严格的置前
l 示例:
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
l ngx_http_auth_basic_module模块
实现基于用户的访问控制,使用basic机制进行用户认证
l 1、auth_basic string | off;
l 2、auth_basic_user_file file;
location /admin/ {
auth_basic “Admin Area”;
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
Ø 用户口令文件:
1、明文文本:格式name:password:comment
2、加密文本:由htpasswd命令实现
httpd-tools所提供
ngx_http_stub_status_module
l 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
Active connections:当前状态,活动状态的连接数
accepts:统计总值,已经接受的客户端请求的总数
handled:统计总值,已经处理完成的客户端请求的总数
requests:统计总值,客户端发来的总的请求数
Reading:当前状态,正在读取客户端请求报文首部的连接的连接数
Writing:当前状态,正在向客户端发送响应报文过程中的连接数
Waiting:当前状态,正在等待客户端发出请求的空闲连接数
l 1、stub_status;
示例:
location /status {
stub_status;
allow 172.16.0.0/16;
deny all;
}

ngx_http_log_module
l ngx_http_log_module模块
指定日志格式记录请求
l 1、log_format name string …;
string可以使用nginx核心模块及其它模块内嵌的变量
l 2、access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]
access_log off;
访问日志文件路径,格式及相关的缓冲的配置
buffer=size
flush=time
l 示例
log_format compression ‘$remote_addr-$remote_user[$time_local]’
‘”$request”$status $bytes_sent’
‘”$http_referer””$http_user_agent””$gzip_ratio”’;
access_log /spool/log/nginx-access.log compression buffer=32k;
l 3、open_log_file_cache max=N [inactive=time] [min_uses=N]
[valid=time];
open_log_filecache off;
缓存各日志文件相关的元数据信息
max:缓存的最大文件描述符数量
min_uses:在inactive指定的时长内访问大于等于此值方可被当作活动项
inactive:非活动时长
valid:验证缓存中各缓存项是否为活动项的时间间隔
ngx_http_gzip_module
l ngx_http_gzip_module
用gzip方法压缩响应数据,节约带宽
l 1、gzip on | off;
启用或禁用gzip压缩
l 2、gzip_comp_level level;
压缩比由低到高:1到9
默认:1
l 3、gzip_disable regex …;
匹配到客户端浏览器不执行压缩
l 4、gzip_min_length length;
启用压缩功能的响应报文大小阈值
l 5、gzip_http_version 1.0|1.1;
设定启用压缩功能时,协议的最小版本
默认:1.1
l 6、gzip_buffers number size;
支持实现压缩功能时缓冲区数量及每个缓冲区的大小
默认:32 4k 或16 8k
l 7、gzip_types mime-type …;
指明仅对哪些类型的资源执行压缩操作;即压缩过滤器
默认包含有text/html,不用显示指定,否则出错
l 8、gzip_vary on|off;
如果启用压缩,是否在响应报文首部插入“Vary:Accept-Encoding”
l 9、gzip_proxied off | expire | no-cache | no-store | private | no_last_modified | no_etag |auth | any …;
nginx充当代理服务器时,对于后端服务器的响应报文,在何种条件下启用压缩功能
off:不启用压缩
expired,no-cache,no-store,private:对后端服务器的响应报文首部Cache-Control值任何一个,启用压缩功能
l 示例:
gzip on;
gzip_comp_level 6;
gzip_min_length 64;
gzip_proxied any;
gzip_tppes text/xml text/css application/javascript;
*ngx_http_ssl_module

l ngx_http_ssl_module模块:
l 1、ssl on | off;
为指定虚拟机启用HTTPS protocol,建议用listen指令代替
l 2、ssl_certificate file;
当前虚拟主机使用PEM格式的证书文件
l 3、ssl_certificate_key file;
当前虚拟主机上与其证书匹配的私钥文件
l 4、ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];支持ssl协议版本,默认为后三个
l 5、ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
none:通知客户端支持ssl session cache,但实际不支持
builtin[:size]:使用OpenSSL内建缓存,为每worker进程私有
[shared:name:size]:在各worker之间使用一个共享的缓存

nginx常见错误代码:

500 Internal Server Error 内部服务错误:顾名思义500错误一般是服务器遇到意外情况,而无法完成请求。
501 服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。
502 Bad Gateway错误
503 服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。(服务不可用)
504 Gateway timeout 网关超时
505 服务器不支持请求中所用的HTTP协议版本。(HTTP版本不受支持)