HTTP 模块#
核心 HTTP 模块实现了 HTTP 服务器的基本功能,包括定义服务器块、配置用于请求路由的位置、提供静态文件和控制访问、配置重定向、支持 keep-alive 连接以及管理请求和响应头。
本节中的其他模块扩展了此功能,使您能够灵活配置和优化 HTTP 服务器,以满足各种场景和需求。
指令#
absolute_redirect#
如果禁用,Angie 发出的重定向将是相对的。
另请参见 server_name_in_redirect 和 port_in_redirect 指令。
aio#
启用或禁用在 FreeBSD 和 Linux 上使用异步文件 I/O (AIO):
location /video/ {
aio on;
output_buffers 1 64k;
}
在 FreeBSD 上,从 FreeBSD 4.3 开始可以使用 AIO。在 FreeBSD 11.0 之前,AIO 可以静态链接到内核中:
options VFS_AIO
或作为可加载内核模块动态加载:
kldload aio
在 Linux 上,从内核版本 2.6.22 开始可以使用 AIO。此外,有必要启用 directio,否则读取将是阻塞的:
location /video/ {
aio on;
directio 512;
output_buffers 1 128k;
}
在 Linux 上,directio 只能用于读取 512 字节边界(或 XFS 的 4K)对齐的块。文件未对齐的结尾以阻塞模式读取。对文件开头和结尾未对齐数据的字节范围请求和 FLV 请求也是如此:文件开头和结尾的未对齐数据读取将是阻塞的。
当在 Linux 上同时启用 AIO 和 sendfile 时,AIO 用于大于或等于 directio 指令中指定大小的文件,而 sendfile 用于较小尺寸的文件或禁用 directio 时:
location /video/ {
sendfile on;
aio on;
directio 8m;
}
最后,可以通过多线程读取和 发送 文件,而不阻塞工作进程:
location /video/ {
sendfile on;
aio threads;
}
读取和发送文件操作被卸载到指定 pool 的线程中。如果省略了 pool 名称,则使用名称为“default”的池。池名称也可以用变量设置:
aio threads=pool$disk;
默认情况下,多线程是禁用的,需要使用 --with-threads 配置参数启用。目前,多线程仅与 epoll、kqueue 和 eventport 方法兼容。多线程文件发送仅在 Linux 上受支持。
另请参见 sendfile 指令。
aio_write#
如果启用了 aio,请指定是否用于写入文件。目前,这仅在使用 aio threads 时有效,并且仅限于写入从代理服务器接收到的数据的临时文件。
alias#
定义指定位置的替代。例如,使用以下配置:
location /i/ {
alias /data/w3/images/;
}
在请求 /i/top.gif
时,将发送文件 /data/w3/images/top.gif。
path 值可以包含变量,除了 $document_root 和 $realpath_root。
如果在使用正则表达式定义的 location 中使用 alias,则此类正则表达式应包含捕获,并且 alias 应引用这些捕获,例如:
location ~ ^/users/(.+\.(?:gif|jpe?g|png))$ {
alias /data/w3/images/$1;
}
当位置匹配指令值的最后部分时:
location /images/ {
alias /data/w3/images/;
}
最好使用 root 指令代替:
location /images/ {
root /data/w3;
}
auth_delay#
auto_redirect#
该指令控制前缀位置以斜杠结束时的 重定向 行为:
location /prefix/ {
auto_redirect on;
}
在此,请求 /prefix
会导致重定向到 /prefix/
。
将此设置为 on
和 off
可以显式启用和禁用重定向。设置为 default
时,只有在 location
处理带有 api、proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pass 或 grpc_pass 的请求时,才启用重定向。
chunked_transfer_encoding#
允许在 HTTP/1.1 中禁用分块传输编码。当使用不支持分块编码的软件时,这可能会派上用场,尽管标准要求支持。
client_body_buffer_size#
设置用于读取客户端请求体的缓冲区大小。如果请求体大于缓冲区,则整个请求体或其一部分将写入 临时文件。默认情况下,缓冲区大小等于两个内存页。在 x86 和其他 32 位平台以及 x86-64 上为 8K。在其他 64 位平台上通常为 16K。
client_body_in_file_only#
|
|
默认值 |
|
http, server, location |
确定 Angie 是否应将整个客户端请求体保存到文件中。此指令可在调试期间使用,或在使用 $request_body_file 变量或模块 Perl 的 $r->request_body_file 方法时使用。
当设置为 on 时,请求处理后不会删除临时文件。
|
请求处理后不会删除临时文件 |
|
将导致请求处理后留下的临时文件被删除 |
client_body_in_single_buffer#
|
|
默认值 |
|
http, server, location |
确定 Angie 是否应将整个客户端请求体保存在单个缓冲区中。推荐在使用 $request_body 变量时使用此指令,以减少涉及的复制操作数量。
client_body_temp_path#
|
|
默认值 |
|
http, server, location |
定义用于存储持有客户端请求体的临时文件的目录。可以在指定目录下使用最多三级子目录层次结构。例如,在以下配置中
client_body_temp_path /spool/angie/client_temp 1 2;
临时文件的路径可能如下所示:
/spool/angie/client_temp/7/45/00000123457
client_body_timeout#
定义读取客户端请求体的超时时间。超时时间仅设置为两次连续读操作之间的时间段,而不是整个请求体的传输时间。如果客户端在此时间内未传输任何内容,则请求将以 408(请求超时)错误终止。
client_header_buffer_size#
设置用于读取客户端请求头的缓冲区大小。对于大多数请求,1K 字节的缓冲区就足够了。然而,如果请求包含很长的 cookies,或者来自 WAP 客户端,可能无法适应 1K 的缓冲区。如果请求行或请求头字段不适合这个缓冲区,将分配由 large_client_header_buffers 指令配置的更大缓冲区。
client_header_timeout#
定义读取客户端请求头的超时时间。如果客户端在此时间内未传输完整的请求头,则请求终止并返回 408(请求超时)错误。
client_max_body_size#
设置客户端请求体的最大允许大小。如果请求的大小超过配置的值,将返回 413(请求实体过大)错误给客户端。请注意,浏览器无法正确显示此错误。
|
禁用对客户端请求体大小的检查 |
connection_pool_size#
允许精确调整每个连接的内存分配。此指令对性能影响最小,通常不应使用。
默认值:
|
32 位平台 |
|
64 位平台 |
default_type#
定义响应的默认 MIME 类型。文件名扩展名到 MIME 类型的映射可以通过 types 指令设置。
directio#
在读取大于或等于指定大小的文件时,启用使用 O_DIRECT 标志(FreeBSD, Linux)、F_NOCACHE 标志(macOS)或 directio() 函数(Solaris)。该指令会自动禁用给定请求的 sendfile 使用。它对于服务大文件很有用:
directio 4m;
或者在 Linux 上使用 aio 时。
directio_alignment#
设置 directio 的对齐。在大多数情况下,512 字节的对齐就足够了。然而,在 Linux 下使用 XFS 时,需要增加到 4K。
disable_symlinks#
|
|
默认值 |
|
http, server, location |
确定打开文件时符号链接的处理方式:
|
路径名中的符号链接是允许的且不检查。这是默认行为。 |
|
如果路径名的任何组件是符号链接,则拒绝对文件的访问。 |
|
如果路径名的任何组件是符号链接,并且链接和链接指向的对象有不同的所有者,则拒绝对文件的访问。 |
|
在检查符号链接时(参数 |
示例:
disable_symlinks on from=$document_root;
此指令仅在具有 openat()
和 fstatat()
接口的系统上可用。此类系统包括现代版本的FreeBSD、Linux和Solaris。
警告
参数 on
和 if_not_owner
会增加处理开销。
在不支持仅用于搜索打开目录的系统上,使用这些参数需要工作进程对所有被检查的目录具有读取权限。
error_page#
定义将在指定错误时显示的URI uri 值可以包含变量。
示例:
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
这会将请求方法更改为"GET"(除"GET"和"HEAD"以外的所有方法),并内部重定向到指定的 uri。
此外,可以使用`=response`语法更改响应代码,例如:
error_page 404 =200 /empty.gif;
如果错误响应由代理服务器或FastCGI/uwsgi/SCGI/gRPC服务器处理,并且服务器可能返回不同的响应代码(例如200、302、401或404),可以响应其返回的代码:
error_page 404 = /404.php;
如果在内部重定向期间不需要更改URI和方法,可以将错误处理传递到命名位置:
location / {
error_page 404 = @fallback;
}
location @fallback {
proxy_pass http://backend;
}
备注
如果uri处理导致错误,最后发生的错误的状态代码将返回给客户端。
还可以使用URL重定向进行错误处理:
error_page 403 http://example.com/forbidden.html;
error_page 404 =301 http://example.com/notfound.html;
在这种情况下,默认情况下,响应代码302返回给客户端。它只能更改为重定向状态代码之一(301、302、303、307和308)。
etag#
启用或禁用静态资源“ETag”响应头字段的自动生成。
http#
提供指定HTTP服务器指令的配置文件上下文。
if_modified_since#
指定如何将响应的修改时间与`If-Modified-Since`请求头字段中的时间进行比较:
|
响应始终被视为已修改 |
|
精确匹配 |
|
响应的修改时间小于或等于`If-Modified-Since`请求头字段中的时间。 |
ignore_invalid_headers#
控制是否应忽略具有无效名称的头字段。有效名称由英文字母、数字、连字符和可能的下划线组成(由 underscores_in_headers 指令控制)。
如果在 server 级别指定了该指令,则可以使用默认服务器的值。
internal#
指定给定位置只能用于内部请求。对于外部请求,返回客户端错误404(未找到)。内部请求包括以下内容:
由 error_page、index、random_index 和 try_files 指令重定向的请求;
由上游服务器的 X-Accel-Redirect 响应头字段重定向的请求;
由 http_ssi 模块的`include virtual`命令、http_addition 模块指令以及 auth_request 和 mirror 指令形成的子请求;
由 rewrite 指令更改的请求。
示例:
error_page 404 /404.html;
location = /404.html {
internal;
}
备注
每个请求的内部重定向限制为10次,以防止在不正确配置中可能发生的请求处理循环。如果达到此限制,则返回错误500(内部服务器错误)。在这种情况下,错误日志中可能会看到 rewrite或内部重定向循环 消息。
keepalive_disable#
禁用与行为不当的浏览器的keep-alive连接。browser 参数指定将影响哪些浏览器。
|
允许与所有浏览器的keep-alive连接 |
|
在接收到POST请求后,禁用与旧版MSIE的keep-alive连接 |
|
禁用与macOS及类似操作系统上的Safari及类似浏览器的keep-alive连接 |
keepalive_requests#
设置可以通过一个keep-alive连接服务的最大请求数。在达到最大请求数后,连接将关闭。
定期关闭连接是必要的,以便释放每个连接的内存分配。因此,使用过高的最大请求数可能导致内存使用过多,不推荐这样做。
keepalive_time#
限制通过一个keep-alive连接处理请求的最长时间。达到此时间后,在后续请求处理后关闭连接。
keepalive_timeout#
|
|
默认值 |
|
http, server, location |
|
设置一个超时时间,在此期间keep-alive客户端连接将在服务器端保持打开状态 |
|
禁用keep-alive客户端连接 |
可选 的第二个参数在“Keep-Alive: timeout=time”响应头字段中设置一个值。两个参数可以不同。
“Keep-Alive: timeout=time”头字段被Mozilla和Konqueror识别。MSIE会在大约60秒内自行关闭keep-alive连接。
large_client_header_buffers#
设置用于读取大客户端请求头的缓冲区的最大数量和大小。请求行不能超过一个缓冲区的大小,否则将返回414(请求URI太大)错误给客户端。请求头字段也不能超过一个缓冲区的大小,否则将返回400(错误请求)错误给客户端。缓冲区仅在需要时分配。默认情况下,缓冲区大小等于8K字节。如果在请求处理结束后连接转入keep-alive状态,这些缓冲区将被释放。
如果指令在 server 级别指定,则可以使用默认服务器的值。
limit_except#
限制在某个位置内允许的HTTP方法。 method 可以是以下之一:GET
, HEAD
, POST
, PUT
, DELETE
, MKCOL
, COPY
, MOVE
, OPTIONS
, PROPFIND
, PROPPATCH
, LOCK
, UNLOCK
或 PATCH
。允许 GET
方法也启用 HEAD
方法。可以使用 访问控制 和 基础认证 模块中的指令限制对其他方法的访问:
limit_except GET {
allow 192.168.1.0/32;
deny all;
}
备注
此示例将限制对所有方法的访问,
除了 GET
和 HEAD
。
limit_rate#
限制向客户端传输响应的速率。速率以每秒字节数指定。零值禁用速率限制。限制是针对每个请求设置的,因此如果客户端同时打开两个连接,总速率将是指定限制的两倍。
参数值可以包含变量。在某些情况下需要根据特定条件限制速率时可能有用:
map $slow $rate {
1 4k;
2 8k;
}
limit_rate $rate;
也可以在 $limit_rate 变量中设置速率限制,但不推荐使用此方法:
server {
if ($slow) {
set $limit_rate 4k;
}
}
速率限制也可以在代理服务器响应的“X-Accel-Limit-Rate”头字段中设置。可以使用 proxy_ignore_headers, fastcgi_ignore_headers, uwsgi_ignore_headers 和 scgi_ignore_headers 指令禁用此功能。
limit_rate_after#
设置初始量,超过此量后将限制向客户端传输响应的速率。参数值可以包含变量。
示例:
location /flv/ {
flv;
limit_rate_after 500k;
limit_rate 50k;
}
lingering_close#
控制Angie如何关闭客户端连接。
|
指示Angie 等待 并 处理 来自客户端的额外数据,然后再完全关闭连接,但仅在启发式方法建议客户端可能正在发送更多数据时。 |
|
将导致Angie无条件地等待和处理客户端的额外数据。 |
|
告诉Angie不要等待更多数据,并立即关闭连接。这种行为会破坏协议,不应在正常情况下使用。 |
要控制关闭HTTP/2连接,必须在 server 级别指定指令。
lingering_time#
当 lingering_close 生效时,此指令指定Angie将处理(读取并忽略)来自客户端的额外数据的最长时间。之后,即使有更多数据,连接也将关闭。
lingering_timeout#
当 lingering_close 生效时,此指令指定等待更多客户端数据到达的最长时间。如果在此时间内没有收到数据,连接将关闭。否则,数据将被读取并忽略,Angie将开始等待更多数据。该“等待-读取-忽略”循环会重复,但不会超过 lingering_time 指令指定的时间。
listen#
|
|
默认值 |
|
server |
设置用于监听套接字的 address 和 port,或服务器将接受请求的UNIX域套接字的路径。可以同时指定 address 和 port,或者只指定 address 或只指定 port。 address 也可以是主机名,例如:
listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;
IPv6地址在方括号中指定:
listen [::]:8000;
listen [::1];
UNIX域套接字使用 unix:
前缀指定:
listen unix:/var/run/angie.sock;
如果仅给出`address`,则使用端口`80`。
如果指令不存在,则如果Angie以超用户权限运行,则使用`*:80`,否则使用`*:8000`。
|
指定此参数的服务器将成为给定 address:port 对的默认服务器(两者共同形成一个 监听套接字)。 如果没有带有 |
|
允许指定在此端口接受的所有连接都应以 SSL 模式工作。这使得处理 HTTP 和 HTTPS 请求的服务器配置更为 紧凑。 |
|
配置端口以接受 HTTP/2 连接。通常,为了使其工作还应指定 ssl 参数,但 Angie 也可以配置为在没有 SSL 的情况下接受 HTTP/2 连接。 自 1.2.0 版本弃用. 请使用 http2 指令。 |
|
配置端口以接受 QUIC 连接。要使用此选项,必须启用并配置 Angie 的 HTTP3 模块。设置 |
|
允许指定在此端口接受的所有连接应使用 PROXY 协议。 |
listen 指令可以有几个特定于套接字相关系统调用的附加参数。这些参数可以在任何 listen 指令中指定,但对于给定的 address:port 对只能指定一次。
|
此参数为监听套接字设置相关的路由表,FIB(SO_SETFIB 选项)。目前仅在 FreeBSD 上有效。 |
|
为监听套接字启用 "TCP Fast Open" 并限制尚未完成三次握手的连接队列的最大长度。 |
小心
除非服务器能够处理多次接收相同的数据 SYN 包,否则不要启用此功能。
|
设置 |
|
为监听套接字设置接收缓冲区大小( |
|
为监听套接字设置发送缓冲区大小( |
|
设置监听套接字的接受过滤器名称( |
|
指示在 Linux 上使用延迟的 |
|
指示为给定的 address:port 对进行单独的 |
|
此参数通过 |
|
此参数指示为每个工作进程创建一个单独的监听套接字(在 Linux 3.9+ 和 DragonFly BSD 上使用 |
小心
不当使用此选项可能会带来安全隐患。
so_keepalive=on
| off
| [keepidle]:[keepintvl]:[keepcnt]
配置监听套接字的 "TCP keepalive" 行为。
|
如果省略此参数,则套接字将默认使用操作系统的设置 |
|
为套接字开启 |
|
为套接字关闭 |
某些操作系统支持使用 TCP_KEEPIDLE
、TCP_KEEPINTVL
和 TCP_KEEPCNT
套接字选项按每个套接字设置 TCP keepalive 参数。在这些系统上(目前为 Linux 2.4+、NetBSD 5+ 和 FreeBSD 9.0-STABLE),可以使用 keepidle
、keepintvl
和 keepcnt
参数进行配置。可以省略一个或两个参数,在这种情况下,将使用对应套接字选项的系统默认设置。例如,
so_keepalive=30m::10
将空闲超时(TCP_KEEPIDLE)设置为 30 分钟,探测间隔(TCP_KEEPINTVL)保持系统默认,探测次数(TCP_KEEPCNT)设置为 10 次。
示例:
listen 127.0.0.1 default_server accept_filter=dataready backlog=1024;
location#
设置配置,具体取决于请求 URI 是否匹配任何匹配表达式。
匹配是针对规范化的 URI 进行的,解码 "%XX" 形式编码的文本,解析对相对路径组件 "." 和 ".." 的引用,以及可能的 压缩 两个或多个相邻斜杠为单个斜杠。
location 可以由前缀字符串或正则表达式定义。
正则表达式是通过前缀修饰符指定的:
|
不区分大小写匹配 |
|
区分大小写匹配 |
为了找到匹配请求的 location,Angie 首先检查用前缀字符串定义的 locations(称为前缀 locations)。在它们中,选择匹配前缀最长的 location 并暂时存储。
备注
对于像 macOS 这样的不区分大小写的操作系统,前缀字符串匹配是不区分大小写的。 然而,匹配仅限于单字节区域。
然后,按它们在配置文件中的出现顺序评估基于正则表达式的 locations。它们的评估在第一次匹配时停止,并使用相应的配置。 如果未找到匹配的正则表达式 location,Angie 使用暂时存储的前缀 location 的配置。
除下述例外,location 块可以嵌套。
正则表达式 locations 可以定义捕获组,稍后可以与其他指令一起使用。
如果匹配的前缀 location 使用了 ^~ 修饰符,则不检查正则表达式 locations。
此外,= 修饰符为 location 启用精确 URI 匹配模式;如果找到精确匹配,则查找停止。例如,如果 / 请求频繁,则定义 location =/
会加速其处理,因为查找在精确匹配处停止。显然,这样的 locations 不能包含嵌套的 locations。
示例:
location =/ {
#配置 A
}
location / {
#配置 B
}
location /documents/ {
#配置 C
}
location ^~/images/ {
#配置 D
}
location ~*\.(gif|jpg|jpeg)$ {
#配置 E
}
一个
/
请求匹配配置 A,一个
/index.html
请求匹配配置 B,一个
/documents/document.html
请求匹配配置 C,一个
/images/1.gif
请求匹配配置 D,一个
/documents/1.jpg
请求匹配配置 E。
备注
如果一个前缀 location
以斜杠字符结尾并且启用了 auto_redirect,则会发生以下情况:当一个请求到达时,其 URI 没有尾部斜杠但其他方面完全匹配前缀,将返回一个永久 301 代码重定向,指向带有附加斜杠的请求 URI。
对于精确 URI 匹配的 location,不适用重定向:
location /user/ {
proxy_pass http://user.example.com;
}
location =/user {
proxy_pass http://login.example.com;
}
@ 前缀定义了一个 命名 location。这些 locations 不用于常规请求处理,但可以用于请求重定向。它们不能嵌套,也不能包含嵌套的 locations。
组合 locations#
几个定义了相同配置块的 location 上下文可以通过在一个 location 中列出其所有匹配表达式并包含一个配置块来压缩。这被称为 组合 location。
假设前面示例中的配置 A、D 和 E 定义了相同的配置;你可以将它们合并为一个 location:
location =/
^~/images/
~*\.(gif|jpg|jpeg)$ {
# 通用配置
}
一个命名的 location 也可以是组合的一部分:
location =/
@named_combined {
#...
}
小心
一个组合 location 在匹配表达式和其修饰符之间不能有空格。正确形式:location ~*/match(ing|es|er)$ ...
。
备注
目前,一个组合 location
不能 立即 包含带有 URI 设置的 proxy_pass 和类似指令,也不能包含 api
或 alias
。然而,这些指令可以由嵌套在组合 location 中的 locations 使用。
log_not_found#
启用或禁用将未找到文件的错误记录到 error_log。
log_subrequest#
启用或禁用将子请求记录到 access_log。
max_ranges#
限制字节范围请求中允许的最大范围数。超过限制的请求将被视为没有指定字节范围来处理。默认情况下,范围数是没有限制的。
|
完全禁用字节范围支持 |
merge_slashes#
启用或禁用将URI中两个或多个相邻斜杠除压缩成单个斜杠。
请注意,压缩对于前缀字符串和正则表达式位置的正确匹配是至关重要的。没有它,//scripts/one.php
请求将不会匹配
location /scripts/ { }
并可能被处理为静态文件。因此它会被转换为 /scripts/one.php
。
在URI包含base64编码名称的情况下,关闭压缩可能是必要的,因为 base64 内部使用了"/"字符。然而,出于安全考虑,最好避免关闭压缩。
如果指令是在 server 级别指定的,则可以使用默认服务器中的值。
msie_padding#
启用或禁用为状态大于400的MSIE客户端响应添加注释,以增加响应大小到512字节。
msie_refresh#
启用或禁用为MSIE客户端发出刷新而不是重定向。
open_file_cache#
|
|
默认值 |
|
http, server, location |
配置一个缓存,可以存储:
打开的文件描述符,它们的大小和修改时间;
目录存在的信息;
文件查找错误,例如“文件未找到”,“无读取权限”等。
错误的缓存应由 open_file_cache_errors 指令单独启用。
|
设置缓存中的最大元素数;在缓存溢出时,最不常用的(LRU)元素将被移除; |
|
定义一个时间,如果在此期间没有访问元素,则将其从缓存中移除; 默认情况下,设置为60秒。 |
|
禁用缓存。 |
示例:
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
open_file_cache_errors#
启用或禁用由 open_file_cache 缓存文件查找错误。
open_file_cache_min_uses#
设置在 open_file_cache 指令的 inactive 参数配置的期间,文件描述符在缓存中保持打开所需的文件访问最少 number 次数。
open_file_cache_valid#
设置 open_file_cache 元素应该被验证的时间。
output_buffers#
设置用于从磁盘读取响应的缓冲区的 number 和 size。
port_in_redirect#
启用或禁用在 Angie 发出的 绝对 重定向中指定端口。
重定向中使用主服务器名称由 server_name_in_redirect 指令控制。
postpone_output#
如果可能,客户端数据的传输将推迟,直到 Angie 至少有 size 字节的数据可发送。
|
禁止数据传输的推迟 |
read_ahead#
设置内核在处理文件时的预读量。
在 Linux 上,使用 posix_fadvise(0, 0, 0, POSIX_FADV_SEQUENTIAL) 系统调用,因此忽略 size 参数。
recursive_error_pages#
启用或禁用使用 error_page 指令进行多次重定向。这种重定向的次数是 有限的。
request_pool_size#
允许精确调整每个请求的内存分配。该指令对性能影响最小,通常不应使用。
reset_timedout_connection#
|
|
默认值 |
|
http, server, location |
启用或禁用重置超时连接和用非标准代码 444 关闭的连接。重置如下进行。在关闭套接字之前,设置其 SO_LINGER 选项为超时值 0。当套接字关闭时,TCP RST 发送给客户端,并释放该套接字占用的所有内存。这有助于避免长时间保持已关闭的套接字处于 FIN_WAIT1 状态。
备注
超时的保持连接会正常关闭。
resolver#
|
|
默认值 |
— |
http, server, location, upstream |
配置用于将上游服务器名称解析为地址的名称服务器,例如:
resolver 127.0.0.53 [::1]:5353;
地址可以指定为域名或 IP 地址,以及可选的端口。如果未指定端口,则使用端口 53。名称服务器以循环方式查询。
默认情况下,Angie 使用响应的 TTL 值缓存答案。
|
可选 参数允许重写缓存条目的有效性 |
resolver 127.0.0.53 [::1]:5353 valid=30s;
默认情况下,Angie 在解析时将查找 IPv4 和 IPv6 地址。
|
禁用 IPv4 地址的查找 |
|
禁用 IPv6 地址的查找 |
|
可选 参数; 启用在指定区域中收集 DNS 服务器请求和响应指标 (/status/resolvers/<zone>)。 |
小技巧
为防止 DNS 欺骗,建议在妥善保护的可信本地网络中配置 DNS 服务器。
resolver_timeout#
设置名称解析的超时时间,例如:
resolver_timeout 5s;
root#
设置请求的根目录。例如,使用以下配置
location /i/ {
root /data/w3;
}
将会在响应 /i/top.gif
请求时发送 /data/w3/i/top.gif
文件。
路径值可以包含变量,但不能包含 $document_root 和 $realpath_root。
文件路径是通过简单地将 URI 添加到 root 指令的值后构造的。如果需要修改 URI,应使用 alias 指令。
satisfy#
允许访问如果所有(all)或至少一个(any)这些模块允许 访问:访问控制, 基础认证, 或 认证请求.
location / {
satisfy any;
allow 192.168.1.0/32;
deny all;
auth_basic "closed site";
auth_basic_user_file conf/htpasswd;
}
send_lowat#
如果指令设置为非零值,Angie 将尝试通过使用 NOTE_LOWAT 标志的 kqueue 方法或 SO_SNDLOWAT 套接字选项来最小化客户端套接字上的发送操作次数。在这两种情况下,使用指定的大小。
send_timeout#
设置向客户端发送响应的超时时间。超时时间仅设置在两个连续的写操作之间,而不是整个响应的发送时间。如果客户端在此时间内没有收到任何信息,连接将被关闭。
sendfile#
启用或禁用 sendfile() 的使用。
aio 可以用于预加载 sendfile() 的数据:
location /video/ {
sendfile on;
tcp_nopush on;
aio on;
}
在此配置中,sendfile() 以 SF_NODISKIO 标志调用,这会导致它不会阻塞在磁盘 I/O 上,而是报告数据不在内存中。然后,Angie 通过读取一个字节来启动异步数据加载。在第一次读取时,FreeBSD 内核将文件的前 128K 字节加载到内存中,尽管接下来的读取将仅以 16K 块加载数据。这可以通过 read_ahead 指令进行更改。
sendfile_max_chunk#
限制单个 sendfile() 调用中可以传输的数据量。没有限制的情况下,一个快速连接可能会完全占用工作进程。
server#
设置虚拟服务器的配置。IP 地址(基于 IP 地址)和名称(基于“Host”请求头字段)之间没有明确的分隔。相反,listen 指令描述了应该接受连接的所有地址和端口,而 server_name 指令列出了所有服务器名称。
示例配置在 How Angie processes a request 文档中提供。
server_name#
设置虚拟服务器的名称,例如:
server {
server_name example.com www.example.com;
}
第一个名称成为主要服务器名称。
服务器名称可以包含用星号(“*”)替换名称的第一个或最后一个部分:
server {
server_name example.com *.example.com www.example.*;
}
这些名称被称为通配符名称。
上述名称中的前两个可以合并为一个:
server {
server_name .example.com;
}
还可以在服务器名称中使用正则表达式,在名称前加上波浪号(“~”):
server {
server_name ~^www\d+\.example\.com$ www.example.com;
}
正则表达式可以包含捕获,稍后可以在其他指令中使用:
server {
server_name ~^(www\.)?(.+)$;
location / {
root /sites/$2;
}
}
server {
server_name _;
location / {
root /sites/default;
}
}
在正则表达式中命名捕获会创建变量 稍后可以在其他指令中使用:
server {
server_name ~^(www\.)?(?<domain>.+)$;
location / {
root /sites/$domain;
}
}
server {
server_name _;
location / {
root /sites/default;
}
}
备注
如果指令设置为 $hostname, 则使用 Web 服务器的主机名。
您还可以指定一个空服务器名称 (""
):
server {
server_name www.example.com "";
}
在按名称搜索虚拟服务器时, 如果匹配多个选项 (例如,通配符和正则表达式), 将按以下优先顺序选择第一个匹配项:
精确名称;
以通配符开头的最长名称,例如
*.example.com
;以通配符结尾的最长名称,例如
mail.*
;第一个匹配的正则表达式(按出现顺序), 包括一个空名称。
注意
要使 server_name
在 TLS 中工作,
您需要终止 TLS 连接。
该指令匹配 HTTP 请求中的 Host
,
因此必须完成握手并解密连接。
server_name_in_redirect#
启用或禁用在 Angie 发出的 绝对重定向 中使用由 server_name 指令指定的主要服务器名称。
|
由 server_name 指令指定的主要服务器名称 |
|
使用“Host”请求头字段中的名称。如果该字段不存在,则使用服务器的 IP 地址。 |
重定向中端口的使用由 port_in_redirect 指令控制。
server_names_hash_bucket_size#
设置服务器名称哈希表的桶大小。默认值取决于处理器缓存行的大小。有关设置哈希表的详细信息,请参阅单独的 文档。
server_names_hash_max_size#
设置服务器名称哈希表的最大大小。有关设置哈希表的详细信息,请参阅单独的 文档。
server_tokens#
启用或禁用在错误页面和 Server
响应头字段中显示 Angie 版本。
build 参数启用显示构建名称,
由相应的 configure 参数设置,
以及版本。
Added in version 1.1.0: PRO
在 Angie PRO 中,如果指令设置了一个 string,其中可能还包含变量,
错误页面和 Server
响应头字段
将使用字符串的变量插值值
而不是服务器名称、版本和构建名称。
空的 string 禁用显示 Server
字段。
status_zone#
分配一个共享内存区域以收集指标用于 /status/http/location_zones/<zone> 和 /status/http/server_zones/<zone>。
多个 server
上下文
可以共享相同的区域进行数据收集;
特殊值 off
在嵌套的 location
块中禁用数据收集。
subrequest_output_buffer_size#
|
|
默认值 |
|
http, server, location |
设置用于存储子请求响应体的缓冲区大小。
默认情况下,缓冲区大小等于一个内存页。这是
4K
或 8K
,具体取决于平台。可以将其设置得更小,
然而。
备注
该指令仅适用于将响应体保存到内存中的子请求。例如,SSI 创建的子请求。
tcp_nodelay#
启用或禁用使用 TCP_NODELAY 选项。当连接进入保持活动状态时,该选项被启用。此外,它在SSL连接、无缓冲代理以及 WebSocket 代理 中被启用。
tcp_nopush#
启用或禁用在FreeBSD上的 TCP_NOPUSH 套接字选项或在Linux上的 TCP_CORK 套接字选项。仅在使用 sendfile 时启用这些选项。启用该选项可以:
在Linux和FreeBSD 4.*上,在一个数据包中发送响应头和文件的开头;
以完整数据包发送文件。
try_files#
检查指定顺序的文件是否存在,并使用第一个找到的文件进行请求处理;处理在当前上下文中执行。文件路径根据 root 和 alias 指令从文件参数构建。可以通过在名称末尾指定斜杠来检查目录的存在,例如 $uri/。如果未找到任何文件,则会内部重定向到最后一个参数中指定的 uri。例如:
location /images/ {
try_files $uri /images/default.gif;
}
location = /images/default.gif {
expires 30s;
}
最后一个参数也可以指向一个命名的 location,如下例所示。最后一个参数也可以是一个代码:
location / {
try_files $uri $uri/index.html $uri.html =404;
}
在以下示例中,
location / {
try_files $uri $uri/ @drupal;
}
try_files 指令等同于
location / {
error_page 404 = @drupal;
log_not_found off;
}
如这里,
location ~ \.php$ {
try_files $uri @drupal;
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
# ...
}
try_files 在将请求传递给FastCGI服务器之前检查PHP文件的存在。
代理Mongrel的示例:
location / {
try_files /system/maintenance.html
$uri $uri/index.html $uri.html
@mongrel;
}
location @mongrel {
proxy_pass http://mongrel;
}
Drupal/FastCGI的示例:
location / {
try_files $uri $uri/ @drupal;
}
location ~ \.php$ {
try_files $uri @drupal;
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param QUERY_STRING $args;
# ... other fastcgi_param
}
location @drupal {
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME /path/to/index.php;
fastcgi_param SCRIPT_NAME /index.php;
fastcgi_param QUERY_STRING q=$uri&$args;
# ... other fastcgi_param
}
WordPress和Joomla的示例:
location / {
try_files $uri $uri/ @wordpress;
}
location ~ \.php$ {
try_files $uri @wordpress;
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
# ... other fastcgi_param
}
location @wordpress {
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME /path/to/index.php;
# ... other fastcgi_param
}
types#
|
|
默认值 |
|
http, server, location |
将文件扩展名映射到响应的MIME类型。扩展名不区分大小写。多个扩展名可以映射到一个类型,例如:
types {
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
}
一份足够完整的映射表随Angie一同发布在 conf/mime.types
文件中。
为了使特定位置对所有请求发出“application/octet-stream” MIME类型,可以使用以下配置:
location /download/ {
types { }
default_type application/octet-stream;
}
types_hash_bucket_size#
设置类型哈希表的桶大小。有关设置哈希表的详细信息,请参见单独的 文档。
types_hash_max_size#
设置类型哈希表的最大大小。有关设置哈希表的详细信息,请参见单独的 文档。
underscores_in_headers#
启用或禁用在客户端请求头字段中使用下划线。当禁用下划线使用时,名称包含下划线的请求头字段将被标记为无效,并受制于 ignore_invalid_headers 指令。
如果在 server 级别指定了该指令,则可以使用默认服务器的值。
variables_hash_bucket_size#
设置变量哈希表的桶大小。有关设置哈希表的详细信息,请参见单独的 文档。
variables_hash_max_size#
设置变量哈希表的最大大小。有关设置哈希表的详细信息,请参见单独的 文档。
内置变量#
http_core
模块支持名称与Apache服务器变量匹配的内置变量。首先,这些是表示客户端请求头字段的变量,例如 $http_user_agent
、$http_cookie
等。此外,还有其他变量:
$angie_version
#
Angie版本
$arg_<name>
#
请求行中具有指定 name 的参数
$args
#
请求行中的参数
$binary_remote_addr
#
以二进制形式表示的客户端地址,值的长度对于IPv4地址始终为4字节,IPv6地址为16字节
$body_bytes_sent
#
发送给客户端的字节数,不包括响应头;此变量与Apache模块 mod_log_config 的 "%B" 参数兼容
$bytes_sent
#
发送给客户端的字节数
$connection
#
连接序列号
$connection_requests
#
通过连接发起的当前请求数
$connection_time
#
连接时间(以秒为单位,精确到毫秒)
$content_length
#
"Content-Length" 请求头字段
$content_type
#
"Content-Type" 请求头字段
$document_root
#
$document_uri
#
与 $uri 相同
$host
#
按此优先顺序:请求行中的主机名,或"Host"请求头字段中的主机名,或匹配请求的服务器名
$hostname
#
主机名
$http_<name>
#
任意请求头字段;name 是字段名称转为小写并将破折号替换为下划线
$https
#
如果连接在SSL模式下操作,则为 on,否则为空字符串
$is_args
#
如果请求行有参数则为 ?,否则为空字符串
$limit_rate
#
设置此变量以启用响应速率限制;参见 limit_rate
$msec
#
当前时间(以秒为单位,精确到毫秒)
$pid
#
工作进程的PID
$pipe
#
如果请求是流水线的,则为 p,否则为 .
$proxy_protocol_addr
#
来自PROXY协议头的客户端地址。
必须通过在 listen 指令中设置 proxy_protocol 参数来预先启用PROXY协议。
$proxy_protocol_port
#
来自PROXY协议头的客户端端口。
必须通过在 listen 指令中设置 proxy_protocol 参数来预先启用PROXY协议。
$proxy_protocol_server_addr
#
来自PROXY协议头的服务器地址。
必须通过在 listen 指令中设置 proxy_protocol 参数来预先启用PROXY协议。
$proxy_protocol_server_port
#
来自PROXY协议头的服务器端口。
必须通过在 listen 指令中设置 proxy_protocol 参数来预先启用PROXY协议。
$proxy_protocol_tlv_<name>
#
来自PROXY协议头的TLV。 name 可以是TLV类型或其数值。在后一种情况下,值是十六进制的,并应以 0x 为前缀:
$proxy_protocol_tlv_alpn
$proxy_protocol_tlv_0x01
SSL TLV也可以通过TLV类型名称或其数值来访问,这两者都以 ssl_
为前缀:
$proxy_protocol_tlv_ssl_version
$proxy_protocol_tlv_ssl_0x21
支持以下TLV类型名称:
alpn (0x01) - 连接上使用的上层协议
authority (0x02) - 客户端传递的主机名值
unique_id (0x05) - 唯一连接ID
netns (0x30) - 命名空间名称
ssl (0x20) - 二进制SSL TLV结构
支持以下SSL TLV类型名称:
ssl_version (0x21) - 客户端连接中使用的SSL版本
ssl_cn (0x22) - SSL证书的通用名称
ssl_cipher (0x23) - 使用的密码名称
ssl_sig_alg (0x24) - 用于签署证书的算法
ssl_key_alg (0x25) - 公钥算法
还支持以下特殊的SSL TLV类型名称:
ssl_verify - 客户端SSL证书验证结果,如果客户端提供了证书并成功验证则为`0`,否则为非零。
PROXY协议必须在 listen 指令中设置 proxy_protocol 参数以预先启用。
$query_string
#
同 $args
$realpath_root
#
$remote_addr
#
客户端地址
$remote_port
#
客户端端口
$remote_user
#
通过基本认证提供的用户名
$request
#
完整的原始请求行
$request_body
#
请求体。
当请求体被读入 memory buffer 时,该变量的值在由 proxy_pass、fastcgi_pass、uwsgi_pass 和 scgi_pass 指令处理的位置中*可用*。
$request_body_file
#
请求体的临时文件名。
处理结束时,需要删除该文件。若要始终将请求体写入文件,需要启用 client_body_in_file_only。当在代理请求或FastCGI/uwsgi/SCGI服务器请求中传递临时文件名时,应通过 proxy_pass_request_body off、fastcgi_pass_request_body off、uwsgi_pass_request_body off 或 scgi_pass_request_body off 指令禁用请求体的传递。
$request_completion
#
若请求已完成则为"OK",否则为空字符串
$request_filename
#
$request_id
#
由16个随机字节生成的唯一请求标识符,以十六进制表示
$request_length
#
请求长度(包括请求行、头部和请求体)
$request_method
#
请求方法,通常为 GET
或 POST
$request_time
#
请求处理时间,以秒为单位,精确到毫秒;从客户端读取第一个字节起的时间
$request_uri
#
完整的原始请求URI(带参数)
$scheme
#
请求方案,"http"或"https"
$sent_http_<name>
#
任意响应头字段; name 是字段名称,转换为小写并用下划线替换破折号
$sent_trailer_<name>
#
响应结尾发送的任意字段; name 是字段名称,转换为小写并用下划线替换破折号
$server_addr
#
接受请求的服务器地址。
计算该变量的值通常需要一个系统调用。
为了避免它,listen 指令必须指定地址并使用 bind
参数。
$server_name
#
接受请求的服务器名称
$server_port
#
接受请求的服务器端口
$server_protocol
#
请求协议,通常为"HTTP/1.0"、"HTTP/1.1"或"HTTP/2.0"
$status
#
响应状态
$time_iso8601
#
ISO 8601标准格式的本地时间
$time_local
#
常用日志格式的本地时间
$tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, $tcpinfo_rcv_space
#
有关客户端TCP连接的信息;在支持 TCP_INFO
套接字选项的系统上可用
$uri
#
请求中的当前URI,normalized。
在请求处理过程中,$uri
的值可能会更改,例如在执行内部重定向或使用索引文件时。