7、nginx模块之HTTP模块(2)

发布时间 2024-01-09 18:47:12作者: ccblblog

1. 对客户端请求的限制

1.1 按HTTP方法名限制用户请求

语法: limit_except method ... {....}
配置块:location

  • Nginx 通过 limit_except 后面指定的方法名来限制用户请求。方法名可取值包括:GETHEADPOSTPUTDELETEMKCOLCOPYMOVEOPTIONSPROPFINDPROPPATCHLOCKUNLOCK 或者 PATCH。例如:

    limit_except GET {
        allow 192.168.1.0/32;
        deny all;
    }
    

    注意,允许 GET 方法就意味着也允许 HEAD 方法。因此,上面这段代码表示的是禁止GET 方法和 HEAD 方法,但其他 HTTP 方法是允许的

1.2 HTTP 请求包体的最大值

语法:client_max_body_size size;
默认:client_max_body_size 1m;
配置块: http、server、location

  • 浏览器在发送含有较大HTTP 包体的请求时,其头部会有一个 Content-Length 字段,client_max_body_size是用来限制Content-Length 所示值的大小的。因此,这个限制包体的配置非常有用处,因为不用等 Nginx 接收完所有的HTTP 包体一这有可能消耗很长时间--就可以告诉用户请求过大不被接受。例如,用户试图上传一个 10GB 的文件,Nginx在收完包头后,发现 Content-Length 超过 client_max_body_size定义的值,就直接发送413 ("Request Entity Too Large")响应给客户端

1.3 对请求的限速

语法: limit_rate speed;
默认:limit_rate 0;
配置块: http、server、location、if

  • 此配置是对客户端请求限制每秒传输的字节数。speed 可以使用 上文 提到的多种单位,默认参数为0,表示不限速。针对不同的客户端,可以用 $limit_rate 参数执行不同的限速策略。例如:

    server {
        if($slow){
            set $limit_rate 4k;
        }
    }
    
    

1.4 limit_rate_after

语法: limit_rate_after time;
默认: limit_rate_after 1m;
配置块: http、server、location、if

  • 此配置表示Nginx向客户端发送的响应长度超过limit_rate_after 后才开始限速。例如:
    limit_rate_after 1m;
    limit_rate 100k;
    

2.文件操作的优化

2.1 sendfile系统调用

语法: sendfile on | off
默认; sendfile off;
配置块: http、server、location

可以启用 Linux上的sendfile 系统调用来发送文件,它减少了内核态与用户态之间的两次内存复制,这样就会从磁盘中读取文件后直接在内核态发送到网卡设备,提高了发送文件的效率。

2.2 AIO系统调用

语法:aio on | off;
默认:aio off;
配置块: http、server、location

  • 此配置项表示是否在 FreeBSD 或Linux 系统上启用内核级别的异步文/0功能。注意,它与 sendfile 功能是互斥的。

2.3 directio

语法: directio size|off;
默认: directio off;
配置块: http、server、location

  • 此配置项在FreeBSD和Linux 系统上使用O_DIRECT 选项去读取文件,缓冲区大小为size,通常对大文件的读取速度有优化作用。注意,它与 sendfile 功能是互斥的。

2.4 directio_alignment

语法: directio_alignment size;
默认: directio_alignment 512;
配置块: http、server、location

  • 它与directio 配合使用,指定以 directio 方式读取文件时的对齐方式。一般情况下512B已经足够了,但针对一些高性能文件系统,如Linux下的XFS文件系统,可能需要设置到4KB作为对齐方式

2.5 打开文件缓存

语法: open_file_cache max = N [inactive = time] | off;

默认: open_file_cache off;

