1.HTTP核心配置指令
Nginx最核心的功能就是处理HTTP请求,HTTP核心 配置指令用于进行Nginx处理HTTP请求时的相关处理方 法的配置。HTTP请求处理的简单闭环流程模型是当客 户端发起HTTP请求后,服务端会解析HTTP请求头,并 根据HTTP请求头中访问的URI与本地路径文件进行匹 配,进行读数据或写数据的操作,然后返回处理结果 并断开HTTP连接。Nginx对HTTP请求进行内部处理的过 程要比上述过程更加复杂,但HTTP请求处理的闭环流 程是一致的。
按照HTTP请求处理闭环流程模型,结合HTTP核心 配置指令的功能,可以将Nginx的HTTP核心配置指令进 行如下分类:
·初始化服务、HTTP请求解析、访问路由location、访问重写rewrite、访问控制、数据处理、·关闭连接、日志记录。
1.1 初始化服务
主要介绍与HTTP虚拟主机服务的建立、端口 监听及监听方式等服务初始化有关的配置指令
1.1.1 端口监听指令
名称 | 端口监听指令 |
指令 | listen |
作用域 | server |
默认值 | listen *:80或*:8000 |
指令说明 | 服务监听端口、绑定IP、监听方式的配置 |
Nginx服务通过listen指令的指令值监听网络请 求,可以是IP协议的形式,也可以是UNIX域套接字。如果不设置listen指令,Nginx在以超级用户运行时则 监听80端口,以非超级用户运行时则监听8000端口。
1.1.2 listen指令的指令值
参数 | 默认值 | 参数说明 |
---|---|---|
address | -- | 若为 IP 协议,该参数值为指定绑定监听端口的 IP 或主机名;若为 UNIX 域套接字,则该参数值为 sock 文件路径 |
port | 80 | IP 协议监听的端口 |
bind | address:port | 指定 IP 及端口 |
ipv6only | on | 只接收 IPv6 连接或接收 IPv6 和 IPv4 连接 |
default_server | -- | 当 http 指令域中包含多个虚拟主机时,该参数用于指定哪个虚拟主机是默认服务,默认将第一个顺序的 server 设为默认服务。默认服务可以用来处理没有 server_name 匹配成功的请求 |
http2 | -- | HTTP/2 协议支持 |
spdy | -- | SDPY 协议支持,与 HTTP/2 协议不能同时存在 |
ssl | -- | SSL 支持 |
proxy_protocol | -- | 在指定监听端口上启用 proxy_protocol 协议支持 |
fastopen | number | HTTP 处于保持连接(keepalive)状态时,允许不经过三次握手的 TCP 连接的队列的最大数 |
deferred | -- | 添加该参数后,在 TCP 三次握手的过程中,检测到客户端有数据时才将 TCP 状态置为 ESTABLISHED 状态,没有数据则直接丢弃 |
reuseport | -- | 默认情况下,所有的工作进程会共享一个 socket 去监听同一 IP 和端口的组合。该参数启用后,允许每个工作进程有独立的 socket 去监听同一 IP 和端口的组合,内核会对传人的连接进行负载均衡。适用于 Linux 3.9+,DragonFly BSD 和 FreeBSD 12+ |
so_keepalive | off | 配置是否在监听的端口启用"TCP keepalive"机制。当设置为 on 时,默认等同于 so_keepalive=30m::10,表示 30 分钟无数据传输时发送探测包,发送 10 次,发送间隔使用系统内核参数 tcp_keepalive_intvl 的设定值 |
backlog | -1/511 | 当阻塞时,设置挂起连接队列的最大长度,在 FreeBSD,DragonFly BSD 和 MacOS 操作系统上,默认值为 -1,其他平台上值为 511 |
rcvbuf | -- | socket 接收缓冲的大小,默认为 8k 字节,在接收数据比较大的场景中可以适当调整 |
sndbuf | -- | socket 发送缓冲的大小,默认为 8k 字节,在发送数据较大的场景中可以适当调整 |
setfib | number | 为监听套接字设置关联路由表,仅在 FreeBSD 系统上有效 |
accept_filter | filter | 为监听套接字设置过滤器,仅支持 FreeBSD 和 NetBSD 5.0+ 系统 |
http {
server {
listen 127.0.0.1:8000; # 监听127.0.0.1的8000端口
listen 127.0.0.1; # 监听127.0.0.1的默认80端口(root权限)
listen 8000; # 监听本机所有IP的8000端口
listen *:8000; # 监听本机所有IP的8000端口
listen localhost:8000; # 监听locahost的8000端口
listen [::]:8000; # 监听IPv6的8000端口
listen [::1]; # 监听IPv6的回环IP的默认80端口(root权限)
listen unix:/var/run/nginx.sock; # 监听域套接字文件
listen *:8000 \ # 监听本机的8000端口
default_server \ # 当前服务是http指令域的主服务
fastopen=30 \ # 开启fastopen功能并限定最大队列数为30
deferred \ # 拒绝空数据连接
reuseport \ # 工作进程共享socket这个监听端口
backlog=1024 \ # 请求阻塞时挂起队列数是1024个
so_keepalive=on; # 当socket为保持连接时,开启状态检测功能
}
}
1.1.3 关闭保持连接指令
名称 | 关闭保持连接指令 |
指令 | keepalive_disable |
作用域 | http、server、location |
默认值 | msie6 |
指令说明 | 对指定的浏览器关闭保持连接机制,如果指令为none,则对所有浏览器开启保持连接机制 |
#配置样例如下:
http {
keepalive_disable none;
}
保持连接机制可以使同一客户端的多个HTTP请求 复用TCP连接,减少TCP握手次数和并发连接数,从而 降低服务器资源消耗。
1.1.4 保持连接复用请求数指令
名称 | 关闭保持连接指令 |
指令 | keepalive_requests |
作用域 | http、server、location |
默认值 | 100 |
指令说明 | 同一TCP连接可复用的最大HTTP请求数,超过该数值后,TCP连接将被关闭 |
#配置样例如下:
http {
keepalive_requests 1000;
}
1.1.5 保持连接超时指令
名称 | 保持连接超时指令 |
指令 | keepalive_timeout |
作用域 | http、server、location |
默认值 | 75s |
指令说明 | TCP连接内持续没有数据传输的最大时间,超过这个时间则关闭连接,默认是75s |
#配置样例如下:
http {
keepalive_timeout 75s;
}
keepalive_timeout的设定需要根据具体的场景来 考虑,最重要的是要理解保持连接的工作方式与场景 需求的匹配情况。
1.1.6 保持连接时最快发数据指令
名称 | 保持连接时最快发数据指令 |
指令 | tcp_nodelay |
作用域 | http、server、location |
默认值 | on |
指令说明 | 当HTTP处于保持连接状态、SSL、无缓冲代理、WebSocket代理时,默认开启该指令。该指令允许小数据包发送,适用于延时敏感、小包数据的场景,该指令关闭时,数据包在缓存中达到一定量值时才会发送 |
#配置样例如下:
http {
tcp_nodelay off;
}
1.1.7 域名解析服务器指令
名称 | 域名解析服务器指令 |
指令 | resolver |
作用域 | http、server、location |
默认值 | - |
指令说明 | 用于指定域名解析服务器地址,域名解析服务器可以将upstream主机组中的主机域名解析为IP地址。nginx会缓存解析结果,默认缓存时间是解析响应中的TTL值,可以通过valid参数进行调整 |
#配置样例如下:
http {
resolver 127.0.0.1 [::1]:5353 valid=30s;
}
指令值参数valid:用于设置缓存解析结果的时间
指令值参数ipv6:默认配置下,Nginx将在解析 域名的同时查找IPv4和IPv6地址。设置参数 ipv6=off,可以关闭IPv6地址的查找
指令值参数status_zone:设置收集指定区域请 求和响应的DNS服务器统计信息,仅商业版本有效
1.1.8 域名解析超时指令
名称 | 域名解析超时指令 |
指令 | resolver_timeout |
作用域 | http、server、location |
默认值 | 30s |
指令说明 | 设置进行域名解析超时时间 |
#配置样例如下:
http {
resolver_timeout 5s;
}
1.1.9 主机名指令
名称 | 主机名指令 |
指令 | server_name |
作用域 | server |
默认值 | - |
指令说明 | 设置所在server指令域的主机名 |