Nginx学习:HTTP核心模块(十一)其它配置
剩下的一些配置指令没有大的归属,不过也有一些是比较常见的,这部分内容学习完成之后,整个 http 模块相关的核心基础配置指令就全部学习完成了。今晚可以举杯庆祝一下了,咱们远程干杯。但是,还是要泼个冷水哦,咱们的学习还有很长的路要走。如果你看过 Nginx 的官方文档,就会知道仅仅是 HTTP 模块本身,就还有一大堆核心模块之外的模块。
不过,幸运的是,这些模块的内容单个来看都不复杂,因此,咱们还要继续加油哦。先不想那么多,赶紧进入今天的学习吧。
output_buffers
设置用于从磁盘读取响应的缓冲区的数量和大小。
代码语言:javascript复制output_buffers number size;
默认值是 2 32k,1.9.5 版本之后是 1 32k。如果可能,客户端数据的传输将被推迟,直到 Nginx 至少具有要发送的数据的字节数的集合大小。零值禁止推迟数据传输。可能是读取大文件时,关闭 sendfile ,调整这个配置的参数,从而提升服务器的吞吐率。一般很少用,保持默认好了。
postpone_output
如果可能,到客户端的数据将被推迟发送,直到nginx需要发送的数据至少有size字节。
代码语言:javascript复制postpone_output size;
默认值是 1460 , 设置为0将关闭推迟发送的功能。它是在 Nginx 层面所作的与 TCP_CORK 类似的一个优化。一般很少用,保持默认好了。
read_ahead
设置内核参数,控制文件预读的数量。
代码语言:javascript复制read_ahead size;
默认 0 ,在 Linux 系统上,因为使用的是 posix_fadvise(0, 0, 0, POSIX_FADV_SEQUENTIAL) 系统调用,所以 size 无用。在FreeBSD上,访问的是 fcntl(O_READAHEAD,size) 系统调用。该系统调用在 FreeBSD 9.0-CURRENT 才被支持,在 FreeBSD 7 上则需要打补丁。FreeBSD 也从来都没用过,所以这个配置也就是了解一下就好了。
recursive_error_pages
允许或禁止 error_page 指令进行多次重定向。
代码语言:javascript复制recursive_error_pages on | off;
默认 off ,允许的话,重定向次数也有限制。而禁止此功能时,当访问 error_page 指令重定向的错误页面出现任何问题时,Nginx 将直接输出默认错误页面。
我们将 php 的 location 中的 500 错误指向的页面再次定义为 /err.php ,这个 php 文件中,抛出了一个异常,这样的话它还是会报 500 错误。也就是说,第一次访问 /err.php 之后,error_page 会持续不断地继续再次跳到 /err.php 。如果保持默认的配置,也就是 recursive_error_pages 为 off 那么直接就会出现默认的 Nginx 500 错误页面,并且错误日志中没有特别的日志信息。而如果开启了这个配置,那么错误日志中,会显示 rewrite or internal redirection cycle while internally redirecting to "/err.php" while sending to client
这样的错误信息。
request_pool_size
默认值 4k ,允许对每个请求的内存分配进行细调,主要是影响内存池的存储情况。
代码语言:javascript复制request_pool_size size;
这条指令对性能影响很小,通常情况下不应使用。
reset_timedout_connection
开启或关闭重置超时连接的功能。
代码语言:javascript复制reset_timedout_connection on | off;
默认值是 off ,重置连接是这样执行的:关闭套接字以前,设置 SO_LINGER 选项的超时值为 0 , 那么当关闭套接字时, Nginx 向客户端发送 TCP RST,并且释放此套接字占用的所有内存。这样可以避免某个已关闭的套接字长时间处于FIN_WAIT1状态,并占用内存缓冲区。应该注意的是,超时的长连接仍然是正常关闭。
说人话就是告诉 Nginx 关闭不响应的客户端连接,这将会释放那个客户端所占有的内存空间。这个配置应该是和 send_timeout 有关,个人猜测。不过不知道咋测试,有用过的小伙伴可以评论区留言一起学习哈。
resolver
代码语言:javascript复制resolver address ... [valid=time] [ipv4=on|off] [ipv6=on|off] [status_zone=zone];
配置将后端服务器的名字解析成 ip 地址的名字服务器。啥意思呀?其实就是指定一个 DNS 服务器地址,比如我们常用的 114.114.114.114 或者是 8.8.8.8 。这个配置其实用得比较少,它主要用于代理模块,使用域名的时候指定域名的 DNS 解析服务器。但通常来说,我们会直接 /etc/hosts ,或者直接使用 ip ,很少会使用这个配置。当然,还有两种情况可能会用到它:一是使用变量来配置反向代理或负载均衡时,二是正向代理。
代码语言:javascript复制# resolver 8.8.8.8;
location /resolver_test {
set $zy www.zyblog.com.cn;
proxy_pass http://$zy/;
}
自定义变量的内容我们还没有学,但是这里也可以看出,我们自定义了一个 zy 变量,然后让 proxy_pass 指向这个 zy 。变量里面是一个外网的域名,也是可以打开的,但是在 resolver 没有配置的情况下,你直接测试,会发现报 500 错误了。错误日志的内容是 no resolver defined to resolve www.zyblog.com.cn 。
现在打开上面测试代码中的注释,再次访问,就会发现可以正常访问了。正向代理的内容我们后面会学习到。
resolver 可以配置多个,以轮询的方式发送请求到多台 DNS 服务器。valid 参数指定缓存时间,status_zone 允许收集指定区域中请求和响应的 DNS 服务器统计信息,不过这个参数是商业版的 Nginx 才支持的。
resolver_timeout
为名字解析设置超时。
代码语言:javascript复制resolver_timeout time;
和 resolver 一起的,默认值是 30s 。
satisfy
Nginx 进行访问限制的有 ngx_http_access_module 模块和 ngx_http_auth_basic_module 模块。
代码语言:javascript复制satisfy all | any;
默认值是 all , 表示只有当两个模块的所有限制条件(写入配置的)都授权访问时,允许请求访问。设置成 any 时,表示如果当任意模块的任意限制条件授权访问时,允许请求访问。具体的内容我们将在后面学习访问及权限控制模块时再进行详细的测试。与后续的 access、 auth_basic、auth_request 有关。
send_timeout
设置向客户端传输响应的超时。
代码语言:javascript复制send_timeout time;
超时仅指两次相邻写操作之间的时间间隔,而非整个响应的传输时间。如果客户端在这段时间中没有收到任何数据,连接将关闭。
subrequest_output_buffer_size
设置用于存储子请求的响应体的缓冲区大小。
代码语言:javascript复制subrequest_output_buffer_size size;
默认值是 4k 或 8k ,默认情况下,缓冲区大小等于一个内存页。这是 4K 或 8K ,取决于平台。然而,它可以变得更小。该指令仅适用于响应体保存到内存中的子请求。例如,此类子请求由 SSI 创建。
tcp_nodelay
开启或关闭 Nginx 使用 TCP_NODELAY 选项的功能。
代码语言:javascript复制tcp_nodelay on | off;
默认 on , 这个选项仅在将连接转变为长连接的时候才被启用,在upstream发送响应到客户端时也会启用。
tcp_nopush
开启或者关闭 Nginx 在 FreeBSD 上使用 TCP_NOPUSH 套接字选项, 在 Linux 上使用 TCP_CORK 套接字选项。
代码语言:javascript复制tcp_nopush on | off;
默认值是 off , 选项仅在使用 sendfile 的时候才开启。开启此选项允许:
- 在 Linux 和 FreeBSD 4.* 上将响应头和正文的开始部分一起发送
- 一次性发送整个文件
TCP 相关的知识,小伙伴们可以自行查阅相关的资料。和 sendfile 配合使用,类似外卖小哥,不开启,拿一个送一单。开启的话,拿到全部的外卖,放到外卖箱,一起送。
variables_hash_bucket_size
设置变量哈希桶大小,其默认值取决于处理器的缓存线长度。
代码语言:javascript复制variables_hash_bucket_size size;
默认 64 ,啥是哈希表?为了快速处理静态的数据集合,诸如虚拟主机名、 map指令的值、 MIME类型和请求头的字段名,nginx使用了哈希表。后面我们学习相关的哈希表模块的时候再进行详细的学习。
variables_hash_max_size
设置变量哈希表的最大size(容量)。
代码语言:javascript复制variables_hash_max_size size;
默认值是 512 。同样在将来学习哈希表相关模块的时候再进行深入了解。
disable_symlinks
决定 Nginx 打开文件时如何处理符号链接。
代码语言:javascript复制disable_symlinks off;
啥是符号链接,其实就是我们常说的软链接,在 Linux 下使用 ln 命令,在 Windows 底下的快捷方式。这个配置可以决定 Nginx 打开文件时如何处理符号链接,包括以下几种方式:
- off 默认行为,允许路径中出现符号链接,不做检查。
- on 如果文件路径中任何组成部分中含有符号链接,拒绝访问该文件。
- if_not_owner 如果文件路径中任何组成部分中含有符号链接,且符号链接和链接目标的所有者不同,拒绝访问该文件。
- from=part 当 Nginx 进行符号链接检查时(参数 on 和参数 if_not_owner ),路径中所有部分默认都会被检查。而使用from=part 参数可以避免对路径开始部分进行符号链接检查,而只检查后面的部分路径。如果某路径不是以指定值开始,整个路径将被检查,就如同没有指定这个参数一样。如果某路径与指定值完全匹配,将不做检查。这个参数的值可以包含变量。
首先我们创建软连接的文件。
代码语言:javascript复制# /usr/local/nginx/html
mkdir llink
cd llink
ln -s /usr/local/nginx/html/aaa.html 1.html
正常情况下,访问 /llink/1.html 是没有问题的,那么我们先加一个 location ,并将 disable_symlinks 打开。
代码语言:javascript复制location /llink/ {
disable_symlinks on;
}
现在访问 /llink/1.html ,将返回 403 错误,不管怎么样,只要是软连接,都会无法访问。所以现在,我们换成 if_not_owner ,直接访问还是 403 ,别着急,把目录和文件都改成 www 用户和用户组的,也就是和 Nginx 相同的用户。
代码语言:javascript复制chown www.www -R llink/
又可以访问了吧。最后我们再看看 from=part 参数的作用。将路径文件改回 root 用户,查看访问返回 403 了,接下来增加配置。
代码语言:javascript复制location /llink/ {
disable_symlinks if_not_owner from=$document_root$uri;
}
这样配置其实就是路径与指定值完全匹配了,这样也不会做任何检查,同样可以打开页面了。
disable_symlinks 配置的参数 on 和 if_not_owner 会带来处理开销。只在那些不支持打开目录查找文件的系统中,使用这些参数需要工作进程有这些被检查目录的读权限。ngx_http_autoindex_module 模块,ngx_http_random_index_module 模块和 ngx_http_dav_module 模块目前会忽略这条指令。
disable_symlinks on from=$document_root; 这条指令只在有openat()和fstatat()接口的系统上可用。当然,现在的FreeBSD、Linux和Solaris都支持这些接口。
总结
一口气又学了这么多配置指令。这篇文章可能是到目前为止关于配置指令介绍的最多的一篇文章了。而且有很多指令我还不知道咋测试,这就要麻烦各位小伙伴,如果有了解的同学随时评论哦。如果身边有大佬可以请教的,也可以问问然后来教教我哈,欢迎大家随时找我交流。
HTTP 核心部分的配置项完成了,但是,还有一块非常大的内容,那就是 HTTP 核心模块中自带的那些变量。之前我们在学习的过程中就接触过一些,也了解过一点。下篇文章我们就着重地看一下在 Nginx 中提供的那些变量都有什么用。
参考文档:
http://nginx.org/en/docs/http/ngx_http_core_module.html