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指令域的主机名 |
#配置样例如下:
http {
server {
server_name example.com .example.com; #泛域名的使用
server_name www.example.;# 多个后缀域名的使用server_name
www.example.com ~^www.example.com$;# 正则表达式匹配
# 正则匹配变量的场景
server_name ~^(www\.)?(.+)$;
location / {
root /sites/$2;
}
# 正则匹配为变量的场景
server_name ~^(www\.)?(?<domain>.+)$;
location / {
root /sites/$domain;
}
}
}
当server_name指令值中有多个主机名时,第一个 主机名为首主机名
1.1.10 主机名哈希表最大值指令
名称 | 主机名哈希表最大值指令 |
指令 | server_names_hash_max_size |
作用域 | http、server、location |
默认值 | 512 |
指令说明 | 主机名哈希表的最大存储大小默认为512个字节,当域名较多时,可以用该指令增加存储大小 |
#配置样例如下:
http {
server_names_hash_max_size 1024;
}
1.1.11 主机名哈希桶最大值指令
名称 | 主机名哈希桶最大值指令 |
指令 | server_names_hash_bucket_size |
作用域 | http、server、location |
默认值 | - |
指令说明 | 主机名哈希桶的默认值与CPU缓存行的大小一致,有32、64、128字节的3个值,该值也适用于增加主机名的存储空间 |
#配置样例如下:
http {
server_names_hash_bucket_size 128;
}
1.1.12 变量哈希表最大值指令
名称 | 变量哈希表最大值指令 |
指令 | variables_hash_max_size |
作用域 | http |
默认值 | 512 |
指令说明 | nginx变量哈希表的最大存储大小 |
#配置样例如下:
http {
variables_hash_max_size 1024;
}
1.1.13 变量哈希桶最大值指令
名称 | 变量哈希桶最大值指令 |
指令 | variables_hash_bucket_size |
作用域 | http |
默认值 | 64 |
指令说明 | nginx变量哈希桶的最大存储大小 |
#配置样例如下:
http {
variables_hash_bucket_size 128;
}
1.2 HTTP请求处理
标准的HTTP请求从开始到结束包括请求报文和响 应报文。 请求报文是客户端向服务端发起请求时告知服务 端请求的方式、相关属性和请求内容的数据包,由请 求行、请求头、请求体组成。
HTTP响应状态码是响应报文中对HTTP请求处理结 果的重要标识,响应状态码是由RFC 2616规范定义 的,并由互联网号码分配局(Internet Assigned Numbers Authority)维护,状态码可以分为以下5个 类别。 ·
1××(消息):表示服务端已经接收到请求, 正在进行处理
2××(处理成功):表示服务端已经正确处理 完客户端的HTTP请求
3××(重定向):服务端接收到HTTP请求,并 将其HTTP请求重定向到客户本地或其他服务器进行处 理
4××(客户端请求有误):客户端提交的请求 不符合规范或未被授权、禁止访问等
5××(服务端处理出错):服务端无法正常完 成请求操作,如超时等
当Nginx接收HTTP请求后,处理相关的配置指令如下表
1.2.1 忽略请求头无效属性指令
名称 | 忽略请求头无效属性指令 |
指令 | ignore_invalid_headers |
作用域 | http、server |
默认值 | on |
指令值选项 | on或off |
指令说明 | 忽略请求头中的无效属性字段,请求头属性字段中,属性名称默认为英文字符、数字和连接符组成,不符合此标准的属性名均为无效属性名。当指令值为on时,不对无效的属性名称进行过滤 |
#配置样例如下:
http {
ignore_invalid_headers off;
}
1.2.2 请求头中下划线连接属性名指令
名称 | 请求头中下划线连接属性名指令 |
指令 | underscores_in_headers |
作用域 | http、server |
默认值 | off |
指令值选项 | on或off |
指令说明 | 请求头中属性名称的定义中"_"是无效连接符,启用该指令后,"_"将被认为是有效的连接符。如果该指令值为off,则按照ignore_invalid_headers指令的配置进行处理 |
#配置样例如下:
http {
underscores_in_headers on;
}
1.2.3 请求头缓冲区大小指令
名称 | 请求头缓冲区大小指令 |
指令 | client_header_buffer_size |
作用域 | http、server |
默认值 | 1k |
指令说明 | 设置存放读取客户端请求头的缓冲区的大小,默认值为1K,当请求头的数据因cookie过长等其他原因超过所设定的大小时,会按照large_client_header_buffers的指令配置进行处理 |
#配置样例如下:
http {
client_header_buffer_size 2k;
}
1.2.4 超大请求头缓冲区大小指令
名称 | 超大请求头缓冲区大小指令 |
指令 | large_client_header_buffers |
作用域 | http、server |
默认值 | 4 8k |
指令说明 | 当客户请求头的大小超过client_header_buffer_size指令设置的值时,会将超出的部分转移到该缓冲区中。在默认配置下,超大请求头第一次可以分配到一个8KB的缓冲区块,请求行的大小不能超过该缓冲区的大小,否则将返回414错误。超出8KB的请求头会被循环转移到新的缓冲区块中,最多转移4次,当超过该值时,则会返回400错误 |
#配置样例如下:
http {
large_client_header_buffers 10 8k;
}
1.2.5 请求头超时指令
名称 | 请求头超时指令 |
指令 | client_header_timeout |
作用域 | http、server |
默认值 | 60s |
指令说明 | 读取客户端请求头的最大超时时间 |
#配置样例如下:
http {
client_header_timeout 180s;
}
1.2.6 请求头内存池大小指令
名称 | 请求头内存池大小指令 |
指令 | request_pool_size |
作用域 | http、server |
默认值 | 4k |
指令说明 | nginx开始处理请求时,会为每个请求分配一个4KB大小的内存池,以减少内核对小块内存的分配次数。HTTP请求结束后会回收为其分配的内存池 |
#配置样例如下:
http {
request_pool_size 4k;
}
官方文档中提到,请求头内存池大小指令对性能 的提升作用很小,不建议调整。
1.2.7 请求体大小指令
名称 | 请求体大小指令 |
指令 | client_max_body_size |
作用域 | http、server、location |
默认值 | 1m |
指令说明 | HTTP请求时,请求体的最大值。当请求头中属性Content-Length的大小超过指令配置时,返回状态码408 |
#配置样例如下:
http {
client_max_body_size 100m;
}
当指令值为0时,表示没有限制。
1.2.8 请求体缓冲区大小指令
名称 | 请求体缓冲区大小指令 |
指令 | client_body_buffer_size |
作用域 | http、server、location |
默认值 | - |
指令说明 | 设置读取客户端请求体的缓冲区大小,当请求体的大小超过该设定值后,会按照client_body_in_single_buffer指令的配置选择部分或全部写入client_body_temp_path指令设定的文件中。默认配置下,32位系统下的缓冲区大小时8KB,64位系统下的缓冲区大小为16KB |
#配置样例如下:
http {
request_pool_size 4k;
}
1.2.9 请求体写入缓冲区指令
名称 | 请求体写入缓冲区指令 |
指令 | client_body_in_single_buffer |
作用域 | http、server、location |
默认值 | off |
指令说明 | 将完整的请求体存储在单个缓冲区中。当缓冲区大小不足时,会完整的写入client_body_temp_path指令设定的文件中。推荐在使用变量$request_body时启用该指令 |
#配置样例如下:
http {
request_pool_size 4k;
}
1.2.10 请求体写入文件指令
名称 | 请求体写入文件指令 |
指令 | client_body_in_file_only |
作用域 | http、server、location |
默认值 | off |
指令值选项 | off或clean或on |
指令说明 | 默认情况下是优先使用缓存,在请求体超出请求体缓冲区的大小时在写入文件。启用该指令后将禁用缓冲区,请求体会被直接写入client_body_temp_path指令设定的文件中。 |
#配置样例如下:
http {
client_body_in_file_only on;
}
指令值为on时,HTTP请求结束后临时文件会被保 留。指令值为clean时,HTTP请求结束后临时文件会被 删除
1.2.11 请求体临时文件目录指令
名称 | 请求体临时文件目录指令 |
指令 | client_body_temp_path |
作用域 | http、server、location |
默认值 | client_body_temp_path client_body_temp |
指令说明 | 请求体别写入文件的临时目录 |
#配置样例如下:
http {
client_body_temp_path /tmp/nginx/client_temp 1 2;
}
默认值是在编译时由configure的配置参数-- http-proxy-temp-path决定的,没有参数指定时为 Nginx安装目录的client_body_temp文件夹。
1.2.12 请求体超时指令
名称 | 请求体临时文件目录指令 |
指令 | client_body_timeout |
作用域 | http、server、location |
默认值 | 60s |
指令说明 | 当HTTP请求建立连接后,客户端在超过设定时间后仍未发送请求体内容到服务器,则nginx认为请求体超时,将返回响应状态码408 |
#配置样例如下:
http {
client_body_timeout 120s;
}
1.2.13 文件修改判断指令
名称 | 文件修改判断指令 |
指令 | if_modified_since |
作用域 | http、server、location |
默认值 | exact |
指令值选项 | off或exact或before |
指令说明 | 在请求头中存在属性if_modified_since时,关闭或设置客户端缓存文件修改时间额服务端校验功能 |
#配置样例如下:
http {
if_modified_since before;
}
当指令值为off时,忽略请求头中 if_modified_since属性的处理,关闭Nginx的服务端 校验功能;当指令值为exact时,与被请求文件的修改 时间做精确匹配,即完全相等则认为客户端缓存有 效,返回响应状态码304;当指令值为before时,被请 求文件的修改时间小于if_modified_since属性字段中 设定的时间,认为客户端缓存有效,返回响应状态码 304。
1.2.14 实体标签指令
名称 | 实体标签指令 |
指令 | etag |
作用域 | http、server、location |
默认值 | on |
指令值选项 | on或off |
指令说明 | etag(Entity Tag),用于在响应头中返回文件实体标签,与同一文件的下一次请求头中If-None-Match属性值组合检查文件是否被修改,未修改则返回响应状态码304,否则返回最新的文件内容 |
#配置样例如下:
http {
etag off;
}
1.2.15 范围请求的最大值指令
名称 | 范围请求的最大值指令 |
指令 | max_ranges |
作用域 | http、server、location |
默认值 | - |
指令说明 | 默认为不限制大小,当客户端以byte_range方式获取数据请求时,该指令限定了允许的最大值。当指令值为0时,则关闭以byte_range方式获取数据的功能 |
#配置样例如下:
http {
max_ranges 1024 ;
}
可在断点续传等场景中使用范围请求的最大值指 令。
1.2.16 文件类型指令集
名称 | 文件类型指令集 |
指令 | types |
作用域 | http、server、location |
默认值 | - |
指令说明 | 被请求文件扩展名与MIME类型映射表 |
#配置样例如下:
http {
application/octet-stream yaml;
}
将匹配路径的所有文件指定为MIME类型,配置样 例如下:
#配置样例如下:
location /download/ {
types { }
default_type application/octet-stream;
}
1.2.17 文件类型哈希表大小指令
名称 | 文件类型哈希表大小指令 |
指令 | types_hash_max_size |
作用域 | http、server、location |
默认值 | 1024 |
指令说明 | 设定MIME类型哈希表的大小 |
#配置样例如下:
http {
types_hash_max_size 2048;
}
1.2.18 文件类型哈希桶大小指令
名称 | 文件类型哈希桶大小指令 |
指令 | types_hash_bucket_size |
作用域 | http、server、location |
默认值 | - |
指令说明 | 设定MIME类型哈希桶的大小,默认值与CPU缓存行的大小一致,有32、64、128字节三个值 |
#配置样例如下:
http {
types_hash_bucket_size 64;
}
1.2.19 错误跳转指令
名称 | 错误跳转指令 |
指令 | error_page |
作用域 | http、server、location |
默认值 | - |
指令说明 | 当HTTP请求发生错误时,可以根据响应状态码定义一个返回的页面或者执行跳转 |
#配置样例如下:
http {
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
}
可设定为一个location内部访问
#配置样例如下:
http {
error_page 404 = @fallback;
location @fallback {
proxy_pass http://backend;
}
}
响应状态码可通过“=response”语法进行修改
#配置样例如下:
http {
error_page 404 =200 /empty.gif;
}
1.2.20 多级错误跳转指令
名称 | 多级错误跳转指令 |
指令 | recursive_error_pages |
作用域 | http、server、location |
默认值 | off |
指令值选项 | off或on |
指令说明 | 当使用error_page设定多层内部访问时,仍可处理上一层级返回的响应状态码 |
#配置样例如下:
http {
proxy_intercept_errors on; # 当上游服务器返回非200状态码时,返回代理服务器处理
recursive_error_pages on; # 启用多级错误跳转功能
location / {
error_page 404 = @fallback; # 当前URL请求为404时执行内部请求@fallback
}
location @fallback {
proxy_pass http://backend; # 当前所有请求代理到上游服务器backend
error_page 502 = @upfallback; # 当上游服务器返回502状态码时,执行内部请求@upfallback
}
location @upfallback {
proxy_pass http://newbackend; # 当前的所有请求代理到上游服务器newbackend
}
}
上述配置样例中,如果recursive_error_pages指 令值为off,Nginx只会处理一次error_page 404。当 指令值为on,且upstream返回状态码为502时,才会调 用upfallback的内部访问。
1.2.21 响应服务版本号指令
名称 | 响应服务版本号指令 |
指令 | server_tokens |
作用域 | http、server、location |
默认值 | on |
指令值选项 | on或off |
指令说明 | 默认在错误信息响应头中增加属性字段“Server”以标识nginx的版本号 |
#配置样例如下:
http {
server_tokens off;
}
1.2.22 msie响应注释指令
名称 | msie响应注释指令 |
指令 | msie_padding |
作用域 | http、server、location |
默认值 | on |
指令值选项 | on或off |
指令说明 | 在响应状态大于或等于400时,会在响应报文中添加注释,使响应报文大小达到512字节。仅使用于msie客户端 |
#配置样例如下:
http {
msie_padding off;
}
代码中显示该指令配置也支持Chrome客户端。
1.3 访问路由location
URI,即统一标识资源符,通用的URI语法格式如下:
scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
在Nginx的应用场景中,URL与URI并无明确区别。
scheme是URI请求时遵守的协议,常见的有 HTTP、HTTPS、FTP。
host[:port]是主机名与端口号,HTTP协议的默 认端口是80,HTTPS协议的默认端口是443。
[/path]是访问路径与访问文件名。
[?query]是访问参数,访问参数以“?”开始作 标识,由多个以“&”连接的key=value形式的字符串 组成。
1.3.1 URI匹配规则
location是Nginx对HTTP请求中的URI进行匹配处理的指令,location的语法形式如下:
location [=|~|~*|^~|@] pattern { ... }
其中, “[=|~*|^~|@]”部分称为location修饰语 (Modifier),修饰语定义了与URI的匹配方式。 pattern为匹配项,可以是字符串或正则表达式
无修饰语:完全匹配URI中除访问参数以外的内 容,匹配项的内容只能是字符串,不能是正则表达式。
location /images {
root /data/web;
}
修饰语“=” :完全匹配URI中除访问参数以外的 内容,Linux系统下会区分大小写,Windows系统下则不会
location = /images {
root /data/web;
}
修饰语“~” :完全匹配URI中除访问参数以外的 内容,Linux系统下会区分大小写,Windows系统下则 会无效。匹配项的内容必须是正则表达式
location ~ /images/.*\.(gif|jpg|png)$ {
root /data/web;
}
修饰语“~*” :完全匹配URI中除访问参数以外的 内容,不区分大小写。匹配项的内容必须是正则表达式
location ~* \.(gif|jpg|png)$ {
root /data/web;
}
修饰语“^~” :完全匹配URI中除访问参数以外的 内容,匹配项的内容如果不是正则表达式,则不再进 行正则表达式测试。
location ^~ /images {
root /data/web;
}
修饰语“@” :定义一个只能内部访问的location 区域,可以被其他内部跳转指令使用,如try_files或 error_page。
location @images {
proxy_pass http://images;
}
1.2.2 匹配顺序
1)先检测匹配项的内容为非正则表达式修饰语的 location,然后再检测匹配项的内容为正则表达式修 饰语的location。
2)匹配项的内容为正则与非正则都匹配的 location,按照匹配项的内容为正则匹配的location 执行。
3)所有匹配项的内容均为非正则表达式的 location,按照匹配项的内容完全匹配的内容长短进 行匹配,即匹配内容多的location被执行。
4)所有匹配项的内容均为正则表达式的 location,按照书写的先后顺序进行匹配,匹配后就 执行,不再做后续检测。
注:当location为正则匹配且内部有proxy_pass指令 时,proxy_pass的指令值中不能包含无变量的字符 串。修饰语“^~”不受该规则限制
location ~ /images {
proxy_pass http://127.0.0.1:8080;# 正确的指令值
proxy_pass http://127.0.0.1:8080$request_uri; # 正确的指令值
proxy_pass http://127.0.0.1:8080/image$request_uri; # 正确的指令值
proxy_pass http://127.0.0.1:8080/;# 错误的指令值
}
1.2.3 访问路由指令
1.2.3.1 合并空斜线指令
名称 | 合并空斜线指令 |
指令 | merge_slashes |
作用域 | http、server、location |
默认值 | on |
指令值选项 | on或off |
指令说明 | 当指令值为on,在访问路径中相邻斜线内容为空时进行合并 |
#配置样例如下:
http {
merge_slashes off;
}
1.2.3.2 跳转主机名指令
名称 | 跳转主机名指令 |
指令 | server_name_in_redirect |
作用域 | http、server、location |
默认值 | off |
指令说明 | 默认情况下,nginx重定向时,会用当前server指令域中主机的IP与path拼接成完整的URL进行重定向。开启参数后,nginx会先查看当前指令域中server_name的第一个主机名,如果没有,则会查找请求头中host字段的内容,如果再没有会用IP与path进行拼接 |
#配置样例如下:
http {
server_name_in_redirect on;
}
1.2.3.3 跳转端口指令
名称 | 跳转端口指令 |
指令 | port_in_redirect |
作用域 | http、server、location |
默认值 | on |
指令说明 | nginx重定向时,会用当前server指令域的监听端口与主机拼接成完整的URL进行重定向。当指令为off时,则默认用80端口。 |
#配置样例如下:
http {
port_in_redirect on;
}
1.2.3.4 子请求输出缓冲区大小指令
名称 | 子请求输出缓冲区大小指令 |
指令 | subrequest_output_buffer_size |
作用域 | http、server、location |
默认值 | 4k或8k |
指令说明 | 设置用于存储子请求响应报文的缓冲区大小,默认值与操作系统的内存页大小一致 |
#配置样例如下:
http {
subrequest_output_buffer_size 64K;
}
1.2.3.5 绝对跳转指令
名称 | 绝对跳转指令 |
指令 | absolute_redirect |
作用域 | http、server、location |
默认值 | on |
指令值选项 | off或on |
指令说明 | nginx发起的重定向使用绝对路径做跳转,即用主机名和端口及访问路径的方式,如果关闭的话,则跳转为默认相对当前请求的主机名和端口的访问路径 |
#配置样例如下:
http {
absolute_redirect off;
}
1.2.3.6 响应刷新指令
名称 | 响应刷新指令 |
指令 | absolute_redirect |
作用域 | http、server、location |
默认值 | on |
指令值选项 | off或on |
指令说明 | nginx发起的重定向使用绝对路径做跳转,即用主机名和端口及访问路径的方式,如果关闭的话,则跳转为默认相对当前请求的主机名和端口的访问路径 |
#配置样例如下:
http {
msie_refresh off;
}
1.4 访问重写rewrite
访问重写rewrite是Nginx HTTP请求处理过程中的 一个重要功能,它是以模块的形式存在于代码中的, 其功能是对用户请求的URI进行PCRE正则重写,然后返 回30×重定向跳转或按条件执行相关配置。rewrite模 块内置了类似脚本语言的set、if、break、return配 置指令,通过这些指令,用户可以在HTTP请求处理过 程中对URI进行更灵活的操作控制。rewrite模块提供 的指令可以分两类,一类是标准配置指令,这部分指 令只是对指定的操作进行相应的操作控制;另一类是 脚本指令,这部分指令可以在HTTP指令域内以类似脚 本编程的形式进行编写。
1.4.1 rewrite日志记录指令
名称 | rewrite日志记录指令 |
指令 | rewrite_log |
作用域 | http、server、location |
默认值 | off |
指令值选项 | on或off |
指令说明 | 当指令为on时,rewrite的执行结果会以notice级别记录到nginx的error日志文件中 |
#配置样例如下:
http {
rewrite_log off;
}
1.4.2 未初始化变量告警日志记录指令
名称 | 未初始化变量告警日志记录指令 |
指令 | uninitialized_variable_warn |
作用域 | http、server、location |
默认值 | off |
指令值选项 | on或off |
指令说明 | 当指令为on时,会将未初始化的变量告警记录到日志中 |
#配置样例如下:
http {
uninitialized_variable_warn off;
}
1.4.3 rewrite指令
名称 | rewrite指令 |
指令 | rewrite |
作用域 | server、location |
默认值 | on |
指令值选项 | on或off |
指令说明 | 对用户的URI用正则表达式的方式进行重写,并跳转到新的URI |
#配置样例如下:
http {
rewrite ^/users/(.*)$ /show?user=$1 last;
}