7、nginx模块之HTTP模块(2)
1. 对客户端请求的限制
1.1 按HTTP方法名限制用户请求
语法: limit_except method ... {....}
配置块: location
-
Nginx 通过 limit_except 后面指定的方法名来限制用户请求。方法名可取值包括:
GET
、HEAD
、POST
、PUT
、DELETE
、MKCOL
、COPY
、MOVE
、OPTIONS
、PROPFIND
、PROPPATCH
、LOCK
、UNLOCK
或者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
。
- 在配置为on时,会将其匹配为location
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经过root 或alias 转换后的文件路径 |
$request_body |
表示HTTP请求中的包体,该参数只在proxy_pass 或fastcgi_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 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南