Nginx靜態(tài)服務(wù)配置---詳解root和alias指令

靜態(tài)文件

Nginx以其高性能著稱逗抑,常用與做前端反向代理服務(wù)器寒亥。同時(shí)nginx也是一個(gè)高性能的靜態(tài)文件服務(wù)器。通常都會(huì)把應(yīng)用的靜態(tài)文件使用nginx處理溉奕。

配置nginx的靜態(tài)文件有兩個(gè)指令,一個(gè) root 和一個(gè) alias加勤。對(duì)于這兩個(gè)指令,是否需要在路徑的后面加上斜杠鳄梅,經(jīng)常容易讓人犯暈,本文通過嘗試不同的匹配規(guī)則戴尸,歸納了一個(gè)比較通用的配置方式。

基本配置

簡(jiǎn)明 Nginx Location Url 配置筆記一文關(guān)于location url配置的實(shí)驗(yàn)一樣孙蒙,本文也使用vagrant虛擬機(jī)里的nginx。其基本配置如下:

/etc/nginx/sites-enabled/pro.conf

server {
        listen 80 default_server;


        server_name localhost;

        access_log /var/log/nginx/pro/access.log;
        error_log /var/log/nginx/pro/error.log;

        error_page 404 /404.html;

        root /vagrant/pro;
        index index.html index.htm;

}

項(xiàng)目的目錄如下:

?  pro  tree
.
├── 403.html
├── 404.html
├── index.html
├── static
│   ├── flask
│   │   └── m.png
│   └── stc.jpg
└── upload
    └── up.png

3 directories, 6 files

分別有兩個(gè)靜態(tài)文件夾香追,一個(gè)是static,另外一個(gè)是upload透典。

初識(shí)root

root 是指定項(xiàng)目的根目錄,適用與server和location顿苇。可以指定多個(gè)岖圈,如果locaiton沒有指定,會(huì)往其外層的server或http中尋找繼承蜂科。

訪問http://192.168.33.10/static/stc.jpg 會(huì)發(fā)現(xiàn)圖片已經(jīng)返回短条。我們還尚未配置 location才菠,為啥會(huì)正確的找到文件?學(xué)習(xí)root或者alias指令的時(shí)候可都,最好的辦法是給文件拓展名加上一個(gè)字符,使得該文件在硬盤中不存在蚓耽,那么就能從nginxerror.log中看到nginx尋找文件的方式。

訪問 http://192.168.33.10/static/stc.jpgx步悠,然后查看 /var/log/nginx/pro/error.log文件,可以看到如下的錯(cuò)誤信息:

2016/09/28 07:41:48 [error] 4416#0: *70 open() "/vagrant/pro/static/stc.jpgx" failed (2: No such file or directory), client: 192.168.33.1, server: localhost, request: "GET /static/stc.jpgx HTTP/1.1", host: "192.168.33.10"

/vagrant/pro/static/stc.jpgx 文件不存在答姥。的確我們沒有這個(gè)文件。如果文件名正確鹦付,就能訪問,原因是由于在server中指定了root /vagrant/pro敲长,此時(shí)的nginx就在該目錄下尋找文件,而url上的地址潘明,正好和文件的路徑一致

 http://192.168.33.10  /static/stc.jpg 
 /vagrant/pro          /static/stc.jpg

由此可以猜想行剂,nginx中root指令的地址,其實(shí)是替換了匹配后的url中的host厚宰。

root指令

為了驗(yàn)證上面的猜想,需要多寫幾個(gè)location做實(shí)驗(yàn)澈蝙。添加一個(gè)location配置如下:

location ^~ /static {
    root /vagrant/pro/static;
}

再次訪問http://192.168.33.10/static/stc.jpg,發(fā)現(xiàn)并不能顯示圖片了灯荧,查看error.log 返回如下:

2016/09/28 07:48:57 [error] 5978#0: *71 open() "/vagrant/pro/static/static/stc.jpg" failed (2: No such file or directory), client: 192.168.33.1, server: localhost, request: "GET /static/stc.jpg HTTP/1.1", host: "192.168.33.10"

nginx把地址識(shí)別成/vargrant/pro/static/static/stc.jpg多了一個(gè)static盐杂,套用上面的規(guī)則哆窿,其組合為192.168.33.10 == /vagrant/pro/static ,url是/static/stc.jpg挚躯。置換可以得到/vagrant/pro/static + /static/stc.jpg。與錯(cuò)誤的error一致码荔。解決方案就是把root中的static去掉,馬上就能訪問圖片了缩搅。

既然是那么把文件夾static命名為stc触幼,其結(jié)果又會(huì)怎樣誉己?

location ^~ /static {
    root /vagrant/pro;
}

訪問 http://192.168.33.10/static/stc.jpg 得到錯(cuò)誤:

