本节的内容主要讲到关于nginx文件操作优化以及对客户端请求特殊处理(比如限速,不合法请求处理,是否注明nginx版本号) 一.通过nginx对客户端相关请求做特殊处理 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 此配置是对客户端请求限制每秒传输的字节数。默认参数为0,表示不限速。 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; 1.5 对客户端请求的特殊处理 下面介绍对客户端请求的特殊处理的配置项。 1.5.1 忽略不合法的HTTP头部 语法:ignore_invalid_headers on | off; 默认:ignore_invalid_headers on; 配置块:http、server 如果将其设置为off,那么当出现不合法的HTTP头部时,Nginx会拒绝服务,并直接向用户发送400(Bad Request)错误。如果将其设置为on,则会忽略此HTTP头部。 1.5.2 HTTP头部是否允许下画线 语法:underscores_in_headers on | off; 默认:underscores_in_headers off; 配置块:http、server 默认为off,表示HTTP头部的名称中不允许带“_”(下画线)。 1.5.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:将If-Modified-Since头部包含的时间与将要返回的文件上次修改的时间做精确比较,如果没有匹配上,则返回200和文件的实际内容,如果匹配上,则表示浏览器缓存的文件内容已经是最新的了,没有必要再返回文件从而浪费时间与带宽了,这时会返回304 Not Modified,浏览器收到后会直接读取自己的本地缓存。 before:是比exact更宽松的比较。只要文件的上次修改时间等于或者早于用户请求中的If-Modified-Since头部的时间,就会向客户端返回304 Not Modified。 1.5.4 文件未找到时是否记录到error日志 语法:log_not_found on | off; 默认:log_not_found on; 配置块:http、server、location 此配置项表示当处理用户请求且需要访问文件时,如果没有找到文件,是否将错误日志记录到error.log文件中。这仅用于定位问题。 1.5.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。 1.5.6 DNS解析地址 语法:resolver address ...; 配置块:http、server、location 设置DNS名字解析服务器的地址,例如: resolver 127.0.0.1 192.0.2.1; 1.5.7 DNS解析的超时时间 语法:resolver_timeout time; 默认:resolver_timeout 30s; 配置块:http、server、location 此配置项表示DNS解析的超时时间。 1.5.8 返回错误页面时是否在Server中注明Nginx版本 语法:server_tokens on | off; 默认:server_tokens on; 配置块:http、server、location 表示处理请求出错时是否在响应的Server头部中标明Nginx版本,这是为了方便定位问题。 二.配置nginx文件操作优化 以下面为nginx文件操作的优化配置项。 2.1 sendfile系统调用 语法:sendfile on | off; 默认:sendfile off; 配置块:http、server、location 可以启用Linux上的sendfile系统调用来发送文件,它减少了内核态与用户态之间的两次内存复制,这样就会从磁盘中读取文件后直接在内核态发送到网卡设备,提高了发送文件的效率。语法:aio on | off; 2.2 AIO系统调用 语法:aio on | off; 默认:aio off; 配置块:http、server、location 此配置项表示是否在FreeBSD或Linux系统上启用内核级别的异步文件I/O功能。注意,它与sendfile功能是互斥的。 2.3 directio 语法:directio size | off; 默认:directio off; 配置块:http、server、location 此配置项在FreeBSD和Linux系统上使用O_DIRECT选项去读取文件,缓冲区大小为size,通常对大文件的读取速度有优化作用。注意,它与sendfile功能是互斥的。 2.3 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种信息: 1.文件句柄、文件大小和上次修改时间。 2.已经打开过的目录结构。 3.没有找到的或者没有权限操作的文件信息。 这样,通过读取缓存就减少了对磁盘的操作。 该配置项后面跟3种参数。 1.max:表示在内存中存储元素的最大个数。当达到最大限制数量后,将采用LRU(Least Recently Used)算法从缓存中淘汰最近最少使用的元素。 2.inactive:表示在inactive指定的时间段内没有被访问过的元素将会被淘汰。默认时间为60秒。 3.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秒检查一次缓存中的元素是否仍有效 |
|