1. 程式人生 > >十二周四次課

十二周四次課

nginx alias localtion

復習LNMP

擴展

nginx中的root和alias區別

nginx貌似沒有虛擬目錄的說法,因為它本來就是完完全全根據目錄來設計並工作的。

如果非要給nginx安上一個虛擬目錄的說法,那就只有alias標簽比較“像”,幹脆來說說alias標簽和root標簽的區別吧。

最基本的區別:alias指定的目錄是準確的,root是指定目錄的上級目錄,並且該上級目錄要含有location指定名稱的同名目錄。另外,根據前文所述,使用alias標簽的目錄塊中不能使用rewrite的break。

所以使用nginx設置root時要註意一個問題,就是如果該root設置的前端目錄不是根目錄,那麽在寫root的絕對地址時,要把前端目錄的部分省略掉。

我們用設置虛擬目錄指向的alias來和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時,目錄名後面一定要加"/"。

  1. alias可以指定任何名稱。
  2. alias在使用正則匹配時,必須捕捉要匹配的內容並在指定的內容處使用。
  3. alias只能位於location塊中。

實驗確認nginx root、alias、location指令使用方法

一直以來對nginx中root、alias指令的區別沒有搞清楚,今天特別查找了一些資料,同時通過實例配置nginx的方法來對比這兩個指令。
一.nginx root指令

  1. Nginx配置
    相關配置如下圖:

技術分享圖片
通過配置root目錄到“/wwwroot/html/”位置
在用虛擬主機方法,主機名稱是test,需要大家配置一下自己pc的host文件,另外需要配置server的nginx.conf文件,添加“include vhost/t.conf;”代碼,註意不要攜帶中文的引號

  1. 準備一些文件,文件列表如下
    技術分享圖片
    如上圖,我們將/wwwroot/html目錄下的“目錄結構及文件”列了出來,一會我們會根據這個目錄結構進行實驗。
  2. 正常訪問頁面,顯示如下圖

技術分享圖片
通過上圖我們可以了解到訪問/t/a.html成功, 也就是 這個“location /t/”配置及root配合是正常的

  1. 訪問非目錄結構
    技術分享圖片
    如上圖訪問結果,我們無法訪問c.html,為什麽,其實問題不在root,在於“location /t/”,根據這個指令,我們必須在我們的url中包括“/t/”,否則無效,並且我們在虛擬的主機中沒有其他配置了,因此無法訪問c.html
  2. Root的對比配置
    技術分享圖片
    圖上圖,我們配置root的目錄到 “/wwwroot/html/t/”,然後重新加載nginx配置
    技術分享圖片
    訪問a.html文件,這個文件在這個目錄中是真實存在的,結果如下
    技術分享圖片
    上圖結果由於有緩存存在,無法真正表明結果
    通過特別參數來突破緩存進行測試,結果如下:
    技術分享圖片
    從上圖看,已經沒有緩存在影響,但是仍然沒有找到頁面
    清理緩存後再次測試,結果如下
    技術分享圖片
    結果以上是上面的情況。
    小結
    技術分享圖片
    圖中最上面是nginx的 location的配置, 特別註意 “/t/”,我們的訪問中必須攜帶這個信息,才能訪問。
    第二行是用戶的訪問
    第三行是nginx的 root指令,特別註意綠色區域的“/”必須是一一對應的。
    最下面是linux文件系統的目錄及文件顯示,當然目錄是 /wwwroot/html/目錄下的文件。
    從上圖我們可以了解到:location指令的第一個“/”同root指令的最後一個“/”是一一對應的,然後,root的指定的目錄中,包括 location指定的相關目錄結構,圖中最後一部分顯示的結構。
    用戶訪問中,相應的“/”也必須同location中的“/”進行相關對應。圖中應該對應的“/”都已經用相同顏色標識出來,請註意!
    二.nginx alias別名配置
  3. 更新配置文件
    別名的相關配置如下圖,文件系統不變。
    技術分享圖片
    重新加載配置
    技術分享圖片
  4. 未清理緩存情況下的訪問
    技術分享圖片
  5. 采用參數法突破緩存的結果
    技術分享圖片
  6. 清理緩存後訪問結果
    技術分享圖片
  7. 更改配置文件進行對比實驗
    技術分享圖片
    重新加載配置文件
    清理瀏覽器緩存然後訪問如下
    技術分享圖片
    從圖中發現我們已經訪問不了
    訪問c.html
    技術分享圖片
    可以訪問了。為什麽???
    小結
    技術分享圖片
    從上圖中我們了解到,location中 ××ד/”要同 alias中“/”相對應。
    然後是服務器中的目錄結構了。
    再有就是html訪問中(同location的關系)的情況,同上面root的情況類似。
    總結:
  8. Location管理服務器及用戶瀏覽器的訪問, 主要是http請求中url中特定部分同location指令特定部分要對應,需要對應在兩個小結的圖中已經給出了!
  9. Root及alias指令主要是目錄對應關系同location不同
  10. Root的最後一個“/”要同location的第一個“/”對應,其他目錄結構同location中剩余相同
  11. Alias的最後一個“/”要同location的最後一個“/”對應

十二周四次課