0%

nginx指令详解

一、Nginx架构基础

  1. Nginx整体由内核+模块组成,内核极简轻量化,仅负责核心调度工作:接收客户端请求、解析配置文件、匹配location块、分发请求至对应模块处理,不负责具体业务逻辑。Nginx所有核心功能均由模块实现,扩展性极强。
  2. Nginx模块分类
  • 从结构维度分为:基础模块、核心模块、第三方模块;
  • 从功能维度分为三类,覆盖绝大多数业务场景:
  • Handlers处理器模块:直接处理客户端请求,完成资源读取、内容输出、响应头修改等核心操作,单次请求仅触发一个处理器模块
  • Filters过滤器模块:对处理器模块输出的内容进行二次加工(压缩、替换、缓存处理等),最终由Nginx返回给客户端
  • Proxies代理模块:核心为HTTP Upstream模块,实现反向代理、负载均衡、后端服务交互(FastCGI、Tomcat、gRPC等),是微服务架构的核心支撑

二、核心指令详解

  1. http 指令(全局核心块)
  • 作用:Nginx配置文件的顶层核心模块,用于定义所有HTTP服务的全局配置,全局生效,包含连接超时、缓存、文件传输、MIME类型、日志、变量定义等通用规则,所有server虚拟主机均嵌套在http块内。

  • 语法与上下文

    • 语法:http { ... }
    • 上下文:main(主配置层级),仅可在全局配置中出现一次
  • 常用全局配置参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
http {
# 引入MIME类型配置文件
include mime.types;
# 默认响应MIME类型
default_type application/octet-stream;

# 开启高效文件传输
sendfile on;
# 开启TCP长连接优化
keepalive_timeout 65;

# 客户端请求头/请求体缓冲区配置
client_header_buffer_size 1k;
client_body_buffer_size 8k;
# 最大请求体大小(超出返回413)
client_max_body_size 10m;

# 自定义全局变量
set $global_env "prod";

# 所有虚拟主机配置均嵌套在此
server { ... }
}
  1. server 指令(虚拟主机块)
  • 作用:用于定义虚拟主机,实现单服务器部署多个网站、多个域名、多个端口服务,每个server块对应一个独立的Web服务实例。

  • 核心语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
# 监听端口,支持IP:端口、纯端口、IPv6、UNIX套接字
listen 80 default_server;
# 绑定域名,支持多个域名、泛域名
server_name www.xxx.com xxx.com;

# 网站根目录
root /data/www/xxx;
# 默认访问文件
index index.html index.php index.htm;

# 嵌套location路由规则
location / { ... }
}
  • 关键参数说明
  • listen:指定服务监听端口,default_server 标记为默认虚拟主机,匹配所有未精准匹配的请求
  • server_name:匹配请求域名,支持精准域名、泛域名(*.xxx.com)、正则域名
  • default_server:同一端口下多个server时,未匹配到域名的请求由默认主机处理
  • 变量使用实战:支持自定义变量、引用内置变量,实现动态配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
http {
server {
listen 80;
server_name example.com;

# 自定义局部变量
set $my_var "Hello, Nginx!";

location / {
# 自定义响应头
add_header X-My-Header $my_var;
# 直接返回变量内容
return 200 $my_var;
}
}
}
  1. location 指令(路由匹配核心)
  • 作用:基于请求URI匹配客户端请求,对不同路径、不同后缀的请求执行差异化配置(静态资源处理、反向代理、权限控制、缓存、限流等),是Nginx路由分发的核心。

  • 完整匹配语法

    • 语法:location [=|^~|~|~*|!~|!~*] /uri/ { … }

    • 各匹配符号优先级与含义(从高到低):

      • =:精确匹配,仅完全一致的URI生效,优先级最高
      • ^~:前缀匹配,匹配URI开头路径,匹配成功后终止正则匹配,优先用于静态目录
      • ~:区分大小写正则匹配
      • ~*:不区分大小写正则匹配
      • !~/!~*:区分/不区分大小写的正则排除匹配
      • /:通用默认匹配,所有未匹配到的请求最终命中
    • 严格匹配优先级规则:精确匹配(=) > 前缀匹配(^~) > 顺序正则匹配(~/~*) > 通用匹配(/)

  • 经典实战配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 1. 精准匹配根路径,加速首页访问