配置块: http、server、location

  • 文件缓存会在内存中存储以下3 种信息:

    • 文件句柄、文件大小和上次修改时间
    • 已经打开过的目录结构。
    • 没有找到的或者没有权限操作的文件信息。

    这样,通过读取缓存就减少了对磁盘的操作。该配置项后面跟3种参数。

    • max:表示在内存中存储元素的最大个数。当达到最大限制数量后,将采用LRU(LeastRecently Used)算法从缓存中淘汰最近最少使用的元素。
    • inactive:表示在 inactive 指定的时间段内没有被访问过的元素将会被淘汰。默认时间为60秒
    • off:关闭缓存功能

    例如:

open_file_cache max=1000 inactive=20s;

2.6 是否缓存打开文件错误的信息

语法: open_file_cache_errors on | off;
默认: open_file_cache_errors off;
配置块: http、server、location

  • 此配置项表示是否在文件缓存中缓存打开文件时出现的找不到路径、没有权限等错误信息。

2.7 不被淘汰的最小访问次数

语法: open_file_cache_min_uses number;
默认: open_file_cache_min_uses 1;
配置块: http、server、location

  • 它与open_file_cache 中的 inactive 参数配合使用。如果在 inactive 指定的时间段内,访问次数超过了open_file _cache_min_uses 指定的最小次数,那么将不会被淘汰出缓存。

2.8 检验缓存中元素有效性的频率

语法: open_file_cache_valid time;

默认: open_file_cache_valid 60s;

配置块: http、server、location

  • 默认为每 60 秒检查一次缓存中的元素是否仍有效

3.对客户端请求的特殊处理

3.1 忽略不合法的HTTP 头部

语法: ignore_invalid_headers on | off;
默认: ignore_invalid_headers on;
配置块: http、server

  • 如果将其设置为 off,那么当出现不合法的 HTTP 头部时,Nginx 会拒绝服务,并直接用户发送400(Bad Request)错误。如果将其设置为 on,则会忽略此HTTP头部

3.2 HTTP头部是否允许下画线

语法: underscores_in_headers on | off;
默认: underscores_in_headers off;
配置块: http、server

  • 默认为 off,表示HTTP 头部的名称中不允许带“”(下画线)。

3.3 对If-Modified-Since 头部的处理策略

语法: if_modified_since [ off | exact | before ];

默认: if_modified_since exact;

配置块: http、server、location

  • 出于性能考虑,Web 浏览器一般会在客户端本地缓存一些文件,并存储当时获取的时间这样,下次向 Web 服务器获取缓存过的资源时,就可以用If-Modified-Since 头部把上次获取的时间挡带上,而if modified since 将根据后面的参数决定如何处理If-Modified-Since头部。
    相关参数说明如下。
    • off: 表示忽略用户请求中的If-Modified-Since 头部。这时,如果获取一个文件,那么会正常地返回文件内容。HTTP 响应码通常是 200。
    • exact: 将IfModifed-Since 头部包含的时间与将要返回的文件上次修改的时间做精确比较,如果没有匹配上,则返回 200 和文件的实际内容,如果匹配上,则表示浏览器缓存的文件内容已经是最新的了,没有必要再返回文件从而浪费时间与带宽了,这时会返回304 Not Modified,浏览器收到后会直接读取自己的本地缓存。
    • before: 是比exact 更宽松的比较。只要文件的上次修改时间等于或者早于用户请求中的If-Modified-Since 头部的时间,就会向客户端返回 304 Not Modified。

3.4 文件未找到时是否记录到error 日志

语法:log_not_found on|off;
默认:log_not_found on;
配置块: http、server、location

  • 此配置项表示当处理用户请求且需要访向文件时,如果没有找到文件,是否将错误日志记录到 error.log 文件中。这仅用于定位问题。

3.5 merge_slashes

语法: merge_slashes on | off;
默认: merge_slashes on;
配置块: http、server、location

  • 此配置项表示是否合并相邻的“/”,例如,//test///a.txt
    • 在配置为on时,会将其匹配为location /test/a.txt;
    • 如果配置为off,则不会匹配,URI将仍然是 //test///a.txt

3.6 DNS解析地址

