一文解读nginx基础

1. 什么是Nginx

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

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:制定服务器的监听域名
ini 复制代码
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请求。

ini 复制代码
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处理相关的指令,如返回状态码、设置响应头、限制速率等。
相关推荐
Adolf_19931 小时前
Flask-JWT-Extended登录验证, 不用自定义
后端·python·flask
叫我:松哥1 小时前
基于Python flask的医院管理学院,医生能够增加/删除/修改/删除病人的数据信息,有可视化分析
javascript·后端·python·mysql·信息可视化·flask·bootstrap
海里真的有鱼1 小时前
Spring Boot 项目中整合 RabbitMQ,使用死信队列(Dead Letter Exchange, DLX)实现延迟队列功能
开发语言·后端·rabbitmq
工业甲酰苯胺1 小时前
Spring Boot 整合 MyBatis 的详细步骤(两种方式)
spring boot·后端·mybatis
河南宽信李工1503806 16861 小时前
测绘航空摄影专项资质在洛阳市的获取流程
服务器
新知图书2 小时前
Rust编程的作用域与所有权
开发语言·后端·rust
学习向前冲2 小时前
AD域控服务器
运维·服务器
青柠视频云2 小时前
青柠视频云——视频丢包(卡顿、花屏、绿屏)排查
服务器·网络·音视频
hgdlip2 小时前
查看ip地址的方法有几种?探索多样方法
运维·服务器·ip地址
丶21362 小时前
【Nginx】在 Docker 上安装 Nginx 的详细指南
运维·nginx·docker