十二周四次課
擴展
nginx中的root和alias區別
nginx貌似沒有虛擬目錄的說法,因為它本來就是完完全全根據目錄來設計並工作的。
如果非要給nginx安上一個虛擬目錄的說法,那就只有alias標簽比較“像”,幹脆來說說alias標簽和root標簽的區別吧。
最基本的區別:alias指定的目錄是準確的,root是指定目錄的上級目錄,並且該上級目錄要含有location指定名稱的同名目錄。另外,根據前文所述,使用alias標簽的目錄塊中不能使用rewrite的break。
所以使用nginx設置root時要註意一個問題,就是如果該root設置的前端目錄不是根目錄,那麽在寫root的絕對地址時,要把前端目錄的部分省略掉。
alias
[plain] view plain copy
location /abc/ { alias /home/html/abc/; }
在這段配置下,http://test/abc/a.html就指定的是 /home/html/abc/a.html。這段配置亦可改成
root
[plain] view plain copy
location /abc/ { root /home/html/;}
可以看到,使用root設置目錄的絕對路徑時,少了/abc,也就是說,使用root來設置前端非根目錄時,nginx會組合root和location的路徑。
另外,使用alias時目錄名後面一定要加“/”
nginx的alias和root配置
nginx指定文件路徑有兩種方式root和alias,這兩者的用法區別,使用方法總結了下,方便大家在應用過程中,快速響應。root與alias主要區別在於nginx如何解釋location後面的uri,這會使兩者分別以不同的方式將請求映射到服務器文件上。
[root]
語法:root path
默認值:root html
配置段:http、server、location、if
[alias]
語法:alias path
配置段:location
實例:
location ~ ^/weblogs/ { root /data/weblogs/www.ttlsa.com; autoindex on; auth_basic "Restricted"; auth_basic_user_file passwd/weblogs; }
如果一個請求的URI是/weblogs/httplogs/www.ttlsa.com-access.log時,web服務器將會返回服務器上的/data/weblogs/www.ttlsa.com/weblogs/httplogs/www.ttlsa.com-access.log的文件。
[info]root會根據完整的URI請求來映射,也就是/path/uri。[/info]
因此,前面的請求映射為path/weblogs/httplogs/www.ttlsa.com-access.log。
location ^~ /binapp/ {
limit_conn limit 4;
limit_rate 200k;
internal;
alias /data/statics/bin/apps/;
}
alias會把location後面配置的路徑丟棄掉,把當前匹配到的目錄指向到指定的目錄。如果一個請求的URI是/binapp/a.ttlsa.com/favicon時,web服務器將會返回服務器上的/data/statics/bin/apps/a.ttlsa.com/favicon.jgp的文件。
[warning]1. 使用alias時,目錄名後面一定要加"/"。
- alias可以指定任何名稱。
- alias在使用正則匹配時,必須捕捉要匹配的內容並在指定的內容處使用。
- alias只能位於location塊中。
實驗確認nginx root、alias、location指令使用方法
一直以來對nginx中root、alias指令的區別沒有搞清楚,今天特別查找了一些資料,同時通過實例配置nginx的方法來對比這兩個指令。
一.nginx root指令
- Nginx配置
相關配置如下圖:
通過配置root目錄到“/wwwroot/html/”位置
在用虛擬主機方法,主機名稱是test,需要大家配置一下自己pc的host文件,另外需要配置server的nginx.conf文件,添加“include vhost/t.conf;”代碼,註意不要攜帶中文的引號
- 準備一些文件,文件列表如下
如上圖,我們將/wwwroot/html目錄下的“目錄結構及文件”列了出來,一會我們會根據這個目錄結構進行實驗。 - 正常訪問頁面,顯示如下圖
通過上圖我們可以了解到訪問/t/a.html成功, 也就是 這個“location /t/”配置及root配合是正常的
- 訪問非目錄結構
如上圖訪問結果,我們無法訪問c.html,為什麽,其實問題不在root,在於“location /t/”,根據這個指令,我們必須在我們的url中包括“/t/”,否則無效,並且我們在虛擬的主機中沒有其他配置了,因此無法訪問c.html - Root的對比配置
圖上圖,我們配置root的目錄到 “/wwwroot/html/t/”,然後重新加載nginx配置
訪問a.html文件,這個文件在這個目錄中是真實存在的,結果如下
上圖結果由於有緩存存在,無法真正表明結果
通過特別參數來突破緩存進行測試,結果如下:
從上圖看,已經沒有緩存在影響,但是仍然沒有找到頁面
清理緩存後再次測試,結果如下
結果以上是上面的情況。
小結
圖中最上面是nginx的 location的配置, 特別註意 “/t/”,我們的訪問中必須攜帶這個信息,才能訪問。
第二行是用戶的訪問
第三行是nginx的 root指令,特別註意綠色區域的“/”必須是一一對應的。
最下面是linux文件系統的目錄及文件顯示,當然目錄是 /wwwroot/html/目錄下的文件。
從上圖我們可以了解到:location指令的第一個“/”同root指令的最後一個“/”是一一對應的,然後,root的指定的目錄中,包括 location指定的相關目錄結構,圖中最後一部分顯示的結構。
用戶訪問中,相應的“/”也必須同location中的“/”進行相關對應。圖中應該對應的“/”都已經用相同顏色標識出來,請註意!
二.nginx alias別名配置 - 更新配置文件
別名的相關配置如下圖,文件系統不變。
重新加載配置 - 未清理緩存情況下的訪問
- 采用參數法突破緩存的結果
- 清理緩存後訪問結果
- 更改配置文件進行對比實驗
重新加載配置文件
清理瀏覽器緩存然後訪問如下
從圖中發現我們已經訪問不了
訪問c.html
可以訪問了。為什麽???
小結
從上圖中我們了解到,location中 ××ד/”要同 alias中“/”相對應。
然後是服務器中的目錄結構了。
再有就是html訪問中(同location的關系)的情況,同上面root的情況類似。
總結: - Location管理服務器及用戶瀏覽器的訪問, 主要是http請求中url中特定部分同location指令特定部分要對應,需要對應在兩個小結的圖中已經給出了!
- Root及alias指令主要是目錄對應關系同location不同
- Root的最後一個“/”要同location的第一個“/”對應,其他目錄結構同location中剩余相同
- Alias的最後一個“/”要同location的最後一個“/”對應
十二周四次課