nginx教程第六篇:用HTTP核心模块配置一个静态Web服务器(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013068377/article/details/82821662

承接上篇文章:nginx教程第五篇:用HTTP核心模块配置一个静态Web服务器(一)

网络连接的设置

下面介绍网络连接的设置配置项:

1. 读取HTTP头部的超时时间
语法: client_header_timeout time( 默认单位: 秒) ;
默认: client_header_timeout 60;
配置块: http、 server、 location

客户端与服务器建立连接后将开始接收HTTP头部, 在这个过程中, 如果在一个时间间
隔( 超时时间) 内没有读取到客户端发来的字节, 则认为超时, 并向客户端返回
408(“Request timed out”)响应。

2. 读取HTTP包体的超时时间
语法: client_body_timeout time( 默认单位: 秒) ;
默认: client_body_timeout 60;
配置块: http、 server、 location

此配置项与client_header_timeout相似, 只是这个超时时间只在读取HTTP包体时才有
效。

3. 发送响应的超时时间
语法: send_timeout time;
默认: send_timeout 60;
配置块: http、 server、 location

这个超时时间是发送响应的超时时间, 即Nginx服务器向客户端发送了数据包, 但客户
端一直没有去接收这个数据包。 如果某个连接超过send_timeout定义的超时时间, 那么Nginx
将会关闭这个连接。

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

连接超时后将通过向客户端发送RST包来直接重置连接。 这个选项打开后, Nginx会在某
个连接超时后, 不是使用正常情形下的四次握手关闭TCP连接, 而是直接向用户发送RST重
置包, 不再等待用户的应答, 直接释放Nginx服务器上关于这个套接字使用的所有缓存( 如
TCP滑动窗口) 。 相比正常的关闭方式, 它使得服务器避免产生许多处于FIN_WAIT_1、
FIN_WAIT_2、 TIME_WAIT状态的TCP连接。
注意, 使用RST重置包关闭连接会带来一些问题, 默认情况下不会开启。

5. lingering_close
语法: lingering_close off|on|always;
默认: lingering_close on;
配置块: http、 server、 location

该配置控制Nginx关闭用户连接的方式。 always表示关闭用户连接前必须无条件地处理连
接上所有用户发送的数据。 off表示关闭连接时完全不管连接上是否已经有准备就绪的来自用
户的数据。 on是中间值, 一般情况下在关闭连接前都会处理连接上的用户发送的数据, 除了
有些情况下在业务上认定这之后的数据是不必要的。

6. lingering_time
语法: lingering_time time;
默认: lingering_time 30s;
配置块: http、 server、 location

lingering_close启用后, 这个配置项对于上传大文件很有用。 上文讲过, 当用户请求的
Content-Length大于max_client_body_size配置时, Nginx服务会立刻向用户发送413( Request
entity too large) 响应。 但是, 很多客户端可能不管413返回值, 仍然持续不断地上传HTTP
body, 这时, 经过了lingering_time设置的时间后, Nginx将不管用户是否仍在上传, 都会把连
接关闭掉。

7. lingering_timeout
语法: lingering_timeout time;
默认: lingering_timeout 5s;
配置块: http、 server、 location

lingering_close生效后, 在关闭连接前, 会检测是否有用户发送的数据到达服务器, 如果
超过lingering_timeout时间后还没有数据可读, 就直接关闭连接; 否则, 必须在读取完连接缓
冲区上的数据并丢弃掉后才会关闭连接。

8. 对某些浏览器禁用keepalive功能
语法: keepalive_disable [msie6|safari|none]...
默认: keepalive_disablemsie6 safari
配置块: http、 server、 location

HTTP请求中的keepalive功能是为了让多个请求复用一个HTTP长连接, 这个功能对服务
器的性能提高是很有帮助的。 但有些浏览器, 如IE 6和Safari, 它们对于使用keepalive功能的
POST请求处理有功能性问题。 因此, 针对IE 6及其早期版本、 Safari浏览器默认是禁用
keepalive功能的。

9. keepalive超时时间
语法: keepalive_timeout time( 默认单位: 秒) ;
默认: keepalive_timeout 75;
配置块: http、 server、 location

一个keepalive连接在闲置超过一定时间后( 默认的是75秒) , 服务器和浏览器都会去关
闭这个连接。 当然, keepalive_timeout配置项是用来约束Nginx服务器的, Nginx也会按照规范
把这个时间传给浏览器, 但每个浏览器对待keepalive的策略有可能是不同的。

10. 一个keepalive长连接上允许承载的请求最大数
语法: keepalive_requests n;
默认: keepalive_requests 100;
配置块: http、 server、 location

一个keepalive连接上默认最多只能发送100个请求。

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

确定对keepalive连接是否使用TCP_NODELAY选项。

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

在打开sendfile选项时, 确定是否开启FreeBSD系统上的TCP_NOPUSH或Linux系统上的
TCP_CORK功能。 打开tcp_nopush后, 将会在发送响应时把整个响应包头放到一个TCP包中
发送。

MIME类型的设置

下面是MIME类型的设置配置项:

1. MIME type与文件扩展名的映射
语法: type{...};
配置块: http、 server、 location

定义MIME type到文件扩展名的映射。 多个扩展名可以映射到同一个MIME type。 例如:
types {
	text/html html;
	text/html conf;
	image/gif gif;
	image/jpeg jpg;
}
2. 默认MIME type
语法: default_type MIME-type;
默认: default_type text/plain;
配置块: http、 server、 location

当找不到相应的MIME type与文件扩展名之间的映射时, 使用默认的MIME type作为
HTTP header中的Content-Type。

3. types_hash_bucket_size
语法: types_hash_bucket_size size;
默认: types_hash_bucket_size 32|64|128;
配置块: http、 server、 location

为了快速寻找到相应MIME type, Nginx使用散列表来存储MIME type与文件扩展名。
types_hash_bucket_size设置了每个散列桶占用的内存大小。

4. types_hash_max_size
语法: types_hash_max_size size;
默认: types_hash_max_size 1024;
配置块: http、 server、 location

types_hash_max_size影响散列表的冲突率。 types_hash_max_size越大, 就会消耗更多的内
存, 但散列key的冲突率会降低, 检索速度就更快。 types_hash_max_size越小, 消耗的内存就
越小, 但散列key的冲突率可能上升。

对客户端请求的限制

下面介绍对客户端请求的限制的配置项:

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方法是允许的。

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”)响应给客户端。

