程式與模組
Nginx 真正的魅力在於它的模組,整個應用程式建立在一個模組化系統之上,在編譯時,可以對每一個模組進行啟用或者禁用,需要什麼就定製什麼。
對 Nginx 模組的基本原理總結一下,基本就是:在特定地方呼叫函式。
Nginx 本身支援多種模組,如 HTTP
模組、EVENTS
模組和 MAIL
模組。
配置檔案結構圖:
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/16
和 192.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
: 表示完成 rewritebreak
: 本規則匹配完成後,終止匹配,不再匹配後面的規則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 協議》,轉載必須註明作者和本文連結