2016/09/28 07:54:46 [error] 5992#0: *73 open() "/vagrant/pro/static/stc.jpg" failed (2: No such file or directory), client: 192.168.33.1, server: localhost, request: "GET /static/stc.jpg HTTP/1.1", host: "192.168.33.10"

計(jì)算路徑/vagrant/pro + /static/stc.jpg巨双, 找不到/vagrant/pro/static/stc.jpg文件,符合之前所說的規(guī)則筑累,嘗試修改location:

location ^~ /stc {
    root /vagrant/pro;
}

因?yàn)閡rl變了丝蹭,訪問http://192.168.33.10/stc/stc.jpg慢宗,才能夠找到圖片”即現(xiàn)在把stc文件夾變回static。

root 與 斜杠

很多人會(huì)疑惑贱田,路徑最后的斜杠/是否要加呢?location中的static后面的斜杠男摧,和匹配后的url有關(guān),不再贅述耗拓。root中的路徑的斜杠/可以再通過實(shí)驗(yàn)確定。把location配置如下:

location ^~ /static/ {
   root /vagrant/pro/;
}

訪問http://192.168.33.10/static/stc.jpg 一切正常乔询,訪問http://192.168.33.10/static/stc.jpg,error為找不到"/vagrant/pro/static/stc.jpgs"文件。

如果按照root替換host的規(guī)則麻献,那么替換過程為

/vagrant/pro/ + /static/stc.jpg == /vagrant/pro//static/stc.jpg猜扮。在*nix系統(tǒng)中, 多個(gè)斜杠和一個(gè)斜杠是等價(jià)的旅赢,也就是 /vagrant/pro//static/stc.jpg/vagrant/pro/static/stc.jpg一樣。

這樣一來煮盼,root路徑后面的斜杠,加與不加效果都一樣僵控。既然如此,肯定有人會(huì)想到這么配置:

location ^~ static/ {
    root /vagrant/pro;
}

如果安裝之前上面的即算法报破,那么應(yīng)該是 /vagrant/pro + static/stc.jpg,相加的應(yīng)該是/vagrant/prostatic/stc.jpg梗脾,按理說應(yīng)該是錯(cuò)誤,可是實(shí)際上卻能訪問圖片盹靴。咄咄怪事?

如果對(duì)前文nginx location的url匹配規(guī)則了解的話稿静,應(yīng)該看出來了其實(shí) ^~ static/并不能匹配。修改 location

location ^~ static/ {
    rewrite ^ http://google.com;
   # root /vagrant/pro;
}

訪問http://192.168.33.10/static/stc.jpg依然可以得到圖片控漠,沒有跳轉(zhuǎn)google绍妨,說明并沒有匹配^~ static/

其實(shí)原理也很簡(jiǎn)單他去,還記得我們第一次實(shí)驗(yàn)倒堕,當(dāng)時(shí)尚未配置location,也同樣可以返回圖片。沒錯(cuò)铭段,盡管^~ static/沒有匹配,而外層的server定義了root為/vagrant/pro序愚,因此搜索圖片正常返回等限,再注釋外層的root,再一次訪問望门。此時(shí)會(huì)得到一個(gè)404,查看error如下:

2016/09/28 08:18:15 [error] 6227#0: *82 open() "/usr/share/nginx/html/static/stc.jpg" failed (2: No such file or directory), client: 192.168.33.1, server: localhost, request: "GET /static/stc.jpg HTTP/1.1", host: "192.168.33.10"

/usr/share/nginx/html/static/stc.jpg筹误,說明即使沒有指定root,nginx默認(rèn)也有一個(gè)root厨剪,/usr/share/nginx/html。當(dāng)然炫七,這個(gè)配置和 ^~ static/沒有關(guān)系。

如果~ static/stc.jpgs? 那么就能命中钾唬,此時(shí)訪問圖片,依然能夠正確的解析奕巍,因此,并不存在 /vagrant/pro + static/stc.jpg這種情況的止。理解這里的關(guān)鍵是 root替換host着撩,并加上匹配后的url诅福,匹配后的url當(dāng)然包括前面的斜杠,匹配部分的url則不會(huì)氓润。

對(duì)于 ~ static/stc.jpgs?模式,訪問urlhttp://192.168.33.10/static/stc.jpg

  • 匹配后的url為 /static/stc.jpg
  • 匹配部分的url為 static/stc.jpg

掌握這個(gè)很重要咖气,直接關(guān)系到后面alias指令與斜杠的關(guān)系。

對(duì)于root指令浅役,我們可以歸納。

  1. 對(duì)于匹配后的url地址伶唯,將匹配的location中的root路徑替換訪問url的host即得到文件的真實(shí)地址觉既。(多個(gè)斜杠其實(shí)等價(jià)于一個(gè)斜杠)
  2. 如果不匹配location瞪讼,則尋找更外層的root做替換。
  3. root指令最后的斜杠可加可不加尝艘。

