Nginx 學習筆記--程式與模組(二)

WormOfTime發表於2020-04-08

程式與模組

Nginx 真正的魅力在於它的模組,整個應用程式建立在一個模組化系統之上,在編譯時,可以對每一個模組進行啟用或者禁用,需要什麼就定製什麼。

對 Nginx 模組的基本原理總結一下,基本就是:在特定地方呼叫函式。

Nginx 本身支援多種模組,如 HTTP 模組、EVENTS 模組和 MAIL 模組。
配置檔案結構圖:
Nginx學習筆記--程式與模組(二)

Nginx 本身做的工作實際很少,當它接到一個 HTTP 請求時,它僅僅是通過查詢配置檔案將此次請求對映到一個 location block,而此 location 中所配置的各個指令則會啟動不同的模組去完成工作,因此模組可以看做 Nginx 真正的勞動工作者。

http index模組

模組:ngx_http_index_module
語法:

index file ...;

預設值:index index.html
作用域:http, server, location

模組功能及注意:

  • 定義將要被作為預設頁的檔案。
  • 檔案的名字可以包含變數。
  • 檔案以配置中指定的順序被 Nginx 檢查。
  • 列表中的最後一個元素可以是一個帶有絕對路徑的檔案。

範例:

location / {
    index index.$geo.html index.html index.htm /index.html
}

http log模組

模組:ngx_http_log_module

  • access_log 指令

語法:

access_log path [format [buffer=size]];
# or
access_log off;

預設值:access_log log/access.log combined

作用域:http, server, location

指令功能及注意:

  • 指令 access_log 指派路徑、格式和快取大小。
  • 引數 “off“ 將清除當前級別的所有 access_log 指令。
  • 如果未指定格式,則使用預置的 “combined“ 格式。
  • 快取不能大於能寫入磁碟的檔案的最大值。在 FreeBSD 3.0-6.0 ,快取大小無此限制。
access_log /var/log/nginx-access.log gzip buffer=32k;
  • log_format 指令

語法:

log_format name format [format ...];

預設值: log_format combined "..."

作用域: http server

功能:配置日誌格式

範例:

log_format  gzip '$remote_addr-$remote_user[$time_local]' '$request$status $bytes_sent' '"$http_referer" "$http_user_agent" "$gzip_ratio"';

access模組

模組:ngx_http_access_module

模組功能及注意:

  • 此模組提供了一個簡易的基於主機的訪問控制(對網路地址有放行和禁止的權利),使 Nginx 可以對特定 IP 客戶端進行控制。
  • 規則為:順序匹配,以第一次匹配到的結果為準。

語法:

# 放行語法
allow address | CIDR | all;
# 禁止語法
deny address | CIDR | all;

作用域:http, server, location, limit_except
指令功能:allow 描述的網路地址有權直接訪問; deny 描述的網路地址拒絕訪問
範例:

location / {
    deny 192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16
    deny all;
}

在上面的例子中,僅允許網段 10.1.1.0/16192.168.1.0/24 中除 192.168.1.1 之外的 ip 訪問。

Rewrite模組

模組:ngx_http_rewrite_module

模組功能及注意:

  • 執行 URL 重定向,允許你去掉帶有惡意的 URL,包含多個引數(修改)
  • 利用正則的匹配,分組和引用,達到目的

if 語句塊

語法:

if (condition) {
  ...
}

功能描述:對重定向進行流程控制

作用域:server, location

return 語句

語法:

return code;

作用域:server, location, if

功能描述:這個指令根據規則的執行情況,返回一個狀態值給客戶端。

  • 可使用值包括:204,400,402 - 406,408,410,411,413,416 及 500 - 504。
  • 也可以傳送非標準的 444 程式碼 - 未傳送任何頭資訊,然後結束連線。

rewrite 語句

語法:

rewrite regex replacement flag

regex :用於匹配 url 的正規表示式。使用括號()標記要擷取的內容