3. 对请求的限速
语法: limit_rate speed;
默认: limit_rate 0;
配置块: http、 server、 location、 if

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

server {
	if ($slow) {
		set $limit_rate 4k;
	}
}
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. sendfile系统调用
语法: sendfile on|off;
默认: sendfile off;
配置块: http、 server、 location

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

2. AIO系统调用
语法: aio on|off;
默认: aio off;
配置块: http、 server、 location

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

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

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

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

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

5. 打开文件缓存
语法: open_file_cache max=N[inactive=time]|off;
默认: open_file_cache off;
配置块: http、 server、 location

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

  • 文件句柄、 文件大小和上次修改时间。
  • 已经打开过的目录结构。
  • 没有找到的或者没有权限操作的文件信息。
    这样, 通过读取缓存就减少了对磁盘的操作。

该配置项后面跟3种参数:

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

例如:
open_file_cache max=1000 inactive=20s;
6. 是否缓存打开文件错误的信息
语法: open_file_cache_errors on|off;
默认: open_file_cache_errors off;
配置块: http、 server、 location

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

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指定的最小次数, 那么将不会被淘汰出缓存。

8. 检验缓存中元素有效性的频率
语法: open_file_cache_valid time;
默认: open_file_cache_valid 60s;
配置块: http、 server、 location

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

对客户端请求的特殊处理

下面介绍对客户端请求的特殊处理的配置项:

1. 忽略不合法的HTTP头部
语法: ignore_invalid_headers on|off;
默认: ignore_invalid_headers on;
配置块: http、 server

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

2. HTTP头部是否允许下划线
语法: underscores_in_headers on|off;
默认: underscores_in_headers off;
配置块: http、 server

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

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。
4. 文件未找到时是否记录到error日志
语法: log_not_found on|off;
默认: log_not_found on;
配置块: http、 server、 location

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

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。

6. DNS解析地址
语法: resolver address...;
配置块: http、 server、 location

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

resolver 127.0.0.1 192.0.2.1;
7. DNS解析的超时时间
语法: resolver_timeout time;
默认: resolver_timeout 30s;
配置块: http、 server、 location

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

8. 返回错误页面时是否在Server中注明Nginx版本
语法: server_tokens on|off;
默认: server_tokens on;
配置块: http、 server、 location

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

猜你喜欢

转载自blog.csdn.net/u013068377/article/details/82821662