一 核心模块ngx_http_core_module
 
1.1 客户端部分
# chunked_transfer_encoding 
语法:chunked_transfer_encoding on | off;
默认:chunked_transfer_encoding on;
上下文:    http, server, location
http协议中,transfer-encoding:chunked表示在传输数据过程中要使用分块技术。而与之对应的是将数据写到一个很大很大的字节数组,如果使用这个配置就不必申请一个很大的字节数组,
占用的资源也少。这个一般结合Content-Encoding:gzip使用,即先将数据压缩,再使用块技术传输数据。有时候我们会在报文中看到Content-Length:60,Content-Length就是数组大小,即
需要申请的一个很大的字节数组的大小。
 
# 指定处理客户端请求body部分的缓存的大小
语法: client_body_buffer_sizesize;
默认:client_body_buffer_size 8k|16k;
上下文:    http, server, location
 
这个一般用于处理POST请求,表单提交,文件上传等操作。如果你要处理很多很大的POST提交,那么就有可能16k不够,这个值在这时候设置大一些,比如502k或者1024K等等。
 
# client_header_buffer_size
Syntax: client_header_buffer_size size;
默认:
client_header_buffer_size 1k;
Context:   http, server
client_max_body_size 指令指定了处理客户端请求header部分的buffer的大小。设置成1K能满足绝大部分需求。client_max_body_size 指令指定了可以接受的最大的用户请求body大小。通过HTTP头中的Content-Length确认,如果大小超过这个值,则客户端会得到“Request Entity Too Large” (413)错误。
 
# client_body_in_file_only
Syntax: client_body_in_file_only on | clean | off;
默认:
client_body_in_file_only off;
Context:   http, server, location
决定是否nginx要保存客户端请求body整个部分到一个文件,一般用于debug比较多。
on: 表示临时文件不会被删除
clean: 表示临时文件会被删粗
 
# client_body_in_single_buffer
为了减少拷贝操作,使用该指令是得Nginx将整个客户端请求保存在单个缓存中
Syntax: client_body_in_single_buffer on | off;
默认:
client_body_in_single_buffer off;
Context:   http, server, location
 
# client_body_temp_path path
可以定义一个目录或者路径用于保存请求客户端的请求体所在的临时文件
Syntax: client_body_temp_path path [level1 [level2[level3]]];
默认  
client_body_temp_path client_body_temp;
Context:   http, server, location
 
# client_body_timeout
定义读取客户端请求body的超时时间,这个超时时间是指客户端成功读取两个操作之间设置,而不是整个请求体传输.
语法:client_body_timeout time;
默认: 
client_body_timeout 60s;
Context:   http, server, location
 
# client_header_timeout
读取客户端请求头的超时时间
语法:client_header_timeout time;
默认: 
client_header_timeout 60s;
Context:   http, server
 
# 设置请求体所允许的最大大小,体现在Content-Length字段,如果超过这个指定大小,则返回413错误。
 
语法:client_max_body_size size;
默认: 
client_max_body_size 1m;
Context:   http, server, location
 
# 对某些类型的客户端禁用keep-alive请求功能
语法:keepalive_disable none | browser ...;
默认:keepalive_disablemsie6;
上下文:http, server,location
 
keep-alive? 
早期http请求都要求打开一个tpc socket连接,并且使用一次之后就断开这个tcp连接。为了加快客户端和服务端的访问请求速度,keep-alive就是浏览器和服务器端之间保持长连接,
这个连接是可以复用 的。而在HTTP1.1中是默认打开的。通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能。
 
但是,keep-alive并不是免费的午餐,长时间的tcp连接容易导致系统资源无效占用。配置不当的keep-alive,有时比重复利用连接带来的损失还更大。所以,正确地设置keep-alive timeout时间非常重要。
 
# keep-alive的持续多久,然后断开这个链接
语法:keepalive_timeout timeout [header_timeout];
默认:keepalive_timeout 75s;
上下文:    http, server, location
 
