在這一篇文章里,我將先容nginx關(guān)于location的處理懲罰,各人都知道Nginx設(shè)置文件內(nèi)里會(huì)有許多的location,nginx的設(shè)置指令的浸染域可以分為 main,server,location這3個(gè)種,實(shí)際上這3者不是依次包括的干系,而是彼此獨(dú)立的干系,好比一個(gè)只具有main級(jí)別浸染域的指令,是不能寫在某個(gè)server可能location內(nèi)的,模塊的某個(gè)指令可以同時(shí)具有main,server,location這3種浸染域,別的每個(gè)模塊有 main,srv,loc這3個(gè)級(jí)此外設(shè)置,一個(gè)模塊的main級(jí)此外設(shè)置對(duì)所有的server和location都是共享的,srv級(jí)此外設(shè)置對(duì)所有 location都是共享的,location只有本身獨(dú)立的loc級(jí)此外設(shè)置,這就是為什么一個(gè)模塊的srv和loc級(jí)此外設(shè)置需要merge,而 main級(jí)此外設(shè)置不需要merge的原因。這里看起來(lái)有點(diǎn)繞,區(qū)分一下main,server,location別離作為一種浸染域級(jí)別和一個(gè)主體,雷同于形容詞和名字的區(qū)別,nginx的設(shè)置干系照舊不難領(lǐng)略的。
一般來(lái)說(shuō)一個(gè)請(qǐng)求url過(guò)來(lái),nginx會(huì)將它理會(huì)到某一個(gè)location來(lái)處理懲罰。這個(gè)理會(huì)的進(jìn)程實(shí)際上按照l(shuí)ocation的設(shè)置根基可以分為字符串匹配和正則表達(dá)式匹配這2種。對(duì)付location的組織方法,最簡(jiǎn)樸的就是直接將它們生存為一個(gè)鏈表,理會(huì)url的時(shí)候一個(gè)一個(gè)遍歷即可找到相應(yīng)location,可是這樣效率太低,對(duì)像nginx這種高機(jī)能的處事器來(lái)說(shuō)是完全不行取的,nginx將字符串匹配的location組織成了一個(gè)三叉的字符串排序樹,并且成立的時(shí)候也思量了樹的均衡性。文章后頭我講具體先容源碼的實(shí)現(xiàn)。
首先我來(lái)或許的先容一下location的種類和匹配法則,以nginx wiki(http://wiki.nginx.org/HttpCoreModule#location)的例子做說(shuō)明:
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,個(gè)中第4個(gè)帶 “~” 號(hào)前綴的為需要正則匹配的location,nginx在舉辦url理會(huì)時(shí)對(duì)這5種差異范例的location具有差異的優(yōu)先級(jí)法則,大抵的法則如下:
1,字符串準(zhǔn)確匹配到一個(gè)帶 “=” 號(hào)前綴的location,則遏制,且利用這個(gè)location的設(shè)置;
2,字符串匹配剩下的非正則和非非凡location,假如匹配到某個(gè)帶 "^~" 前綴的location,則遏制;
3,正則匹配,匹配順序?yàn)閘ocation在設(shè)置文件中呈現(xiàn)的順序。假如匹配到某個(gè)正則location,則遏制,并利用這個(gè)location的設(shè)置;不然,利用步調(diào)2中獲得的具有最大字符串匹配的location設(shè)置。
譬喻,對(duì)下面的請(qǐng)求有:
1, / -> 準(zhǔn)確匹配到第1個(gè)location,匹配遏制,利用configuration A
2,/some/other/url -> 首先前綴部門字符串匹配到了第2個(gè)location,然后舉辦正則匹配,顯然沒有匹配上,則利用第2個(gè)location的設(shè)置configurationB
3,/images /1.jpg -> 首先前綴部門字符串匹配到了第2個(gè)location,可是接著對(duì)第3個(gè)location也前綴匹配上了,并且這時(shí)已經(jīng)是設(shè)置文件內(nèi)里對(duì)這個(gè)url的最大字符串匹配了,而且location帶有 "^~" 前綴,則不再舉辦正則匹配,最終利用configuration C
4,/some/other/path/to/1.jpg -> 首先前綴部門同樣字符串匹配到了第2個(gè)location,然后舉辦正則匹配,這時(shí)正則匹配樂成,則利用congifuration D