alias指令

對(duì)于root姿染,操作上很簡(jiǎn)單,只要把root地址替換host后就是文件在硬盤路徑(真實(shí)地址)悬赏。對(duì)于alise,它并不是替換匹配后的url地址盾戴,而是替換匹配部分的url兵多。alias指令也可以有多個(gè)。

添加一個(gè)location剩膘,和root的方式幾乎一樣:

location ^~ /upload {
   alias /vagrant/pro;
}

訪問http://192.168.33.10/upload/up.png并沒有圖片,查看error得到:

2016/09/28 08:36:18 [error] 6312#0: *90 open() "/vagrant/pro/up.png" failed (2: No such file or directory), client: 192.168.33.1, server: localhost, request: "GET /upload/up.png HTTP/1.1", host: "192.168.33.10"

可見 alias的模式并不是/vagrant/pro + /upload/up.png畏梆,而是 /vagrant/pro + /up.png

alias這個(gè)詞在計(jì)算機(jī)里很常用奈懒,字面意思是“別名”奠涌,顧名思議就是換一個(gè)名字啦。實(shí)際替換規(guī)則就是把匹配的url地址磷杏,換成alias中的路徑即可溜畅。例如上述的例子替換過程可以模擬如下:

過程 模式或url
url模式 ^~ /upload
alias路徑 /vagrant/pro
訪問地址 http://192.168.33.10/upload/up.png
匹配部分的地址 /upload + /up.png
替換 /upload == /vagrant/pro
結(jié)果 /vagrant/pro + /up.png

為了修改圖片的訪問,修改locaton如下:

location ^~ /upload {
    alias /vagrant/pro/upload;
}

此時(shí)訪問http://192.168.33.10/upload/up.png就能得到正確的圖片啦茴丰,仿造上面的計(jì)算過程為:

過程 模式或url
url模式 ^~ /upload
alias路徑 /vagrant/pro/upload
訪問地址 http://192.168.33.10/upload/up.png
匹配部分的地址 /upload + /up.png
替換 /upload == /vagrant/pro/upload
結(jié)果 /vagrant/pro/upload + /up.png

從結(jié)果可以看出达皿,正確的找到了文件路徑天吓,如果alias指令路徑加上斜杠贿肩,那么計(jì)算處理的文件路徑為:

/upload == /vagrant/pro/upload
/vagrant/pro/upload/ + /up.png

多個(gè)斜杠是合法的峦椰。等價(jià)于一個(gè)斜杠的情況。

下面修改locaiton如下:

location ^~ /upload/ {
   alias /vagrant/pro/upload;
}

此時(shí)匹配時(shí)的url則變成 /upload/ + up.jpg, 那么置換的結(jié)果為 /vagrant/pro/upload + up.png汰规,而/vagrant/pro/uploadup.png的路徑是非法的汤功,從error中也能看到置換的錯(cuò)誤:

2016/09/28 08:52:44 [error] 6452#0: *92 open() "/vagrant/pro/uploadup.png" failed (2: No such file or directory), client: 192.168.33.1, server: localhost, request: "GET /upload/up.png HTTP/1.1", host: "192.168.33.10"

解決辦法也很簡(jiǎn)單,把/vagrant/pro/upload 改成 /vagrant/pro/upload/即可溜哮。由此可見滔金,alias最后的斜杠并不像root指令那樣可有可無,是否需要茂嗓,取決于配合loacation的url匹配模式餐茵。

前文root模式中,考慮了沒有根的斜杠(~ static/stc.jpgs?)這種情況述吸,alias情況下會(huì)很難捕捉錯(cuò)誤忿族。如果locaion配置如下:

location ^~ upload/ {
      alias /vagrant/pro/upload/;
}

替換置換的文件路徑應(yīng)該為 /vagrant/pro/upload/up.png道批,可是實(shí)際測(cè)試中隆豹,這樣配置alias璃赡,會(huì)一直導(dǎo)致一個(gè)301的重定向碉考,如果alias目錄沒有打開autoindex惩琉,則會(huì)拋出一個(gè)403錯(cuò)誤瞒渠。具體情況尚未知曉伍玖,不知道是不是nginx的bug窍箍。為了避免這種情況丽旅,使用alias的時(shí)候榄笙,盡量不要配置location為 ^~ upload/的模式茅撞,并且不從根指定url米丘,還是顯得不倫不類拄查。

alise作為別名堕扶,比起root的一大好處就是不一定要url上的路徑和文件路徑一樣挣柬,因?yàn)閍lise并不是替換host邪蛔,而是替換匹配部分的host扎狱。修改配置如下:

location ^~ /upload/ {
    alias /vagrant/pro/static/;
}

