一、Nginx架构基础
- Nginx整体由内核+模块组成,内核极简轻量化,仅负责核心调度工作:接收客户端请求、解析配置文件、匹配location块、分发请求至对应模块处理,不负责具体业务逻辑。Nginx所有核心功能均由模块实现,扩展性极强。
- Nginx模块分类
- 从结构维度分为:基础模块、核心模块、第三方模块;
- 从功能维度分为三类,覆盖绝大多数业务场景:
- Handlers处理器模块:直接处理客户端请求,完成资源读取、内容输出、响应头修改等核心操作,单次请求仅触发一个处理器模块
- Filters过滤器模块:对处理器模块输出的内容进行二次加工(压缩、替换、缓存处理等),最终由Nginx返回给客户端
- Proxies代理模块:核心为HTTP Upstream模块,实现反向代理、负载均衡、后端服务交互(FastCGI、Tomcat、gRPC等),是微服务架构的核心支撑
二、核心指令详解
- http 指令(全局核心块)
作用:Nginx配置文件的顶层核心模块,用于定义所有HTTP服务的全局配置,全局生效,包含连接超时、缓存、文件传输、MIME类型、日志、变量定义等通用规则,所有server虚拟主机均嵌套在http块内。
语法与上下文
- 语法:
http { ... } - 上下文:main(主配置层级),仅可在全局配置中出现一次
- 语法:
常用全局配置参数
1 | http { |
- server 指令(虚拟主机块)
作用:用于定义虚拟主机,实现单服务器部署多个网站、多个域名、多个端口服务,每个server块对应一个独立的Web服务实例。
核心语法
1 | server { |
- 关键参数说明
- listen:指定服务监听端口,
default_server标记为默认虚拟主机,匹配所有未精准匹配的请求 - server_name:匹配请求域名,支持精准域名、泛域名(
*.xxx.com)、正则域名 - default_server:同一端口下多个server时,未匹配到域名的请求由默认主机处理
- 变量使用实战:支持自定义变量、引用内置变量,实现动态配置:
1 | http { |
- location 指令(路由匹配核心)
作用:基于请求URI匹配客户端请求,对不同路径、不同后缀的请求执行差异化配置(静态资源处理、反向代理、权限控制、缓存、限流等),是Nginx路由分发的核心。
完整匹配语法
语法:
location [=|^~|~|~*|!~|!~*] /uri/ { … }各匹配符号优先级与含义(从高到低):
- =:精确匹配,仅完全一致的URI生效,优先级最高
- ^~:前缀匹配,匹配URI开头路径,匹配成功后终止正则匹配,优先用于静态目录
- ~:区分大小写正则匹配
- ~*:不区分大小写正则匹配
- !~/!~*:区分/不区分大小写的正则排除匹配
- /:通用默认匹配,所有未匹配到的请求最终命中
严格匹配优先级规则:精确匹配(=) > 前缀匹配(^~) > 顺序正则匹配(~/~*) > 通用匹配(/)
经典实战配置
1 | # 1. 精准匹配根路径,加速首页访问 |
- 易错点说明
- 前缀匹配
^~可阻断后续正则匹配,适合固定目录的静态资源,性能最优; - 正则匹配按配置文件从上到下顺序生效,匹配到即终止;
- 通用匹配
/为兜底规则,仅所有规则不匹配时生效。
- 前缀匹配
- rewrite 指令(URL重写与重定向)
模块说明:由ngx_http_rewrite_module 模块提供,基于PCRE正则表达式实现URI重写、请求重定向、参数改写,是Nginx伪静态、域名跳转、路径适配的核心指令。
完整语法
rewrite regex replacement [flag];
- regex:匹配原始请求URI的正则表达式
- replacement:重写后的新URI/域名路径
- flag:跳转终止标记(核心四大参数)
- Flag参数核心区别(重点)
- last:匹配完成后,终止当前rewrite规则,重新发起location匹配,多用于内部URL重写
- break:匹配完成后,终止所有rewrite和location匹配,直接使用当前规则结果,请求内部消化
- redirect:返回 302临时重定向,浏览器地址栏变更,搜索引擎不收录
- permanent:返回 301永久重定向,浏览器永久缓存跳转规则,利于SEO
- 实战场景:域名永久/临时跳转
需求:将 rewrite.com 所有请求跳转至 nginx.com
1 | # 配置hosts本地解析测试 |
常用拓展场景
- 目录自动补全斜杠:
1 | if (-d $request_filename){ |
- 禁止访问隐藏文件(.htaccess):
1 | location ~/\.ht { |
- upstream 指令(负载均衡核心)
作用:定义后端服务集群列表,实现请求分发、负载均衡、服务容错、健康检查,常用于多服务器集群、微服务网关场景,必须配置在http块内。
基础语法
1 | http { |
- 主流负载均衡策略
- 轮询(默认):请求按顺序依次分发至后端节点
- weight权重:权重越高,分发请求越多,适配不同性能服务器
- ip_hash:根据客户端IP哈希分发,保证同一客户端固定访问同一节点,解决session共享问题
- least_conn:最少连接策略,请求分发至当前连接数最少的节点
ip_hash实战配置:
1 | upstream backend_server { |
三、Nginx常用内置变量(高频)
所有指令均可引用内置变量,实现动态配置,常用核心变量如下:
- $host:请求主机域名/IP
- $remote_addr:客户端真实IP
- $request_uri:完整请求URI(含参数)
- $uri:不含参数的请求URI
- $args:请求参数
- $request_method:请求方式(GET/POST)
- $http_user_agent:客户端浏览器标识
四、参考文档
- Nginx官方指令索引:http://nginx.org/en/docs/dirindex.html
- Nginx location配置详解:https://blog.csdn.net/tjcyjd/article/details/50897959
- Nginx核心模块官方文档:http://nginx.org/en/docs/http/ngx_http_core_module.html\#server