1. 程式人生 > >掌握nginx的location優先級

掌握nginx的location優先級

ons 用戶 work 不能 list png file src location

  • 前言
    近幾年nginx在企業上的應用很廣泛,但很多朋友還是不知道nginx的location優先級,如果不能清晰的掌握nginx的location優先級,就會在配置nginx的時候引起錯誤的跳轉,錯誤的跳轉往往就是一次嚴重的線上事故。因此,掌握nginx的location優先級非常重要。

  • 先來一個最簡單的nginx配置

    worker_processes  1;
    events {
    worker_connections  1024;
    }
    http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
    server {
        listen 80;
        location / {
            return 400;
        }
    }
    }
  • location /是通配的,也就是所以請求都能匹配,但它的優先級我們暫時還不知道。請求結果如下:
    技術分享圖片

    • 多個通配的優先級測試,加入location /test

                  location / {
                          return 400;
                  }
                  location /test {
                          return 401;
                  }

      加入location /test,我們故意把位置放到location /以下,來驗證優先級。請求結果如下,返回401,從結果可以看出來/test的優先級高於location /。不過用戶的訪問要以/test開頭,不是以/test開頭還是命中到location /:

      技術分享圖片

    • location正則的優先級測試,我們加入~ ^/test,使用正則匹配以test開頭的

                  location / {
                          return 400;
                  }
                  location /test {
                          return 401;
                  }
                  location ~ ^/test {
                          return 402;
                  }

      加入location ~ ^/test,我們故意再把它放到最後,來驗證優先級。請求結果如下,返回402,從結果可以看出來正則的優先級要大於location /和location /test,也就是正則location大於通配location

      技術分享圖片

    • 多個正則的優先級測試,我們使用兩個正則,主要是來驗證下,是不是正則配置得越多,優先級就越高。如下的配置

                 location ~ ^/test {
                          return 402;
                  }
      
                  location ~ ^/test/aaa {
                          return 403;
                  }

      加入^/test/aaa,我們一樣把它放到最後,請求/test/aaa。結果返回402,也就是匹配到第一個正則後,底下的正則不會再去匹配。由於請求/test/aaa,命中^/test,所以底下的正則就無效了:
      技術分享圖片

    • 我們加入精準匹配,也就是nginx的=,我們來測試下精準匹配的優先級

                  location ~ ^/test/aaa {
                          return 403;
                  }
      
                  location = /test/aaa {
                          return 404;
                  }

      我們故意把= /tmp/aaa放到最後,這個只能匹配到/test/aaa的請求,得到的結果如下,返回404。這個說明了,精準匹配=的優先級是最高的,不管它放到哪裏。
      技術分享圖片

    • 問題1:為什麽我的nginx設置了全局跳轉,但怎麽不生效?

                  location / {
                          rewrite xxx xxxx;
                  }
      
                  location ~* ^/test {
                          return 402;
                  }

      如果是以上的跳轉配置的話,大家根據優先級來,可以發現location /的優先級是最低的,所以全局跳轉不生效。因為當用戶訪問到/test/xx的時候,命中到其它location了。所以全局跳轉的話,保留一個location /即可。

    • 問題2:為什麽我的nginx動靜分離配置失敗了?

                  location ~ ^/test {
                          root xxxx;
                  }
      
                  location ~ \.jsp$ {
                          proxy_pass xxxx;
                  }

      如果是以上配置的話,當用戶訪問到/test/xxx.jsp的時候,就命令到location ~ ^/test了。所以動靜分離如果都使用正則的話,需要註意location的放置位置。

    掌握nginx的location優先級