訪問 http://192.168.33.10/upload/stc.jpg或者 http://192.168.33.10/upload/flask/m.png都能正確的訪問到static目錄下的文件匠抗,盡管url上是upload汞贸。

替換規(guī)則也很簡(jiǎn)單矢腻,/upload/ == /vagrant/pro/static/ 得到 /vagrant/pro/static/ + stc.jpg/vagrant/pro/static/ + flask/m.png多柑。

總結(jié)

nginx的靜態(tài)文件配置中竣灌,root和alias指令都能實(shí)現(xiàn)。為了避免混淆及汉,盡量不要寫沒有根路徑的url模式豁生,即避免 static/這樣的開頭漫贞,根路徑斜杠需要保留迅脐,沒有根路徑其實(shí)也很奇怪豪嗽。

root和alias的區(qū)別主要在于替換的部分隐锭,root模式中钦睡,會(huì)把root配置的路徑替換匹配后的url中的host荞怒。alias則把他指定的路徑褐桌,替換url中匹配的部分荧嵌。指令中的斜杠對(duì)于root指令沒有影響啦撮,對(duì)于alise則按照替換規(guī)則匹配即可逻族。

root 指令

location /dir/ 
root root_path ->  http://host/dir/file.txt  -> root_path/dir/file.txt

alias 指令

location /dir
alias alias_path ->  http://host /dir /file.txt  -> alias_path/file.txt

location /dir/ 
alias alias_path/ ->  http://host /dir/ file.txt  -> alias_path/file.txt

了解了root和alise之后聘鳞,通常最佳實(shí)際是配置一個(gè)項(xiàng)目的根root站楚,其他的文件夾則使用alias搏嗡,畢竟alias更加靈活旧乞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尺栖,一起剝皮案震驚了整個(gè)濱河市延赌,隨后出現(xiàn)的幾起案子挫以,更是在濱河造成了極大的恐慌掐松,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異量没,居然都是意外死亡殴蹄,警方通過查閱死者的電腦和手機(jī)袭灯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姨丈,“玉大人翁潘,你說我怎么就攤上這事拜马×┟В” “怎么了豹绪?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵蝉衣,是天一觀的道長(zhǎng)病毡。 經(jīng)常有香客問我,道長(zhǎng)啦膜,這世上最難降的妖魔是什么僧家? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮清蚀,結(jié)果婚禮上爹谭,老公的妹妹穿的比我還像新娘枷邪。我一直安慰自己,他們只是感情好诺凡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布药薯。 她就那樣靜靜地躺著,像睡著了一般脸候。 火紅的嫁衣襯著肌膚如雪泵额。 梳的紋絲不亂的頭發(fā)上嫁盲,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天羞秤,我揣著相機(jī)與錄音,去河邊找鬼矫限。 笑死哺哼,一個(gè)胖子當(dāng)著我的面吹牛茵汰,可吹牛的內(nèi)容都是我干的经窖。 我是一名探鬼主播梭灿,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼堡妒,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼桑寨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沙咏,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎理盆,沒想到半個(gè)月后坎拐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猬仁,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年湿刽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了的烁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诈闺,死狀恐怖渴庆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤襟雷,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布刃滓,位于F島的核電站,受9級(jí)特大地震影響耸弄,放射性物質(zhì)發(fā)生泄漏咧虎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一计呈、第九天 我趴在偏房一處隱蔽的房頂上張望砰诵。 院中可真熱鬧,春花似錦震叮、人聲如沸胧砰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尉间。三九已至,卻和暖如春击罪,著一層夾襖步出監(jiān)牢的瞬間哲嘲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工媳禁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留眠副,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓竣稽,卻偏偏與公主長(zhǎng)得像囱怕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子毫别,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理娃弓,服務(wù)發(fā)現(xiàn),斷路器岛宦,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • 1.ngnix介紹 ngnix www服務(wù)軟件 俄羅斯人開發(fā) 開源 性能很高 本身是一款靜態(tài)WWW軟件 靜態(tài)小文件...
    逗比punk閱讀 2,086評(píng)論 1 6
  • Page 1:nginx 服務(wù)器安裝及配置文件詳解 CentOS 6.2 x86_64 安裝 nginx 1.1 ...
    xiaojianxu閱讀 8,529評(píng)論 1 41
  • 《老男孩Linux運(yùn)維》筆記 隱藏Nginx軟件版本號(hào) 一般來說台丛,軟件的漏洞都和版本有關(guān)。因此要盡量隱藏對(duì)訪問用戶...
    Zhang21閱讀 3,630評(píng)論 0 28
  • 基本配置 為了探究nginx的url配置規(guī)則砾肺,當(dāng)然需要安裝nginx挽霉。我使用了vagrant創(chuàng)建了一個(gè)虛擬環(huán)境的u...
    人世間閱讀 15,254評(píng)論 7 30