美文网首页nginx365日更挑战
日更第10日: (翻)nginx调优之location尽可能的精

日更第10日: (翻)nginx调优之location尽可能的精

作者: 微凉哇 | 来源:发表于2021-10-22 11:57 被阅读0次

    location尽可能的精确配置

    原文地址

    解释说明

    精确的location匹配通常被用来加快选择过程,匹配通过后立即结束算法的执行。

    使用=修饰符可以定义URIlocation的精确匹配。它的处理速度非常快,可以节省大量的CPU开销。

    location = / {
    
      ...
    
    }
    
    # Matches the query /v9 only and stops searching:
    location = /v9 {
    
      ...
    
    }
    
    ...
    

    如果找到精确匹配,则搜索终止。 例如,存在/请求,并且请求的频率比较高,则可以定义location = /加快这些请求的处理速度。

    关于nginx location匹配顺序

    例子来源以下地址

    https://github.com/trimstray/nginx-admins-handbook#introduction

    假设配置如下

    server {
    
         listen           80;
         server_name      xyz.com www.xyz.com;
        
         location ~ ^/(media|static)/ {
          root            /var/www/xyz.com/static;
          expires         10d;
         }
        
         location ~* ^/(media2|static2) {
          root            /var/www/xyz.com/static2;
          expires         20d;
         }
        
         location /static3 {
          root            /var/www/xyz.com/static3;
         }
        
         location ^~ /static4 {
          root            /var/www/xyz.com/static4;
         }
        
         location = /api {
          proxy_pass      http://127.0.0.1:8080;
         }
        
         location / {
          proxy_pass      http://127.0.0.1:8080;
         }
        
         location /backend {
          proxy_pass      http://127.0.0.1:8080;
         }
        
         location ~ logo.xcf$ {
          root            /var/www/logo;
          expires         48h;
         }
        
         location ~* .(png|ico|gif|xcf)$ {
          root            /var/www/img;
          expires         24h;
         }
        
         location ~ logo.ico$ {
          root            /var/www/logo;
          expires         96h;
         }
        
         location ~ logo.jpg$ {
          root            /var/www/logo;
          expires         48h;
         }  
    }
    

    匹配规则如下

    请求URL 相匹配的location 最终匹配
    / 1) prefix match for / /
    /css 1) prefix match for / /
    /api 1) exact match for /api /api
    /api/ 1) prefix match for / /
    /backend 1) prefix match for /2) prefix match for /backend /backend
    /static 1) prefix match for / /
    /static/header.png 1) prefix match for /2) case sensitive regex match for ^/(media|static)/ ^/(media|static)/
    /static/logo.jpg 1) prefix match for /2) case sensitive regex match for ^/(media|static)/ ^/(media|static)/
    /media2 1) prefix match for /2) case insensitive regex match for ^/(media2|static2) ^/(media2|static2)
    /media2/ 1) prefix match for /2) case insensitive regex match for ^/(media2|static2) ^/(media2|static2)
    /static2/logo.jpg 1) prefix match for /2) case insensitive regex match for ^/(media2|static2) ^/(media2|static2)
    /static2/logo.png 1) prefix match for /2) case insensitive regex match for ^/(media2|static2) ^/(media2|static2)
    /static3/logo.jpg 1) prefix match for /static32) prefix match for /3) case sensitive regex match for logo.jpg$ logo.jpg$
    /static3/logo.png 1) prefix match for /static32) prefix match for /3) case insensitive regex match for .(png|ico|gif|xcf)$ .(png|ico|gif|xcf)$
    /static4/logo.jpg 1) priority prefix match for /static42) prefix match for / /static4
    /static4/logo.png 1) priority prefix match for /static42) prefix match for / /static4
    /static5/logo.jpg 1) prefix match for /2) case sensitive regex match for logo.jpg$ logo.jpg$
    /static5/logo.png 1) prefix match for /2) case insensitive regex match for .(png|ico|gif|xcf)$ .(png|ico|gif|xcf)$
    /static5/logo.xcf 1) prefix match for /2) case sensitive regex match for logo.xcf$ logo.xcf$
    /static5/logo.ico 1) prefix match for /2) case insensitive regex match for .(png|ico|gif|xcf)$ .(png|ico|gif|xcf)$

    匹配顺序说明

    nginx根据uri进行最优匹配

    • 基于前缀的nginx location匹配(没有正则表达式): 每个location都将根据请求URI进行检查
    • nginx搜索精确的匹配: 如果=修饰符与请求URI完全匹配,则立即选择此特定位置块
    • 如果没有找到精确的位置块(即没有相应的=修饰符),nginx将继续使用非精确的前缀。它从这个URI的最长匹配前缀位置开始,方法如下:
      • 如果最长匹配前缀location^~修饰符,nginx将立即停止搜索并选择该location
      • 假设最长匹配前缀location不使用^~修饰符,匹配将被临时存储,并继续执行
      • 一旦选择并存储了最长匹配前缀locationnginx就会继续计算区分大小写和不敏感的正则表达式location
        第一个匹配URI的正则表达式location将立即被选中来处理请求
      • 如果没有找到匹配请求URI的正则表达式location,则选择先前存储的前缀location来服务请求

    最长匹配解释说明:
    请求为/a/b/c/d时,location Alocation Blocation B为最长匹配

    • location A
    location /a {
        ...
    }
    
    • location B
    location /a/b/c {
        ...
    }
    

    相关文章

      网友评论

        本文标题:日更第10日: (翻)nginx调优之location尽可能的精

        本文链接:https://www.haomeiwen.com/subject/roxboltx.html