在這一篇文章里,我將先容nginx關于location的處理懲罰,各人都知道Nginx設置文件內里會有許多的location,nginx的設置指令的浸染域可以分為 main,server,location這3個種,實際上這3者不是依次包括的干系,而是彼此獨立的干系,好比一個只具有main級別浸染域的指令,是不能寫在某個server可能location內的,模塊的某個指令可以同時具有main,server,location這3種浸染域,別的每個模塊有 main,srv,loc這3個級此外設置,一個模塊的main級此外設置對所有的server和location都是共享的,srv級此外設置對所有 location都是共享的,location只有本身獨立的loc級此外設置,這就是為什么一個模塊的srv和loc級此外設置需要merge,而 main級此外設置不需要merge的原因。這里看起來有點繞,區分一下main,server,location別離作為一種浸染域級別和一個主體,雷同于形容詞和名字的區別,nginx的設置干系照舊不難領略的。
一般來說一個請求url過來,nginx會將它理會到某一個location來處理懲罰。這個理會的進程實際上按照location的設置根基可以分為字符串匹配和正則表達式匹配這2種。對付location的組織方法,最簡樸的就是直接將它們生存為一個鏈表,理會url的時候一個一個遍歷即可找到相應location,可是這樣效率太低,對像nginx這種高機能的處事器來說是完全不行取的,nginx將字符串匹配的location組織成了一個三叉的字符串排序樹,并且成立的時候也思量了樹的均衡性。文章后頭我講具體先容源碼的實現。
首先我來或許的先容一下location的種類和匹配法則,以nginx wiki(http://wiki.nginx.org/HttpCoreModule#location)的例子做說明:
location = / {
# matches the query / only.
[ configuration A ]
}
location / {
# matches any query, since all queries begin with /, but regular
# expressions and any longer conventional blocks will be
# matched first.
[ configuration B ]
}
location ^~ /images/ {
# matches any query beginning with /images/ and halts searching,
# so regular expressions will not be checked.
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# matches any request ending in gif, jpg, or jpeg. However, all
# requests to the /images/ directory will be handled by
# Configuration C.
[ configuration D ]
}
location @named {
# Such locations are not used during normal processing of requests,
# they are intended only to process internally redirected requests (for example error_page, try_files).
[ configuration E ]
}
可以看到上面的例子中有5種差異范例的location,個中第4個帶 “~” 號前綴的為需要正則匹配的location,nginx在舉辦url理會時對這5種差異范例的location具有差異的優先級法則,大抵的法則如下:
1,字符串準確匹配到一個帶 “=” 號前綴的location,則遏制,且利用這個location的設置;
2,字符串匹配剩下的非正則和非非凡location,假如匹配到某個帶 "^~" 前綴的location,則遏制;
3,正則匹配,匹配順序為location在設置文件中呈現的順序。假如匹配到某個正則location,則遏制,并利用這個location的設置;不然,利用步調2中獲得的具有最大字符串匹配的location設置。
譬喻,對下面的請求有:
1, / -> 準確匹配到第1個location,匹配遏制,利用configuration A
2,/some/other/url -> 首先前綴部門字符串匹配到了第2個location,然后舉辦正則匹配,顯然沒有匹配上,則利用第2個location的設置configurationB
3,/images /1.jpg -> 首先前綴部門字符串匹配到了第2個location,可是接著對第3個location也前綴匹配上了,并且這時已經是設置文件內里對這個url的最大字符串匹配了,而且location帶有 "^~" 前綴,則不再舉辦正則匹配,最終利用configuration C
4,/some/other/path/to/1.jpg -> 首先前綴部門同樣字符串匹配到了第2個location,然后舉辦正則匹配,這時正則匹配樂成,則利用congifuration D