掘金 后端 ( ) • 2024-04-15 17:39

1. 什么是Nginx

Nginx是一款广受欢迎且功能强大的开源网络服务器,在我们的日常应用中,主要用于高效地处理HTTP、HTTPS请求。其核心配置项为如下:

image.png

2. events块

Nginx 的 events 块是其配置文件(通常为 nginx.conf)中一个非常重要的部分,用于定义和配置与事件处理模型相关的设置。这些设置直接影响到 Nginx 如何高效地监听并响应客户端连接请求,以及如何处理网络事件(如读写操作)。

位置与作用域:

  • 全局级别:在 nginx.conf 文件的最外层,直接位于 main 部分内。全局 events 块设定的是整个 Nginx 服务器实例的默认事件处理策略。
  • http块内部:可以嵌套在 http 块中,为特定的 HTTP 服务或虚拟主机提供独立的事件处理配置。这种情况下,其配置将覆盖全局 events 块的设置。

events中最重要的两个配置信息是use和worker_connections:

  • use:用于指定事件处理模型(epoll,poll,select)
  • worker_connections: 设置每个工作进程(worker process)能够同时处理的最大连接数。

3. http块

nginx 的 http 块是其配置文件中非常重要的一部分,用于定义与HTTP协议相关的全局设置、服务器块(server)以及更具体的location块(location)。这部分配置直接影响着Nginx如何处理接收到的HTTP请求。

在http块内部,可以设置一系列影响所有服务器块的全局配置选项,包括但不限于:

  • 缓冲区相关配置(http请求header与body的大小设置,这部分是出问题的高频所在)。
  • HTTP模块包含:通过include指令引入其他包含具体HTTP模块配置的文件,便于组织和管理复杂配置。
  • 日志设置:如定义全局的access_log和error_log路径及格式。
  • MIME类型定义:通过types指令设置文件扩展名与MIME类型的映射。
  • 默认字符集:使用charset指令指定默认的HTTP响应字符集。
  • gzip压缩:启用并配置gzip模块,设置压缩级别、压缩类型等。
  • 缓存设置:如果使用了proxy_cache或fastcgi_cache等缓存模块,可以在此配置全局缓存策略。
  • SSL/TLS配置:虽然实际的SSL证书和密钥配置通常在服务器块内,但全局SSL参数(如密码文件、SSL协议版本、Ciphersuite等)可在此定义。
  • 限速与连接管理:设置全局的连接数限制、请求速率限制等。

4. server块

Nginx 的每个 server 块代表一个独立的、逻辑上的 web 服务器,可以为特定的域名或一组域名提供服务。在实际部署中,通过配置多个 server 块,可以在同一台物理或虚拟服务器上托管多个网站,每个网站具有自己的配置规则,如监听端口、根目录、访问控制、SSL 设置等。

server块中的两个核心属性:

  • listen:指定服务器的监听端口
  • server_name:制定服务器的监听域名
server {
    listen          80 sndbuf=640k default_server;
    server_name     a.example.com;
}

对应到一条消息具体的HTTP请求:www.a.example.com/request ,上述server将监听所有a.example.com域名的请求。

5. location块

在Nginx的配置文件中,location 块是非常关键的部分,用于定义对不同URL请求的处理规则,包括但不限于路由、访问控制、内容缓存、重写规则等。对应到一条消息具体的HTTP请求:www.a.example.com/request ,location对应一个/request请求。

location [modifier] pattern {
    # location块内的配置指令
}
  • modifier(可选):修饰符,影响Nginx如何匹配和处理请求。常见的修饰符包括:
    • =:精确匹配。如果请求的URI与指定的pattern完全相同,则优先匹配并立即停止搜索其他location。
    • ^~:前缀匹配。如果请求的URI以指定的pattern开头,且该location没有使用正则表达式,将优先匹配并停止搜索其他正则location。
    • ~:区分大小写的正则表达式匹配。
    • ~*:不区分大小写的正则表达式匹配。
    • !~ 和 !~* 分别表示区分大小写和不区分大小写的正则表达式否定匹配。
  • pattern:匹配规则,可以是普通字符串或正则表达式,用于匹配客户端请求的URI。当Nginx接收到一个请求时,它会根据请求URI依次检查各个location块的pattern,按照上述修饰符的优先级进行匹配。

匹配规则和优先级

  • 精确匹配 ( = ) :具有最高优先级。一旦找到一个精确匹配的location,Nginx将不再检查其他location。
  • 前缀匹配 ( ^~ ) :次高优先级。若请求URI以某个location的前缀字符串开始,并且该location没有使用正则表达式,Nginx将立即选择此location,不再检查其他正则表达式location。
  • 正则表达式匹配 ( ~ ~* ) :按照配置文件中出现的顺序依次检查。一旦找到第一个匹配的正则表达式location,除非有更高优先级的匹配(如精确匹配),否则将使用该location。
  • 通用匹配 (/ 或未指定修饰符) :最低优先级。如果没有其他匹配规则适用,或者所有正则表达式location均未匹配,那么通用匹配location将被选中。

location块内的配置指令

在location块内部,可以放置各种Nginx指令来定义对匹配请求的处理方式,location中可以定制化重写http中的配置:

  • proxy_pass:指定反向代理的上游服务器地址。
  • rootalias:设置请求资源的本地文件系统路径。
  • try_files:尝试按顺序访问多个文件或URI,返回第一个存在的文件或成功处理的URI。
  • index:指定默认首页文件列表。
  • access_logerror_log:配置访问日志和错误日志。
  • allowdeny:基于IP地址控制访问权限。
  • rewrite:定义URL重写规则。
  • expiresproxy_cache:设置响应内容的缓存策略。
  • auth_basicauth_basic_user_file:启用基本身份验证。
  • 以及其他与HTTP处理相关的指令,如返回状态码、设置响应头、限制速率等。