Nginx配置檔案的語法格式

hanniuniu12發表於2021-01-13


  在nginx的世界裡,每個Nginx模組都可以定義自己的配置指令,所以這些指令的格式五花八門。比如content_by_lua_block後跟著的是Lua語法,limit_req_zone後則跟著以空格、等號、冒號等分隔的多個選項。這些模組有沒有必然遵循的通用格式呢?如果有,那麼掌握了它,就能快速讀懂生產環境複雜的nginx.conf檔案。今天便來講解Nginx配置檔案的語法格式。
   Nginx配置檔案的語法格式


  Nginx是由少量框架程式碼、大量模組構成的,其中,Nginx框架會按照特定的語法,將配置指令讀取出來,再交由模組處理。因此,Nginx框架定義了通用的語法規則,而Nginx模組則定義了每條指令的語法規則,作為初學者,如果將學習目標定為掌握所有的配置指令,方向就完全錯了,而且這是不可能完成的任務。


  比如,ngx_http_lua_module模組定義了content_by_lua_block指令,只要它符合框架定義的{}塊語法規則,哪怕大括號內是一大串Lua語言程式碼,框架也會把它交由ngx_http_lua_module模組處理。因此,下面這行指令就是合法的:
  content_by_lua_block {ngx.say("Hello World ")} 


  所以,在我看來,只要弄清楚了以下2點,就能快速掌握Nginx配置檔案,:


  第一點:Nginx框架定義了每條指令的基本格式,這是所有模組必須遵守的規則,這包括以下5條語法:


  透過{ }大括號作為分隔符的配置塊語法。比如http{ }、location{ }、upstream{ }等等,至於配置塊中究竟是放置Javascript語言、Lua語言還是字串、數字,這完全由定義配置塊的Nginx模組而定。


  透過;分號作為分隔符的指令語法。比如root html;就開啟了靜態資源服務。


  以#作為關鍵字的註釋語法。比如#pid logs/nginx.pid;指令就是不會生效的。


  以$作為關鍵字的變數語法。變數是Nginx模組之間能夠互相配合的核心要素,也是Nginx與管理員之間的重要介面,透過$變數名的形式,就可以靈活控制Nginx模組的行為。


  include指令可以將其他配置檔案載入到nginx.conf中,這樣可以提升配置的可維護性。例如include mime.types;語句,就將Content-Type與檔案字尾名的對映關係,放在了獨立的mime.types檔案中,降低了耦合性。


  第二點:Nginx框架為了提高模組解析指令選項的效率,提供了一系列通用的工具函式,絕大多數模組都會使用它們,畢竟這降低了模組開發的難度以及使用者的學習成本。比如,當配置檔案中包含位元組數時,Nginx框架提供了ngx_conf_set_size_slot函式, 各模組透過它就可以解析以下單位:
   Nginx配置檔案的語法格式


  因此,limit_req_zone指令中zone=one:10m中就定義10MB的共享記憶體,這替代了很不好理解的10485760位元組。


  再比如,讀取時間可以使用以下單位:
   Nginx配置檔案的語法格式


  這樣,ssl_session_cache shared:SSL:2h;指令就設定TLS會話資訊快取2小時後過期。


  除以上規則外,如果編譯了pcre開發庫後,你還可以在nginx.conf中使用正規表示式,它們通常以~符號打頭。


  由於每個Nginx模組都能定義獨特的指令,這讓nginx.conf變成了複雜的運維介面。在掌握了基本的配置語法,以及第三方模組定義指令時遵循的潛規則後,你就能遊刃有餘地編寫Nginx配置檔案。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25922618/viewspace-2749615/,如需轉載,請註明出處,否則將追究法律責任。

相關文章