前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nginx模块之核心模块(中)

nginx模块之核心模块(中)

作者头像
yxxhero
发布2022-05-31 19:21:00
5590
发布2022-05-31 19:21:00
举报
文章被收录于专栏:DevOps充电宝

nginx模块之核心模块(中)

在Nginx核心模块第一节中,我们介绍了包括静态目录配置、限速以及各种优化参数等各种配置,都是我们在日常业务配置中经常遇到的,今天我们来介绍一下最常出现也最重要的location指令,该指令在路由多服务分发方面起到举足轻重的作用,如今微服务大行其道,localtion的灵活运用也成为了精通nginx必须踏过的一道门槛,下面就让我们一起来学习并掌握它吧!

1. location的作用

配置语法:location [ = | ~ | ~* | ^~ ] uri { ... }或者 location @name { ... }; 配置上下文: server, location。 简单说,location就是匹配请求URI来进行不同处理,由语法可知,location支持4种不同的匹配方式,以及如何定义命名location。 nginx的location匹配是针对规范化URI进行的。nginx将会对%XX表单中编码的文本进行解码,解除对相对路径组件的引用,即'.'和'..'的解引用,同时会对两个或多个相邻斜杠压缩为单个斜杠从而形成规范化URI,便于location指令的匹配处理。

2. location配置规则之正则匹配

location的正则匹配主要分为两种配置格式,分别是区分大小写和不区分大小写匹配。示例:

代码语言:javascript
复制
# 1.不区分大小写
location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E  ]
}
# 2.区分大小写
location ~ \.(gif|jpg|jpeg)$ {
    [ configuration E  ]
}

~~*都为正则匹配,~*主要功能为不区分大小写,在实际使用过程中,我们可以根据自己的需求选择即可,在正则匹配中,同样可以使用正则捕获,捕获的值可以在后续配置过程中使用。

3. location配置规则之前缀匹配

前缀匹配同样也有两种格式,主要区别在于是否有^~修饰符的存在。示例:

代码语言:javascript
复制
# 无^~修饰符
location /documents/ {
    [ configuration C  ]
}
# 有^~修饰符
location ^~ /documents/ {
    [ configuration C  ]
}

这两种写法在作用都是匹配/documents/开头的请求URI,区别在于匹配优先级规则方面,当^~修饰符存在时,nginx检查所有前缀匹配, 最长前缀匹配即为匹配终点,不再进行正则匹配的检查。如果不存在^~,nginx将会暂存最长的前缀匹配,然后进行正则匹配检查,如果正则匹配有命中,则返回正则匹配,否则返回已记录的最长前缀匹配。

4. location匹配之精确匹配

location精确匹配: 修饰符为=,顾名思义就是当请求URI完全匹配时,精确匹配规则立即返回,不再进行其他匹配规则的检查。 示例:

代码语言:javascript
复制
location = / {    [ configuration A  ]}

5. location配置规则的优先级

1.精确匹配

2.前缀匹配

3.正则匹配 nginx的基本的搜索规则如上所示,但在前缀匹配中,^~修饰符可影响最终结果,故总结如下:

nginx在匹配中优先进行精确匹配,一旦匹配成功,立即返回。如果精确匹配未命中则进行前缀匹配,在所有匹配的前缀匹配中暂存最长的前缀匹配,如果前缀匹配有^~修饰符,则立即将最长匹配返回,如果没有^~修饰符,则继续进行正则匹配,如果正则匹配有命中,则直接返回匹配的正则匹配,否则返回暂存的最长前缀匹配。如果以上匹配规则都未命中,则返回404响应。

6. location前缀匹配的隐藏逻辑

如果location是以斜杠字符结尾的前缀匹配,并且请求由proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pa或grpc_pass中的一个处理,则将执行特殊处理逻辑。对于请求URI等于前缀字符串但不带斜杠的请求,重定向至前缀字符串并带有斜杠的301响应将返回至客户端。如果不希望这样,则可以这样定义URI和location的完全匹配:

代码语言:javascript
复制
location /user/ {
    proxy_pass http://user.example.com;
}
# 精确匹配/user, 避免隐藏逻辑的处理
location = /user {
    proxy_pass http://login.example.com;
}

7. location的嵌套

nginx的location其实支持嵌套逻辑的,但是在精确匹配和命名localtion中是不允许的,在location的嵌套中,规则未变,但是不推荐使用。

8. location配置优化

1.配置location时坚持最窄优先的原则,即最常用的匹配尽量放在优先级高的匹配规则中,尤其是在正则匹配中,可以减少uri匹配的次数,提高nginx的处理效率;

2.由于正则匹配的灵活性,其出现频率很高,但是额外的正则处理将会消耗cpu资源,此时我们可以在main配置段中开启pcre_jit on; 1.1.12版本开始支持,其可以显著加快正则表达式的处理速度。

9. 总结

location的配置是nginx的重中之重,我们需要认真学习,仔细消化。不做location配置的奴隶,加油!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps充电宝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • nginx模块之核心模块(中)
    • 1. location的作用
      • 2. location配置规则之正则匹配
        • 3. location配置规则之前缀匹配
          • 4. location匹配之精确匹配
            • 5. location配置规则的优先级
              • 6. location前缀匹配的隐藏逻辑
                • 7. location的嵌套
                  • 8. location配置优化
                    • 9. 总结
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档