# 在keep-alive关闭之前还可以接受多少个请求
语法:keepalive_requests number;
默认:keepalive_requests100;
上下文:    http, server, location
 
# 定义最大数量客户端请求头的buffer大小
语法: large_client_header_buffersnumber size;
默认:large_client_header_buffers 4 8k;
上下文:    http, server
 
 
1.2文件I/O指令
这些指令用于控制Nginx如何投递静态文件
 
# aio: 启用异步文件I/O
# directio size|off,默认off. 当读取大于或者等于指定size的文件,允许使用允许使用O_DIRECT标记(FreeBSD、Linux)、F_NOCACHE标志(macOS)或directio()函数(Solaris),Linux一般在使用aio的使用需要使用该指令
 
# open_file_cache off | max=N [inactive=time]; 
配置一个缓存用于存储打开的文件描述符,目录查询和文件查询错误
 
# open_file_cache_errors on | off; 
启用或禁用open_file_cache对文件查找错误的缓存。
 
# open_file_cache_min_uses number;
在open_file_cache指令的非活动参数配置的期间,设置文件访问的最小数量,要求文件描述符在缓存中保持打开状态。
 
# open_file_cache_valid time;
指定对open_file_cache缓存进行有效性检查的时间间隔
 
# postpone_output size size
如果可能,Nginx延迟发送数据给客户端,直到Nginx至少有size字节的数据,如果是0,代表没有启用。
 
# read_ahead size size
在处理文件时设置内核预读的数量。如果是0,代表没有启用。
 
# sendfile on | off;
设置使用sendfile函数从一个文件到另外一个文件描述符
 
#  sendfile_max_chunk size;
设置sendfile最大的拷贝数量
 
 
1.3 hash部分
1.3 hash指令
# server_name example.com www.example.com;
配置域名,可以有多个
 
# server_name_in_redirect on | off;
重定向的时候是否以配置的server_name的第一个域名还是原始请求的URL,常见的就是在URL末尾NGinx自己补了一个斜杠
比如server_name_in_redirectoff表示:让 nginx 在处理自己内部重定向时不默认使用  server_name设置中的第一个域名
 
# server_names_hash_bucket_size size;
设置服务器名哈希表的bucket大小。
 
# server_names_hash_max_size size;
设置服务器名哈希表的最大大小
 
# types_hash_bucket_size size;
指定用于存放哈希表的桶大小
 
# types_hash_max_size size;
指定哈希类型表的最大大小
 
# variables_hash_bucket_size
指定用于存放保留变量桶大小
 
# variables_hash_max_size
指定存放保留变量最大哈希值的大小
 
 
1.4 套接字 socket部分
1.4 Socket指令
# lingering_close off | on | always
控制Nginx怎样关闭连接,字面意思就是延迟关闭,当nginx要关闭连接时,并非立即关闭连接,而是先关闭tcp连接的写,再等待一段时间后再关掉连接的读。
"on"指示nginx在完全关闭连接之前等待并处理来自客户机的额外数据,但前提是它建议客户机可能发送更多数据。
"always"将导致nginx无条件地等待并处理额外的客户端数据。
"off"告诉nginx永远不要等待更多的数据,并立即关闭连接。这种行为违反了协议,在正常情况下不应该使用。
 
# lingering_timeout time 
当lingering_close生效时,该指令指定nginx将处理(读取和忽略)来自客户机的额外数据的最大时间。
 
 
# lingering_timeout time
当lingering_close生效时,该指令指定更多客户机数据到达的最大等待时间。
 
# reset_timedout_connection on | off
当套接字关闭时,TCP RST被发送到客户端,并释放由该套接字占用的所有内存。这有助于避免长时间在FIN_WAIT1状态中保存已经关闭的套接字。
 
# send_lowat size
如果非零,Nginx将会在客户端socket尝试减少发送操作
 
# send_timeout time
设置用于向客户端发送响应的超时。超时只设置在两个连续写操作之间,而不是整个响应的传输。如果客户端在这段时间内没有收到任何东西,连接就会关闭。
 