语法: resolver address ...;
配置块: http、server、location

  • 设置 DNS 名字解析服务器的地址,例如:

    resolver 127.0.0.1 192.0.2.1
    

3.7 DNS解析的超时时间

语法: resolver_timeout time;

默认: resolver_timeout 30s;

配置块: http、server、location

  • 此配置项表示DNS解析的超时时间

3.8 返回错误页面时是否在Server 中注明Nginx版本

语法: server_tokens on|off;

默认; server_tokens on;

配置块: http、server、location

  • 表示处理请求出错时是否在响应的 Server 头部中标明Nginx 版本,这是为了方便定位问题。##

4.ngx_http_core_module 模块提供的变量

参数名 意义
$args_PARAMETER HTTP请求中某个参数的值,如/indexhtml?size=100,可以用 $arg_size 取得 100这个值
$args HTTP 请求中的完整参数。例如,在请求 /index/html?_w=120&_h=120中,$args表示字符串_w=120&_h=120
$binary_remote_addr 二进制格式的客户端地址。例如:\x0A\xE0B\x0E
$body_bytes_sent 表示在向客户端发送的 http 响应中,响应包体的字节数
$content_length 表示客户端请求头部中的Content-Length 字段
$content_type 表示客户端请求头部中的Content-Type字段
$cookie_COOKIE 表示在客户端请求头部中的 cookie 字段
$document_root 表示当前请求所使用的 root 配置项的值
$uri 表示当前请求的 URI,不带任何参数
$document_uri $uri含义相同
$request_uri 表示客户端发来的原始请求 URI,带完整的参数。$uri$document_uri未必是用户的原始请求,在内部重定向后可能是重定向后的 URI,而 $request_uri永远不会改变,始终是客户端的原始URL
$host 表示客户端请求头部中的 Host字段。如果 Host字段不存在,则以实际处理的 server(虚拟主机)名称代替。如果 Host字段中带有端口,如IP:PORT,那么$host是去掉端口的,它的值为IP$host是全小写的。这些特性与http_HEADER 中的 http_host不同,http_host 只是“忠实”地取出 Host 头部对应的值
$hostname 表示Nginx所在机器的名称,与gethostbyname 调用返回的值相同
$http_HEADER 表示当前HTTP 请求中相应头部的值。HEADER名称全小写。例如,用 $http_host 表示请求中 Host 头部对应的值
$sent_http_HEADER 表示返回客户端的HTTP 响应中相应头部的值。HEADER 名称全小写。例如,用 $sent_http_content_type表示响应中Content-Type头部对应的值
$is_args 表示请求中的URI是否带参数,如果带参数,$is_args 值为 ?,如果不带参数,则是空字符串
$limit_rate 表示当前连接的限速是多少,0 表示无限速
$nginx_version 表示当前Nginx的版本号,如1.0.14
$query_string 请求URI中的参数,与 $args 相同,然而 $query_string 是只读的不会改变
$remote_addr 表示客户端的地址
$remote_port 表示客户端连接使用的端口
$remote_user 表示使用 Auth Basic Module 时定义的用户名
$request_filename 表示用户请求中的URI经过rootalias 转换后的文件路径
$request_body 表示HTTP请求中的包体,该参数只在proxy_passfastcgi_pass 中有意义
$request_body_file 表示HTTP请求中的包体存储的临时文件名
$request_completion 当请求已经全部完成时,其值为“ok”。若没有完成,就要返回客户端,则其值为空字符串,或者在断点续传等情况下使用 HTTP range 访的并不是文件的最后一块,那么其值也是空字符串
$request_method 表示 HTTP 请求的方法名,如GET、PUT、POST等
$scheme 表示HTTP scheme,如在请求 https://nginx.com/中表示 https
$server_addr 表示服务器地址
$server_name 表示服务器名称
$server_port 表示服务器端口
$server_protocol 表示服务器向客户端发送响应的协议,如 HTTP/1.1或HTTP/1.0