nginx短篇(4):模組、配置指令、塊之間的關係
- A+
所屬分類:nginx 運維技術
博主會將與Nginx有關的知識點總結到"nginx短篇系列"文章中,如果你對nginx不是特別瞭解,請 按照順序 閱讀"nginx短篇系列",以便站在前文的基礎上理解新的知識點。
通過前文我們已經瞭解到,安裝nginx以後,nginx會提供一個預設server,我們可以從nginx.conf檔案中找到這個預設server的相關配置,如下:
server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
前文中已經解釋過上述配置的大致含義,而且我們知道,一個http塊中可以配置多個server塊,一個server塊中可以配置多個location,那麼此處,我們就來多配置幾個location試試,我已經配置好了一個用於演示的示例,如下:
server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } location /demo { root /opt; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
如你所見,我在預設配置之上,添加了一個location塊,這個location對應的url為"/demo",此location塊中的"root /opt;"配置指令表示這個location的文件根目錄為"/opt"目錄,所以,當我們在瀏覽器中訪問"/demo/a.jpg"這個url時,訪問的其實是伺服器中的"/opt/demo/a.jpg"檔案,如果你不明白為什麼url與伺服器路徑存在這種對應關係,不用擔心,我們會在之後的文章中總結root指令和location塊之間的具體關係以及它們的用法,此處我們先不用糾結這些,我們先把關注的重點放在別的地方,為了方便示例,我已經在伺服器上建立了/opt/demo/目錄,並且在此目錄中建立了一個名為index.html的檔案,index.html內容如下:
# cat /opt/demo/index.html www.zsythink.net
由於我在完成上述配置之前已經啟動了nginx,所以此處執行"nginx -s reload"命令過載配置,以便在不停止nginx服務的情況下使新的配置能夠立即生效,過載配置以後,在瀏覽器中訪問連結地址"http://10.1.1.72/demo/",效果如下:
如你所見,我們自定義的location已經生效了,當我們訪問"http://10.1.1.72/demo/"這個url時,即可訪問到伺服器的"/opt/demo/index.html"檔案,通過上述示例,你應該已經明白了,在同一個web服務中,我們可以將不同的url對應到不同的伺服器路徑中,上例中,除了預設的location,我們又手動配置了一個新的location,預設的location為"/",我們手動配置的新的location為"/demo",所以,訪問這兩個url時,會分別對應的不同的文件根目錄,從不同的目錄中查詢對應的資源,又因為index配置指令的原因,會預設訪問對應目錄中的index.html檔案或index.htm檔案,所以最終效果就像你剛才看到的那樣。
細心如你,一定發現了,預設的location和我們新加入的location中,index配置指令的值是完全相同的,那麼,我們能不能把index配置項提取出來呢?是可以的,由於這兩個location的index配置完全相同,所以,我們可以把這個index配置項提取到上一級的server塊中,以便這兩個location共享這個index配置,配置如下
server { listen 80; server_name localhost; index index.html index.htm; location / { root html; } location /demo { root /opt; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
聰明如你,一定看明白了,由於兩個location塊中的index配置項完全相同,所以我們將index配置指令提取到了這兩個location塊的上一級server塊中,以便兩個location塊能夠共享這個index配置,換句話說就是,server塊中的index指令是對當前server塊中的所有location生效的,當然,如果某個location塊中有自己的index配置,那麼針對當前location塊來說,還是以自己的index配置為準,比如如下配置:
server { listen 80; server_name localhost; index index.html index.htm; location / { root html; } location /demo { root /opt; index a.jpg; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
上述配置中,server塊中index配置是對當前server塊中的所有location塊生效的,但是由於" location /demo"中有自己的index配置,那麼針對" location /demo"來說,自己的index配置的優先順序更高,自己的index配置會覆蓋上一級的index配置,所以,當我們訪問"/demo"這個url時,預設會在對應的目錄中查詢a.jpg這個檔案,而不是index.html檔案,但是另外一個location中由於沒有配置index指令,所以它仍然會以上一級server塊中的index配置為準。
通過上述示例,你肯定明白了一個道理,同一個配置指令,配置在不同的塊中時,對應的"作用域"是不同的。
還記得我們在之前的文章中總結過如下這段話嗎?
某些配置指令只能在http塊中配置,某些配置指令只能在location塊中配置,有些配置指令既能在server塊中配置又能在http塊中配置,而有些配置指令只能在main區中進行配置。
其實,剛才示例中的index指令就屬於那種既能在location塊中配置,又能在server塊中配置,還能再http塊中配置的指令,只不過,當index指令配置在不同的塊中時,對應的作用域不同。
舉一反三,有些指令既能配置在server塊中,也能配置在http塊中,當多個server存在相同的配置時,我們可以將這些完全相同的配置指令提取到上一級的http塊中,以便多個server塊共用這些配置,當然,如果你在某個server中單獨配置了對應的配置指令,那麼這個server仍然會以自己的配置為準。
通過上述示例,你是不是對"配置指令"和"塊"之間的關係理解的更加透徹了呢?
其實,"配置指令"不僅和"塊"有一定的關係,"配置指令"和"模組"也有著非常緊密的對應關係,之前總結過,nginx是模組化的,不同的"模組"負責不同的"功能",所以,當我們需要針對某個"功能"進行配置時,就需要使用到對應的"配置指令",從根本上來說,每個"配置指令"都屬於某一個"模組",一個"模組"中會有一個或多個"配置指令",當我們想要對相關模組或者功能進行設定時,就會使用到對應模組中的配置指令。在第一篇文章中我們就提到過,除了內建的標準模組,還有一些可選模組,我們可以在編譯安裝時選擇安裝哪些可選模組,如果你沒有安裝對應的可選模組,那麼你也無法使用對應的配置指令。原因剛才已經說過,每個配置指令都屬於某一個模組。
當然,作為使用者,沒有人天生就會使用nginx的這些配置指令,也沒有人能夠記住所有模組、配置指令、塊之間的關係,所以,我們可以通過官方的文件進行查詢,那麼此處,我們就來介紹一下怎樣通過官網文件找到我們想要的答案。
首先,開啟nginx開源版官網,nginx.org,開啟官網後,可以看到如下頁面,在如下頁面的右側選單中,可以找到"documentation"連結,點選此連結,即可看到nginx官網文件。
開啟文件頁面後,你可以看到一些關於nginx的相關連結,這些連結中包含了與nignx相關的各種資訊,我們可以從這些連結中找到我們想要的答案,仍然拿剛才的index指令作為示例,如果,我們想要找到index指令的使用方法,該怎麼辦呢?方法如下:
下拉文件頁面,找到如下圖所示的"modules reference"部分,點選下圖中標註出的"Alphabetical index of directives"連結
點選上述連結後,你會看到一個指令列表,這個指令列表裡面就是所有我們能用到的配置指令,這些配置指令按照字母順序排序,在瀏覽器中使用"ctrl + f"進行搜尋,此處,我搜索剛才我們用於示例的index配置指令,如下
點選index連結,即可看到index指令的相關資訊,此處就不截圖了,首先,頁面最上方會顯示當前指令屬於哪個模組,你看到的應該是一行黑體字"Module ngx_http_index_module",也就是說,index配置指令屬於ngx_http_index_module模組,由於這個模組中只有index一個指令,所以你在當前頁面中只會看到index指令的用法與示例,如果你檢視的指令所在的模組包含很多條指令,那麼這個模組中所包含的所有指令的用法與示例都會展示在這個頁面中,你在當前頁面中,應該可以看到index的基本語法概述,如下:
Syntax: index file ...;
Default: index index.html;
Context: http, server, location
上述這段示例告訴了我們index指令的基本語發、預設值、以及上下文位置。
Syntax表示指令的基本語法
Default表示指令的預設值是什麼
Context表示指令所處的上下文位置,上下文位置是什麼意思呢?說白了,就是我們之前說的,指令能夠配置在哪個塊中,從官網的示例中可以看出,index指令只能配置在http塊、server塊或者location塊中。
基本語法概述之後,還有該指令對應的一些示例,你可以參考官網給出的示例學習該指令的用法。
經過上述描述,你肯定已經明白了怎樣通過指令列表找到它所在的模組以及指令的用法。
不過在使用的過程中,你可能還會有另一種需求,就是想要了解某個模組的作用,以及這個模組中包含哪些指令,那麼,怎樣才能找到自己想要了解的模組呢?其實與剛才的步驟非常類似,仍然是開啟官網,點選右側選單中的"documentation"連結,進入文件頁面,下拉頁面,找到"modules reference"部分,"modules reference"部分下面其實就是所有模組的模組列表,如果你想要的瞭解某個模組,只要點選模組對應的連結,就能夠看到模組以及對應指令的使用方法了,此處,點選模組列表中的"ngx_http_index_module"連結,你會發現,此連結中的內容與之前通過指令列表查詢到的內容完全相同,其實,我們只是通過兩種方式查詢到了相同的內容而已,第一種方式是通過指令列表查詢,第二種方式是通過模組列表查詢,只是查詢方式不同,最終得到的內容是完全相同的。
這篇文章就寫到這裡,希望能夠對你有所幫助~

我的微信公眾號
關注"實用運維筆記"微信公眾號,當部落格中有新文章時,可第一時間得知哦~