# tcp_nodelay on | off
启用或者禁用TCP_NODELAY选项,用于keep-alive连接。在短连接中并不存在小包阻塞的问题,而在长连接中需要做tcp_nodelay开启。相当于禁用Nagle算法。
 
# tcp_nopush on | off
仅依赖于sendfile使用,它能够使得Nginx在一个数据包中尝试发送响应头或者发送一个完整的文件。功能类似于在发送数据管道出口处插入一个“塞子”,使得发送数据全部被阻塞,可以认为它是Nagle算法的进一步增强,即阻塞数据包发送。
 
Nagle 算法:
 
假如需要频繁的发送一些小包数据,比如说1个字节,以IPv4为例的话,则每个包都要附带40字节的头,也就是说,总计41个字节的数据里,其中只有1个字节是我们需要的数据。
为了解决这个问题,出现了Nagle算法。它规定:如果包的大小满足MSS,那么可以立即发送,否则数据会被放到缓冲区,等到已经发送的包被确认了之后才能继续发送。
通过这样的规定,可以降低网络里小包的数量,从而提升网络性能。
 
DelayedAcknowledgment 延迟确认:
假如需要单独确认每一个包的话,那么网络中将会充斥着无数的ACK,从而降低了网络性能。
为了解决这个问题,DelayedAcknowledgment规定:不再针对单个包发送ACK,而是一次确认两个包,或者在发送响应数据的同时捎带着发送ACK,又或者触发超时时间后再发送ACK。
通过这样的规定,可以降低网络里ACK的数量,从而提升网络性能。
 
 
二 连接限制模块ngx_http_limit_conn_module
2.1 limit_conn
语法结构:limit_conn zonenumber
设置共享内存区域和最大允许连接数。当超出此限制时,服务器将返回响应请求的错误
limit_conn perip 10;
limit_conn perserver 100;
 
2.2 limit_conn_log_level
语法结构:limit_conn_log_levelinfo | debug | notice | warn | error
设置限制连接的日志级别
 
2.3 limit_conn_status
语法结构:limit_conn_statuscode
设置要拒绝请求的返回的状态码
 
2.4 limit_conn_zone
语法结构:limit_conn_zonekey zone=name:size
key: 表示要限制的对象
name: 表示zone的名字
size: 表示大小
设置共享内存zone的参数,特别是,状态包括当前的连接数。
比如:
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
$binary_remote_addr: 远程地址的二进制表示
$server_name: 服务器名字
perip:这个zone的名字
也就是说相同客户端只需只允许10m的网络带宽
 
三 限制请求模块ngx_http_limit_req_module
3.1 limit_req
语法结构: limit_reqzone=name [burst=number] [nodelay];
zone: 表示设置的共享内存区域
limit_req_zone $binary_remote_addr zone=one:10mrate=1r/s;
 
server {
    location/search/ {
       limit_req zone=one burst=5;
    }
}
 
3.2 limit_req_log_level
语法结构:limit_req_log_level info | notice | warn | error;
设置限制请求的日志级别
 
3.3 limit_req_status
语法结构: limit_req_statuscode
当拒绝请求的时候给客户端返回的响应状态码
 
3.4 limit_req_zone
语法结构:limit_req_zone key zone=name:size rate=rate
key: 要限制的对象,IP 或者主机名都可以
name: 给这个zone设置名字
size: 所允许的带宽
rate: 下载速率
limit_req_zone $binary_remote_addr zone=one:10mrate=1r/s;
 
server {
    location/search/ {
       limit_req zone=one burst=5;
    }
}
 
有一个三方模块limit_req2_nginx_module,如果要使用需要安装
limit_req2_zone $http_x_forwarded_forzone=www_req_per_ip:20m rate=18r/s;
limit_req2_zone $http_x_forwarded_for $urizone=www_same_req_per_ip:20m rate=10r/s;