location = / {
proxy_pass http://tomcat:8080/index;
}

# 2. 前缀匹配静态资源目录,优先命中,不执行正则
location ^~ /static/ {
root /webroot/static/;
expires 7d; # 静态资源缓存7天
}

# 3. 正则匹配静态文件后缀(不区分大小写)
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
expires 3d;
access_log off; # 关闭静态资源日志,减轻压力
}

# 4. 通用匹配,转发动态请求至后端服务
location / {
proxy_pass http://tomcat:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
  • 易错点说明
    • 前缀匹配 ^~ 可阻断后续正则匹配,适合固定目录的静态资源,性能最优;
    • 正则匹配按配置文件从上到下顺序生效,匹配到即终止;
    • 通用匹配 / 为兜底规则,仅所有规则不匹配时生效。
  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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 配置hosts本地解析测试
# 127.0.0.1 rewrite.com
# 127.0.0.1 nginx.com

# 目标服务
server {
listen 80;
server_name nginx.com;
root /your_path/nginx;
index index.php index.html index.htm;
}

# 跳转服务
server {
listen 80;
server_name rewrite.com;
root /your_path/rewrite;
# 永久重定向 301
rewrite ^/(.*) http://nginx.com/$1 permanent;
# 临时重定向 302
# rewrite ^/(.*) http://nginx.com/$1 redirect;
index index.php index.html index.htm;
}
  • 常用拓展场景

    • 目录自动补全斜杠:
1
2
3
if (-d $request_filename){
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}
  • 禁止访问隐藏文件(.htaccess):
1
2
3
location ~/\.ht {
deny all;
}
  1. upstream 指令(负载均衡核心)
  • 作用:定义后端服务集群列表,实现请求分发、负载均衡、服务容错、健康检查,常用于多服务器集群、微服务网关场景,必须配置在http块内。

  • 基础语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
http {
# 定义后端服务集群,命名为backend_server
upstream backend_server {
# 后端服务地址 + 权重,默认轮询
server 127.0.0.1:8080 weight=3;
server 127.0.0.1:8081 weight=2;
# 备用节点,主节点故障时生效
server 127.0.0.1:8082 backup;
# 故障节点,不再分发请求
server 127.0.0.1:8083 down;
}

server {
listen 80;
server_name lb.xxx.com;

location / {
# 反向代理至upstream集群
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
  • 主流负载均衡策略
  • 轮询(默认):请求按顺序依次分发至后端节点
  • weight权重:权重越高,分发请求越多,适配不同性能服务器
  • ip_hash:根据客户端IP哈希分发,保证同一客户端固定访问同一节点,解决session共享问题
  • least_conn:最少连接策略,请求分发至当前连接数最少的节点

ip_hash实战配置:

1
2
3
4
5
upstream backend_server {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}

三、Nginx常用内置变量(高频)

所有指令均可引用内置变量,实现动态配置,常用核心变量如下:

  1. $host:请求主机域名/IP
  2. $remote_addr:客户端真实IP
  3. $request_uri:完整请求URI(含参数)
  4. $uri:不含参数的请求URI
  5. $args:请求参数
  6. $request_method:请求方式(GET/POST)
  7. $http_user_agent:客户端浏览器标识

四、参考文档

  1. Nginx官方指令索引:http://nginx.org/en/docs/dirindex.html
  2. Nginx location配置详解:https://blog.csdn.net/tjcyjd/article/details/50897959
  3. Nginx核心模块官方文档:http://nginx.org/en/docs/http/ngx_http_core_module.html\#server