Nginx學(xué)習(xí):安全鏈接、范圍分片以及請求分流模塊
又迎來新的模塊了,今天的內(nèi)容不多,但我們都進(jìn)行了詳細(xì)的測試,所以可能看起來會多一點(diǎn)哦。這三個模塊之前也從來都沒用過,但是通過學(xué)習(xí)之后發(fā)現(xiàn),貌似還都挺有用。當(dāng)然,還是要根據(jù)具體業(yè)務(wù)情況來看,如果你的業(yè)務(wù)中有用到,那么就可以嘗試一下哦。
安全鏈接是實(shí)現(xiàn)請求 URL 的驗證模塊,通過簽名密鑰來判斷請求是否可以返回相應(yīng)的數(shù)據(jù)。范圍分片一般用于分段下載,主要用于代理時請求后端的 Range 頭的設(shè)置。最后的請求分流不太好說清楚,咱們到文章中詳細(xì)再說明吧。
今天的內(nèi)容大部分可以在 http、server、location 下配置,僅有兩個只能在 http 或 location 下配置,我會單獨(dú)說。
安全鏈接
安全鏈接模塊 ngx_http_secure_link_module(0.7.18),可以用于檢查請求鏈接的真實(shí)性,保護(hù)資源免受未經(jīng)授權(quán)的訪問,并限制鏈接壽命。
請求鏈接的真實(shí)性通過將請求中傳遞的校驗和值與為請求計算的值進(jìn)行比較來驗證。這個其實(shí)就像我們做 App 接口時,一般都會加個 sign 簽名一樣,客戶端使用和服務(wù)端相同的方式進(jìn)行簽名,用于驗證客戶端發(fā)來的請求是否有效。另外,這個模塊還可以根據(jù)鏈接的生命周期來進(jìn)行驗證,如果生命周期有限且時間已過,則認(rèn)為該鏈接已過期。這些檢查的狀態(tài)在 $secure_link
變量中可用。
該模塊提供了兩種可選的操作模式。第一種模式由secure_link_secret 指令啟用,用于檢查請求鏈接的真實(shí)性以及保護(hù)資源免受未經(jīng)授權(quán)的訪問。第二種模式 (0.8.50) 由secure_link 和secure_link_md5 指令啟用,也用于限制鏈接的生命周期。這兩種形式我們后面都會進(jìn)行測試。
它不包含在 Nginx 核心源碼中,需要通過 --with-http_secure_link_module 編譯安裝。我們還是先來看看這個模塊所包含的配置項,然后再進(jìn)行綜合的測試。
secure_link
定義一個帶有變量的字符串,將從中提取鏈接的校驗和值(md5+base64)和生命周期。
secure_link?expression;
表達(dá)式中使用的變量通常與請求相關(guān)聯(lián),一般可以設(shè)置為 $arg_md5
,這個變量名是可以自己起的,目的就是獲取到這個加密值。將從字符串中提取的校驗和值與 secure_link_md5 指令定義的表達(dá)式的 MD5 哈希值進(jìn)行比較。如果校驗和不同,則 $secure_link
變量設(shè)置為空字符串。如果校驗和相同,則檢查鏈路壽命。
如果鏈接的生命周期有限且時間已過,則 $secure_link
變量設(shè)置為“0”。否則,設(shè)置為“1”。請求中傳遞的 MD5 哈希值以 base64url 編碼。如果鏈接的生命周期有限,則過期時間設(shè)置為自 Epoch(1970 年 1 月 1 日星期四 00:00:00 GMT)以來的秒數(shù)。
該值在 MD5 哈希后的表達(dá)式中指定,并以逗號分隔,比如 $arg_sign
、$arg_expires
,后面這個 expires 就是可以通過 GET 獲取的過期時間值。請求中傳遞的過期時間可通過 $secure_link_expires
變量在secure_link_md5 指令中使用,不使用也行,后面測試時我們會看到。如果未指定過期時間,則鏈接具有無限的生命周期。
secure_link_md5
定義一個表達(dá)式,將計算 MD5 哈希值并將其與請求中傳遞的值進(jìn)行比較。
secure_link_md5?expression;
表達(dá)式應(yīng)包含鏈接(資源)的安全部分和秘密成分。如果鏈接的生命周期有限,則表達(dá)式還應(yīng)包含 $secure_link_expires
。為了防止未經(jīng)授權(quán)的訪問,表達(dá)式可能包含有關(guān)客戶端的一些信息,例如其地址和瀏覽器版本。
比如我們可以指定為 secure_link_md5 '$uri zzyy';
,那么上面 secure_link 第一個設(shè)置的值就是 base64_encode(md5('請求的鏈接地址 zzyy'))
這樣的結(jié)果就可以和 secure_link_md5 的值匹配上。如果不匹配,$secure_link
會是空,如果使用了過期時間,并且時間確實(shí)過期了,那么就是 0 ,這時就可以使用 if 指令判斷是否驗證成功做出不同的操作。
看不懂是吧?沒事,一會測試?yán)舆\(yùn)行一下就明白了。
secure_link_secret
定義用于檢查所請求鏈接的真實(shí)性的秘鑰。
secure_link_secret word;
僅能在 location 下配置。請求鏈接的完整 URI 如下所示:
/prefix/hash/link
其中 hash 是 MD5 散列的十六進(jìn)制表示,用于連接鏈接和秘鑰,prefix 是不帶斜杠的任意字符串。如果請求的鏈接通過了真實(shí)性檢查,則 $secure_link
變量設(shè)置為從請求 URI 中提取的鏈接。否則,$secure_link
變量設(shè)置為空字符串。
這個又是啥玩意?注意,它是單獨(dú)使用的,和上面那兩個沒關(guān)系。假如我們設(shè)置 secure_link_secret zyblog;
請求地址為 /p/17ceb6c14933609f0ab68e37fe633b1a/1.html ,那么中間加密的部分其實(shí)就是 md5('1.htmlzyblog')
。前面的 /p/ 是沒啥用的,因為這個配置只能在 location 下配置,所以這個前綴就是 location 的 URI 部分。
使用上面的鏈接可以將 $secure_link
設(shè)置為 1.html ,然后我們就可以通過 rewrite 去請求真實(shí)的 1.html 了,這里可以加個判斷,如果 $secure_link
為空,就返回異常頁面,這樣就實(shí)現(xiàn)了鏈接的驗證。
嗯,說不明白,還是一會看測試效果吧。
變量
$secure_link
鏈接檢查的狀態(tài)。具體值取決于所選的操作模式$secure_link_expires
請求中傳遞的鏈接的生命周期,僅用于 secure_link_md5 指令
安全鏈接測試(一)secure_link 與 secure_link_md5
好了,看完了配置指令,咱們就來看看怎么使用。首先看第一種方式,就是 secure_link 與 secure_link_md5 組合的方式。先添加以下的測試代碼。
log_format securelink 'secure_link_expires=$secure_link_expires, secure_link=$secure_link';
server{
listen 8034;
location /securelink1/ {
access_log logs/34.securelink.log securelink;
alias html/;
secure_link $arg_md5,$arg_expires;
secure_link_md5 "$secure_link_expires$uri$remote_addr zyblog secret";
if ($secure_link = "") {
return 200 nosecure;
}
if ($secure_link = "0") {
return 200 timeexpire;
}
}
}
上面的日志記錄,是為了看兩個變量的變化情況。然后我們指定 secure_link 的值,分別是從 GET 獲取到的 md5 參數(shù)和 expires 參數(shù)。expires 可以給個時間戳,我們給的是明天的一個時間點(diǎn)。secure_link_md5 我們設(shè)置的內(nèi)容是通過 "過期時間+請求鏈接URI+IP地址+空格+zyblog+空格+secret" 這一個字符串進(jìn)行加密的。
然后就是使用兩個 if 指令進(jìn)行判斷,如果 secure_link
為空,表示安全驗證沒通過,如果 $secure_link
是 0 ,表示過期了,分別通過 return 返回不同的內(nèi)容。
然后咱們先測試一下啥參數(shù)都不帶的。
???~?curl?'http://192.168.56.88:8034/securelink1/'
nosecure
直接返回 nosecure 。再看下日志。
//?34.securelink.log
secure_link_expires=-,?secure_link=-
兩個變量都是空的。然后我們準(zhǔn)備一下要加密的簽名數(shù)據(jù),根據(jù) secure_link_md5 的設(shè)置,我們可以直接通過 Linux 的 openssl 工具進(jìn)行加密,如果沒有安裝這個的話可以自己安裝一下哦,或者使用 PHP 以及其它動態(tài)語言也是可以的,就是md5 之后再 base64 一下。
[root@localhost?article.http.d]#?echo?-n?'1663719873/securelink1/192.168.56.1?zyblog?secret'?|?openssl?md5?-binary?|?openssl?base64?|?tr?+/?-_?|?tr?-d?=
VEJ41JfqBbXXaGJRXWK3rw
1663719873 是我們一會要通過 expires 參數(shù)傳過來的過期時間,現(xiàn)在用當(dāng)前時間,后面我們才會測試過期的問題,在 secure_link 配置中逗號后面第二個參數(shù)我們放置的就是它,然后它就會到 $secure_link_expires
變量中。secure_link_md5 中第一個變量就是它,所以我們要拼接在最前面,然后是請求的地址,這里就是請求根目錄,URI 就是 /securelink1/
,然后就是客戶端 IP 地址,我這里是 192.168.56.1
,最后接上空格和固定的字符串,加密后的結(jié)果就是 VEJ41JfqBbXXaGJRXWK3rw
。然后發(fā)送請求時使用 GET 帶上這兩個參數(shù)吧。
curl?'http://192.168.56.88:8034/securelink1/?md5=VEJ41JfqBbXXaGJRXWK3rw&expires=1663719873'
是不是發(fā)現(xiàn)可以打開首頁了?因為我們做了 alias ,所以就是直接打開 html 目錄下的首頁了。再看下日志。
//?34.securelink.log
secure_link_expires=1663719873,?secure_link=1
兩個值都取到了,secure_link 的值是 1 ,不符合 if 每個人的中的內(nèi)容,不會直接 return 返回,正常向下執(zhí)行。
secure_link_expires=1662769473,?secure_link=1
接下來試試過期問題,先改造一下。
secure_link?$arg_md5,1662769473;
secure_link_md5?"$uri$remote_addr?zyblog?secret";
這回我們讓過期時間的設(shè)置不使用傳遞過來的參數(shù)了,而是一個固定值,這個值是比現(xiàn)在的時間稍微早一點(diǎn)的時間。然后 secure_link_md5 也改了下,不使用 secure_link_expires
。
???~?curl?'http://192.168.56.88:8034/securelink1/?md5=EzLUxfpwyLdp7bDv0m0l0Q'
timeexpire
查看日志,secure_link
被設(shè)置成了 0 ,而 secure_link_expires
則是我們 secure_link 中設(shè)置的那個值。
//?34.securelink.log
secure_link_expires=1662769473,?secure_link=0
然后我們再將過期時間設(shè)置為比現(xiàn)在晚一點(diǎn)的時候,比如比當(dāng)前時間多個幾分鐘。
secure_link?$arg_md5,1663644527;
現(xiàn)在訪問又正常了,從這里可以看出,過期時間是基于當(dāng)前系統(tǒng)的時間值的,如果小于當(dāng)前系統(tǒng)時間,就是過期的,如果大于當(dāng)前系統(tǒng)時間,就是正常的。而如果將 $secure_link_expires
加入到 secure_link_md5 中一起加密的話,則是保證這個請求必須在 1 秒內(nèi)到達(dá)。假設(shè)有代理或者黑客大佬中間攔截了請求,就會導(dǎo)致時間過期,而如果時間參數(shù)對不上加密內(nèi)容,則會導(dǎo)致驗證不通過。這里和我們之前講過的接口簽名 sign 是一樣的概念。
時間參數(shù)最重要的作用,就是讓簽名產(chǎn)生變化,如果沒有這個動態(tài)值,那么簽名就會一直是一樣的,這種簽名有跟沒有不就沒啥區(qū)別了。
不過就像做接口簽名一樣,客戶端和服務(wù)端如果時間不一致,就可能導(dǎo)致簽名失敗。一般有兩種解決方式,一是對發(fā)來的時間參數(shù)判斷,比如1分鐘或幾分鐘內(nèi)的都有效,二是每次接口請求都返回服務(wù)器的時間,讓客戶端保存一份,并以這個時間戳為基準(zhǔn)進(jìn)行計時。通常來說,第一種方式是我們用動態(tài)語言時常用的方式,第二種則可以應(yīng)用在 Nginx 這個配置中。
對于接口簽名不太了解的同學(xué),可以查閱下相關(guān)的資料哦。一般都是通過 URI+請求參數(shù)排序+時間戳 這種加密形式進(jìn)行接口簽名的。
當(dāng)然,我們也可以不使用過期時間,secure_link 不加過期時間參數(shù)就可以了。
secure_link $arg_md5;
secure_link_md5 "$uri$remote_addr zyblog secret";
然后對參數(shù)進(jìn)行加密。
[root@localhost?article.http.d]#?echo?-n?'/securelink1/192.168.56.1?zyblog?secret'?|?openssl?md5?-binary?|?openssl?base64?|?tr?+/?-_?|?tr?-d?=
EzLUxfpwyLdp7bDv0m0l0Q
直接訪問,可以正確獲得訪問結(jié)果。
curl?'http://192.168.56.88:8034/securelink1/?md5=EzLUxfpwyLdp7bDv0m0l0Q'
日志的內(nèi)容如下。
secure_link_expires=-,?secure_link=1
安全鏈接測試(二)secure_link_secret
第二種,secure_link_secret 的使用方法,還是先來準(zhǔn)備測試代碼吧。
location /securelink2/ {
access_log logs/34.securelink.log securelink;
alias html/;
secure_link_secret zyblog.com.cn;
if ($secure_link = "") {
return 200 nosecure;
}
rewrite ^ /$secure_link;
}
location / {
root html;
}
這段代碼中,我們指定簽名的 Key 是 zyblog.com.cn 。如果匹配不成功,就返回 nosecure 的內(nèi)容,如果成功了,$secure_link
會變成簽名內(nèi)容之后的 URI 地址。也就是上面配置解釋中 link 的部分。接著就通過 rewrite 重寫到 link 地址。
先來看看直接訪問的效果。
curl?'http://192.168.56.88:8034/securelink2/aaa'
nosecure
不出意外的返回 nosecure ,因為我們的驗證沒有通過,$secure_link
的值是空的,先做一個加密密鑰過來吧,根據(jù)規(guī)則,直接拼接 aaa 和 zyblog.com.cn ,然后 md5 就可以了,這里不需要再 base64 了。
[root@localhost?article.http.d]#?echo?-n?'aaazyblog.com.cn'?|?openssl?md5?-hex
(stdin)=?e09475846aa906796ef997b684eced07
獲得密鑰之后,加到 location 和 aaa 中間。
curl?'http://192.168.56.88:8034/securelink2/e09475846aa906796ef997b684eced07/aaa'
是不是可以正常訪問啦,看看日志內(nèi)容。
//?34.securelink.log
secure_link_expires=-,?secure_link=aaa
secure_link
確實(shí)變成了密碼后面的 URI 內(nèi)容了。對于指定的文件也需要加密。
[root@localhost?article.http.d]#?echo?-n?'tf2/2.htmlzyblog.com.cn'?|?openssl?md5?-hex
(stdin)=?2fef203746d3684862e8d2607bfebc86
現(xiàn)在需要訪問的是 tf2 目錄下的 2.html 文件。
curl?'http://192.168.56.88:8034/securelink2/2fef203746d3684862e8d2607bfebc86/tf2/2.html'
也是可以正常訪問的。這里需要注意的是,它僅能對非根的的路徑進(jìn)行安全連接保護(hù)。比如下面這樣就不行。
curl?'http://192.168.56.88:8034/securelink2/xxxx/'
即使你是 "zyblog.com.cn" 或 “/zyblog.com.cn” 這樣加密都不行,但要想直接訪問可以直接指定文件名。
[root@localhost?article.http.d]#?echo?-n?'index.htmlzyblog.com.cn'?|?openssl?md5?-hex
(stdin)=?2a19ca1a01c0121c7bb6b4ecb8d109dc
這樣就可以訪問根目錄下的 index.html 了。
curl?'http://192.168.56.88:8034/securelink2/2a19ca1a01c0121c7bb6b4ecb8d109dc/index.html'
范圍分片
這里的范圍分片,其實(shí)就是范圍請求的意思,也就是 HTTP 中的那個 Range 請求頭和響應(yīng)頭的作用。不過這里的配置不是針對客戶端的,而是針對代理服務(wù)器的。它的命名是 ngx_http_slice_module 模塊(1.9.8),是一個過濾器,用于將請求拆分為子請求,每個子請求返回一定范圍的響應(yīng)。過濾器提供更有效的大響應(yīng)緩存。
它只有一個配置指令,并且不是包含在 Nginx 核心源碼中的,需要通過 --with-http_slice_module 編譯。
slice
設(shè)置切片的大小。
slice?size;
默認(rèn) 0 表示禁用將響應(yīng)拆分為切片。請注意,過低的值可能會導(dǎo)致內(nèi)存使用過多并打開大量文件。
為了讓子請求返回所需的范圍,應(yīng)將 $slice_range
變量作為 Range 請求標(biāo)頭字段傳遞給代理服務(wù)器。如果啟用了緩存,則應(yīng)將 $slice_range
添加到緩存鍵中,并應(yīng)啟用具有 206 狀態(tài)代碼的響應(yīng)的緩存。
變量
$slice_range
HTTP字節(jié)范圍格式的當(dāng)前切片范圍,例如bytes=0-1048575。
范圍分片測試
這個測試需要借助反向代理,因為它主要是針對代理的子請求的嘛。所以我們添加如下配置。
# http
proxy_cache_path slicecache levels=1:2 keys_zone=slicecache:10m;
server{
………………
location ~ /slice(.*) {
slice 100;
proxy_cache slicecache;
proxy_cache_key $uri$is_args$args$slice_range;
proxy_set_header Range $slice_range;
proxy_cache_valid 200 206 10m;
proxy_pass http://127.0.0.1/$1?$args;
}
}
代理相關(guān)的配置就不多說了,主要就是做了個代理緩存。然后添加了 slice 指令,設(shè)置為 100 個字符。然后需要設(shè)置代理請求頭的 Range 頭,值直接就放 $slice_range
就好了。另外就是有效緩存響應(yīng)碼要把 206 加上。這些配置都是我們之前在學(xué)習(xí)代理時講過的。
然后準(zhǔn)備一個 PHP 文件,沒什么特別的內(nèi)容,就是獲取 Range 請求頭的內(nèi)容,然后返回響應(yīng)時響應(yīng)為 206 狀態(tài)碼,并且添加 Content-Range 響應(yīng)頭。最后循環(huán)隨機(jī)輸出數(shù)據(jù)。
//?vim?/usr/local/nginx/html/fastcgi1/slice/1.php
if?(isset?(?$_SERVER?['HTTP_RANGE']?))?{
??if?(preg_match?(?'/bytes=\h*(\d+)-(\d*)[\D.*]?/i',?$_SERVER?['HTTP_RANGE'],?$matches?))?{
????$begin?=?intval?(?$matches?[1]?);
????if?(!?empty?(?$matches?[2]?))?{
??????$end?=?intval?(?$matches?[2]?);
????}
??}
}
header?(?'HTTP/1.1?206?Partial?Content'?);
header?(?"Content-Range:?bytes?$begin-$end/10000"?);
foreach(range(0,?99)?as?$v){
??echo?rand(1,?9);
}
請求之后,我們?nèi)タ?Proxy 緩存目錄,會發(fā)現(xiàn)生成了很多緩存。這就是因為我們每次都只是請求 100 字節(jié)范圍內(nèi)的數(shù)據(jù),所以每次請求的響應(yīng)就只有 100 字節(jié),總共會響應(yīng) 1000 個字節(jié),大概有 10 次子請求。這里只有 8 個目錄,但是還有二級目錄,總共生成的緩存文件應(yīng)該是 10 個。
[root@localhost?article.http.d]#?ll?/usr/local/nginx/slicecache/
total?0
drwx------?3?www?www?16?Sep?20?09:58?0
drwx------?3?www?www?16?Sep?20?09:58?1
drwx------?4?www?www?26?Sep?20?09:58?3
drwx------?3?www?www?16?Sep?20?09:58?4
drwx------?3?www?www?16?Sep?20?09:58?5
drwx------?3?www?www?16?Sep?20?09:58?a
drwx------?4?www?www?26?Sep?20?09:58?c
drwx------?3?www?www?16?Sep?20?09:58?f
隨便查看一個目錄下面的緩存文件,內(nèi)容就是 100 個字符。
[root@localhost?article.http.d]#?cat?/usr/local/nginx/slicecache/3/25/2c87b23befe050b716282f3280b5c253
??)c????????-)c
??R
KEY:?/slice/fastcgi1/slice/1.phpbytes=800-899
HTTP/1.1?206?Partial?Content
Server:?nginx/1.23.0
Date:?Tue,?20?Sep?2022?01:58:05?GMT
Content-Type:?text/html;?charset=UTF-8
Connection:?close
X-Powered-By:?PHP/7.2.24
Content-Range:?bytes?800-899/1000
2687293144586783221846674348597775216172183988478888753581981981732616122451579567834463585161967919
這 100 個字符在最終整體返回的數(shù)據(jù)中肯定是存在的,是整體響應(yīng)內(nèi)容的連續(xù)一部分。
請求分流
最后我們再來看到的是請求分流的功能。它還是比較有意思的,能夠根據(jù)一個變量內(nèi)容,進(jìn)行 Hash 分配到指定的內(nèi)容,有點(diǎn)類似于之前學(xué)習(xí)過的 Redis 的分槽的效果。這個模塊的全名是 ngx_http_split_clients_module 模塊,用于創(chuàng)建適用于 A/B 測試的變量,也稱為拆分測試。它直接包含在 Nginx 核心源碼中,直接就可以使用,也只有一個配置指令。
split_clients
為 A/B 測試創(chuàng)建一個變量。
split_clients?string?$variable?{?...?}
只能在 http 模塊下進(jìn)行配置。使用 MurmurHash2 對原始字符串的值進(jìn)行散列。和 Redis Cluster 中的 槽solt 類似,從 0 到 4294967295 的范圍內(nèi),根據(jù)配置的結(jié)果,會讓散列值落在一定的范圍內(nèi)。后面我們看例子再詳細(xì)說明。
請求分流測試
上面的內(nèi)容要是沒看懂,我們就直接測試效果。
# http
split_clients "${arg_a}zyblog" $variant {
50% aaa.html;
20% a.txt;
* index.html;
}
server {
# ………………
location /splitclient/ {
alias html/;
index $variant;
}
}
在 split_clients 配置中,我們定義了 $arg_a
拼接 zyblog 字符串做為 Hash 值,也就說,根據(jù)我們傳遞過來的 GET 參數(shù) a 的不同,就會有不同的哈希結(jié)果。上面配置的意思是,50% 代表散列結(jié)果為 0-2147483647 范圍內(nèi)的結(jié)果,就設(shè)置 $variant
為 aaa.html ;20% 代表散列值在 2147483648-3006477107 范圍內(nèi)的結(jié)果,$variant
為 a.txt ;剩下如果落在 3006477108 - 4294967295 范圍內(nèi),則將變量的值設(shè)置為 index.html 。
這一塊真的和 Redis Cluster 中相關(guān)的概念非常類似,如果不記得了,可以回到 Redis進(jìn)階:分布式部署RedisCluster(一) 這篇文章中,看一下 槽Slot 相關(guān)的說明。接下來就是測試了,不停地修改 a 參數(shù)的值就可以看到效果啦。
???~?curl?'http://192.168.56.88:8034//splitclient/'
111222333444
<h1>aaa</h1>
???~?curl?'http://192.168.56.88:8034//splitclient/?a=1'
this?is?a.txt.?111
???~?curl?'http://192.168.56.88:8034//splitclient/?a=2'
111222333444
<h1>aaa</h1>
???~?curl?'http://192.168.56.88:8034//splitclient/?a=3'
this?is?a.txt.?111
???~?curl?'http://192.168.56.88:8034//splitclient/?a=4'
<!DOCTYPE?html>
<html>
<head>
<title>Welcome?to?nginx!</title>
<style>
html?{?color-scheme:?light?dark;?}
body?{?width:?35em;?margin:?0?auto;
font-family:?Tahoma,?Verdana,?Arial,?sans-serif;?}
</style>
</head>
<body>
<h1>Welcome?to?nginx!123123</h1>
<p>If?you?see?this?page,?the?nginx?web?server?is?successfully?installed?and
working.?Further?configuration?is?required.</p>
<p>For?online?documentation?and?support?please?refer?to
<a?>nginx.org</a>.<br/>
Commercial?support?is?available?at
<a?>nginx.com</a>.</p>
<p><em>Thank?you?for?using?nginx.</em></p>
</body>
</html>
總結(jié)
安全鏈接這個,是不是感覺有點(diǎn)意思啊,雖說大部分情況下我們會在動態(tài)語言中做接口簽名,但靜態(tài)資源有需要的時候完全也可以通過 Nginx 來實(shí)現(xiàn)嘛。這樣不管動態(tài)還是靜態(tài)資源,都是有請求限制的啦。
范圍分片可能我們平常用得不多,大多數(shù)情況下可能是對一些下載文件做斷點(diǎn)續(xù)傳時會用到。
請求分流這個,其實(shí)可以實(shí)現(xiàn)更多的功能。因為我們可以設(shè)置變量,就可以將這個變量應(yīng)用到 location、if、rewrite 等等各種配置中去,甚至分開記錄日志都可以。非常強(qiáng)大,也非常靈活,期待各路高手大佬的開發(fā)咯,有好的案例也歡迎留言分享哦。
參考文檔:
http://nginx.org/en/docs/http/ngx_http_secure_link_module.html
http://nginx.org/en/docs/http/ngx_http_slice_module.html文章來源:http://www.zghlxwxcb.cn/news/detail-722582.html
http://nginx.org/en/docs/http/ngx_http_split_clients_module.html文章來源地址http://www.zghlxwxcb.cn/news/detail-722582.html
到了這里,關(guān)于【Nginx34】Nginx學(xué)習(xí):安全鏈接、范圍分片以及請求分流模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!