replacement : 匹配成功後用於替換 url 中被擷取內容的字串

flag : 用來設定 rewrite 對 url 的處理行為

常用的 flag 如下:

  • last : 表示完成 rewrite
  • break: 本規則匹配完成後,終止匹配,不再匹配後面的規則
  • redirect : 返回 302 臨時重定向,位址列會顯示跳轉後的地址
  • permanent: 返回 301 永久重定向,位址列會顯示跳轉後的地址

作用域:server, location, if

功能描述:這個指令根據正規表示式或者待替換的字串來更改 URL。指令根據配置檔案中的先後順序執行生效。

範例:

location ~ (.*\.[png|jpg|gif]) {
    deny all;
}

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}

Proxy模組

模組:ngx_http_proxy_module

功能描述:此模組能代理請求到其它伺服器。就是說允許你把客戶端的 HTTP 請求轉到後端伺服器(這部分的指令非常多,但不是全部都會被用到,這裡是比較常見的指令簡介)。

  • 指令:proxy_pass_header Server;

功能描述:該指令強制一些被忽略的頭傳遞到客戶端。

  • 指令:proxy_redirect off;

功能描述:允許改寫出現在 HTTP 頭卻被後端伺服器觸發重定向的 URL,對響應本身不做任何處理。

  • 指令:proxy_set_header Host $http_host;

功能描述:允許你重新定義代理 header 值再轉到後端伺服器,目標伺服器可以看到客戶端的原始主機名。

  • 指令: proxy_set_header X-Real-IP $remote_addr;

功能描述:目標伺服器可以看到客戶端的真實 IP,而不是轉發伺服器的 IP。

upstream模組

模組:ngx_http_upstream_module

語法:

upstream name {
  ...
}

功能簡介:該指令使請求被上行通道之間的基於客戶端的 IP 地址分佈

upstream 指令

語法:

upstream name { ... }

作用域:http

指令功能及注意:

  • 這個指令描述了一個伺服器的集合,該集合可被用於 proxy_pass 和 fastcgi_pass 指令中,作為一個單獨的實體。
  • 這些伺服器可以是監聽在不同的埠,另外,併發使用同時監聽 TCP 埠和 Unix 套接字的伺服器是可能的。
  • 這些伺服器能被分配不同的權重。如果沒有指定,則都為 1 。

示例:

upstream backend {
  server backend1.example.com weight=5;
  server 127.0.0.1:8080 max_fails=3  fail_timeout=30s;
  server unix:/tmp/backend3;
}

ip_hash 指令

作用域: upstream

upstream backend {
  ip_hash;
  server   backend1.example.com;
  server   backend2.example.com;
  server   backend3.example.com;
  server   backend4.example.com;
}

指令功能及注意:

  • 指定伺服器組的負載均衡方法,請求基於客戶端的 IP 地址在伺服器間進行分發。IPv4 地址的前三個位元組或者 IPv6 的整個地址,會被用來作為一個雜湊 key。
  • 這種方法可以確保從同一個客戶端過來的請求,會被傳給同一臺伺服器。除了當伺服器被認為不可用的時候,這些客戶端的請求會被傳給其他伺服器,而且很有可能也是同一臺伺服器。

如果其中一個伺服器想暫時移除,應該加上 down 引數。這樣可以保留當前客戶端 IP 地址雜湊分佈。就像這樣:

upstream backend {
  ip_hash;
  server   backend1.example.com;
  server   backend2.example.com;
  server   backend3.example.com  down;
  server   backend4.example.com;
}

server 指令

語法:

server address [parameters];

作用域: upstream

指令功能及注意:

  • 定義伺服器的地址 address 和其他引數 parameters。
  • 地址可以是域名或者 IP 地址,埠是可選的,或者是指定“unix:”字首的 UNIX 域套接字的路徑。如果沒有指定埠,就使用 80 埠。
  • 如果一個域名解析到多個 IP,本質上是定義了多個 server。
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章