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

2024-08-27 23:58

本文主要是介绍nginx教程第六篇:用HTTP核心模块配置一个静态Web服务器(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

承接上篇文章: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...{...}
配置块: locationnginx通过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版本, 这是为了方便定位问
题。

这篇关于nginx教程第六篇:用HTTP核心模块配置一个静态Web服务器(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113154

相关文章

IDEA中配置Tomcat全过程

《IDEA中配置Tomcat全过程》文章介绍了在IDEA中配置Tomcat的六步流程,包括添加服务器、配置部署选项、设置应用服务器及启动,并提及Maven依赖可能因约定大于配置导致问题,需检查依赖版本... 目录第一步第二步第三步第四步第五步第六步总结第一步选择这个方框第二步选择+号,找到Tomca

Win10安装Maven与环境变量配置过程

《Win10安装Maven与环境变量配置过程》本文介绍Maven的安装与配置方法,涵盖下载、环境变量设置、本地仓库及镜像配置,指导如何在IDEA中正确配置Maven,适用于Java及其他语言项目的构建... 目录Maven 是什么?一、下载二、安装三、配置环境四、验证测试五、配置本地仓库六、配置国内镜像地址

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Debian系和Redhat系防火墙配置方式

《Debian系和Redhat系防火墙配置方式》文章对比了Debian系UFW和Redhat系Firewalld防火墙的安装、启用禁用、端口管理、规则查看及注意事项,强调SSH端口需开放、规则持久化,... 目录Debian系UFW防火墙1. 安装2. 启用与禁用3. 基本命令4. 注意事项5. 示例配置R

Python极速搭建局域网文件共享服务器完整指南

《Python极速搭建局域网文件共享服务器完整指南》在办公室或家庭局域网中快速共享文件时,许多人会选择第三方工具或云存储服务,但这些方案往往存在隐私泄露风险或需要复杂配置,下面我们就来看看如何使用Py... 目录一、android基础版:HTTP文件共享的魔法命令1. 一行代码启动HTTP服务器2. 关键参

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地