Nginx 之 stub_status log gzip rewrite referer header 模塊介紹

1? 概述

本文將介紹如下的六個(gè)模塊,介紹其相關(guān)的功能和配置

ngx_http_stub_status_module模塊

ngx_http_log_module模塊

ngx_http_gzip_module模塊

ngx_http_rewrite_module模塊

ngx_http_referer_module模塊

ngx_http_headers_module模塊

2ngx_http_stub_status_module模塊

用于輸出nginx的基本狀態(tài)信息

輸出信息示例:

Active connections: 291

server accepts handled requests

16630948 16630948 31070465

對(duì)應(yīng)上面accepts,handled,requests三個(gè)值

Reading: 6 Writing: 179 Waiting: 106

輸出內(nèi)容字段解釋如下:

Active connections:當(dāng)前狀態(tài),活動(dòng)狀態(tài)的連接數(shù)

accepts:統(tǒng)計(jì)總值,已經(jīng)接受的客戶端請(qǐng)求的總數(shù)

handled:統(tǒng)計(jì)總值,已經(jīng)處理完成的客戶端請(qǐng)求的總數(shù)

requests:統(tǒng)計(jì)總值,客戶端發(fā)來的總的請(qǐng)求數(shù)

Reading:當(dāng)前狀態(tài),正在讀取客戶端請(qǐng)求報(bào)文首部的連接的連接數(shù)

Writing:當(dāng)前狀態(tài),正在向客戶端發(fā)送響應(yīng)報(bào)文過程中的連接數(shù)

Waiting:當(dāng)前狀態(tài),正在等待客戶端發(fā)出請(qǐng)求的空閑連接數(shù)

stub_status;

示例:

名字可以更改,如把basic_status改為status.同時(shí)建議加上權(quán)限,這樣比較安全,如僅允許172.18.50.99這臺(tái)機(jī)器才能訪問該網(wǎng)站

location /status {

stub_status;

allow 172.18.50.99;

deny all;

}

3? ngx_http_log_module模塊

指定日志格式記錄請(qǐng)求,首先要定義log的格式和該格式的名稱,然后再通過格式的名稱對(duì)定義的log進(jìn)行調(diào)用,調(diào)用是指定生成日志的路徑。

.1、log_format

log_format? name string ...;

string可以使用nginx核心模塊及其它模塊內(nèi)嵌的變量

.2、access_log

access_log? path [format [buffer=size] [gzip[=level]] ?[flush=time] [if=condition]];

訪問日志文件路徑,格式及相關(guān)的緩沖的配置

access_log? off;關(guān)閉日志的記錄

.示例

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

access_log? /spool/logs/nginx-access.log compressionbuffer=32k;

.3、open_log_file_cache

open_log_file_cache? max=N [inactive=time] ?[min_uses=N] [valid=time];

open_log_file_cache? off;

緩存各日志文件相關(guān)的元數(shù)據(jù)信息

max:緩存的最大文件描述符數(shù)量

min_uses:在inactive指定的時(shí)長(zhǎng)內(nèi)訪問大于等于此值方可被當(dāng)作活動(dòng)項(xiàng)

inactive:非活動(dòng)時(shí)長(zhǎng)

valid:驗(yàn)正緩存中各緩存項(xiàng)是否為活動(dòng)項(xiàng)的時(shí)間間隔

4? ngx_http_gzip_module模塊

用gzip方法壓縮響應(yīng)數(shù)據(jù),節(jié)約帶寬,默認(rèn)是nginx服務(wù)不壓縮文件,但是由于互聯(lián)網(wǎng)帶寬成本高,所以一般都是要對(duì)服務(wù)器上的文件進(jìn)行壓縮,故需要啟用改功能。

.1、gzip

gzip? on | off;

啟用或禁用gzip壓縮

.2、gzip_comp_level

gzip_comp_level? level;

壓縮比由低到高:1到9,默認(rèn):1

.3、gzip_disable

gzip_disable? regex ...;

匹配到客戶端瀏覽器不執(zhí)行壓縮

.4、gzip_min_lengthlength;

啟用壓縮功能的響應(yīng)報(bào)文大小閾值

.5、gzip_http_version

gzip_http_version? 1.0 | 1.1;

設(shè)定啟用壓縮功能時(shí),協(xié)議的最小版本,默認(rèn):1.1

.6、gzip_buffers

gzip_buffers? number size;

支持實(shí)現(xiàn)壓縮功能時(shí)緩沖區(qū)數(shù)量及每個(gè)緩存區(qū)的大小,默認(rèn):32 4k或168k

.7、gzip_types

gzip_types? mime-type ...;

指明僅對(duì)哪些類型的資源執(zhí)行壓縮操作;即壓縮過濾器

默認(rèn)包含有text/html,不用顯示指定,否則出錯(cuò)

一般而言,文本的適合壓縮,但是jpg一般是壓縮過才放到服務(wù)器上,所以有些格式就不用再次壓縮,防止對(duì)服務(wù)器造成不必要的負(fù)擔(dān)

cat? /etc/nginx/mime.tyeps來查看壓縮的類型有哪些

.8、gzip_vary

gzip_vary? on | off;

如果啟用壓縮,是否在響應(yīng)報(bào)文首部插入“Vary: Accept-Encoding”

.9、gzip_proxied

gzip_proxied? off | expired | no-cache | no-store | private| no_last_modified| no_etag| auth| any ...;

nginx對(duì)于代理服務(wù)器請(qǐng)求的響應(yīng)報(bào)文,在何種條件下啟用壓縮功能

這個(gè)功能是針對(duì)nginx充當(dāng)代理來說的,如果不是代理,該選項(xiàng)就不用處理

off:對(duì)被代理的請(qǐng)求不啟用壓縮

expired,no-cache, no-store,private:對(duì)代理服務(wù)器請(qǐng)求的響應(yīng)報(bào)文首部Cache-Control值任何一個(gè),啟用壓縮功能

.示例:

server {?

......

?gzip?on;

gzip_comp_level? 6;

gzip_min_length? 64;

gzip_proxied any;

gzip_types? text/xml text/css application/javascripttext/plain;

}

測(cè)試,瀏覽器要支持壓縮,curl命令要加--compressed才支持壓縮,顯示支持壓縮,gzip,但是沒有顯示壓縮后的大小

curl -I --compress?http://172.18.50.73/m.txt

5? ngx_http_rewrite_module模塊:

將用戶請(qǐng)求的URI基于PCRE regex所描述的模式進(jìn)行檢查,而后完成重定向替換

當(dāng)舊的業(yè)務(wù)和新的業(yè)務(wù)不一樣,網(wǎng)站更名了,如網(wǎng)站名原來是www.dianping.com/zz后面改名為www.dianping.com/zhengzhou

.1、rewrite

rewrite?regex ?replacement ?[flag]

將用戶請(qǐng)求的URI基于regex所描述的模式進(jìn)行檢查,匹配到時(shí)將其替換為replacement指定的新的URI

注意:如果在同一級(jí)配置塊中存在多個(gè)rewrite規(guī)則,那么會(huì)自上而下逐個(gè)檢查;被某條件規(guī)則替換完成后,會(huì)重新一輪的替換檢查

隱含有循環(huán)機(jī)制,但不超過10次;如果超過,提示500響應(yīng)碼,[flag]所表示的標(biāo)志位用于控制此循環(huán)機(jī)制

如果replacement是以http://或https://開頭,則替換結(jié)果會(huì)直接以重向返回給客戶端

.[flag]:有以下幾個(gè)關(guān)鍵字

last:重寫完成后停止對(duì)當(dāng)前URI在當(dāng)前l(fā)ocation中后續(xù)的其它重寫操作,而后對(duì)新的URI啟動(dòng)新一輪重寫檢查;提前重啟新一輪循環(huán)

break:重寫完成后停止對(duì)當(dāng)前URI在當(dāng)前l(fā)ocation中后續(xù)的其它重寫操作,而后直接跳轉(zhuǎn)至重寫規(guī)則配置塊之后的其它配置;結(jié)束循環(huán),建議在location中使用

last和break是在服務(wù)器內(nèi)部操作的,客戶端不知道,客戶端訪問的url不會(huì)發(fā)生變化。但是服務(wù)器端會(huì)返回替換過的新的內(nèi)容。

redirect和permanent是服務(wù)器端給客戶端發(fā)一個(gè)301或者302的請(qǐng)求,客戶端需要重新發(fā)起請(qǐng)求,因此最終客戶端看到的瀏覽器是url和原始的url是不一樣的,url會(huì)被轉(zhuǎn)換,如將fj改成成fujian,那么當(dāng)用戶訪問的是http://172.18.50.73/fj/最終返回結(jié)果的時(shí)候,瀏覽器上的url會(huì)變更改為http://172.18.50.73/fujian/

redirect:臨時(shí)重定向,重寫完成后以臨時(shí)重定向方式直接返回重寫后生成的新URI給客戶端,由客戶端重新發(fā)起請(qǐng)求;不能以http://或https://開頭,使用相對(duì)路徑,狀態(tài)碼:302

permanent:重寫完成后以永久重定向方式直接返回重寫后生成的新URI給客戶端,由客戶端重新發(fā)起請(qǐng)求,狀態(tài)碼:301

例子

以下是正則表達(dá)式,$1表示前面的(.*).寫在server段或者location段里,以下四個(gè)選項(xiàng)只需四選一。

rewrite ^/fj/(.*)$? /fujian/$1 last | break |redirect |permanent;

測(cè)試

curl? -L http://172.18.50.73/fj/

或者直接在瀏覽器里輸入http://172.18.50.73/fj/查看結(jié)果

.2、return

return返回一個(gè)具體的地址

return code [text];

return? code URL;

停止處理并將指定的代碼返回給客戶端。非標(biāo)準(zhǔn)代碼444關(guān)閉連接而不發(fā)送響應(yīng)頭。

從版本0.8.42開始,可以指定重定向URL(代碼301,302,303,307和308)或響應(yīng)正文文本(對(duì)于其他代碼)。響應(yīng)正文文本和重定向網(wǎng)址可以包含變量。作為特殊情況,重定向URL可以指定為此服務(wù)器本地的URI,在這種情況下,根據(jù)請(qǐng)求方案($ scheme)和server_name_in_redirect和port_in_redirect指令形成完整的重定向URL。

此外,可以將用于代碼302的臨時(shí)重定向的URL指定為唯一的參數(shù)。這樣的參數(shù)應(yīng)以“http://”,“https://”或“$ scheme”字符串開頭。URL可以包含變量。

測(cè)試,能正常返回text,

return URL;

停止處理,并返回給客戶端指定的響應(yīng)碼。但是實(shí)際測(cè)試都是多次循環(huán)重定向,導(dǎo)致url不能打開,用curl命令測(cè)試,出現(xiàn)了報(bào)錯(cuò):curl: (47) Maximum(50) redirects followed導(dǎo)致實(shí)驗(yàn)不成功

.3、rewrite_log

rewrite_log? on | off;

是否開啟重寫日志,發(fā)送至error_log(notice level)

.4、set

set? $variable value;

用戶自定義變量,注意:變量定義和調(diào)用都要以$開頭

.5、if

if? (condition) { ... }

引入新的上下文,條件滿足時(shí),執(zhí)行配置塊中的配置指令;server,location

condition:比較操作符:

==相同

!=不同

~:模式匹配,區(qū)分字符大小寫

~*:模式匹配,不區(qū)分字符大小寫

!~:模式不匹配,區(qū)分字符大小寫

!~*:模式不匹配,不區(qū)分字符大小寫

文件及目錄存在性判斷:

-e, !-e存在(包括文件,目錄,軟鏈接)

-f, !-f文件

-d, !-d目錄

-x, !-x執(zhí)行

6? ngx_http_referer_module模塊

referer是指從哪兒跳轉(zhuǎn),該字段可以用來防止盜鏈。

比如網(wǎng)頁內(nèi)有代碼test referer 那么再網(wǎng)頁上test referer就會(huì)有鏈接到資源http://172.18.50.73/m.txt上,點(diǎn)擊該鏈接,log就會(huì)有對(duì)應(yīng)的referer在code之后,如這里是http://172.18.50.73/a.html,如果沒有referer,則code后的字段顯示“-”

.1、valid_referers? none|blocked|server_names|string...;

定義referer首部的合法可用值,不能匹配的將是非法值

none:請(qǐng)求報(bào)文首部沒有referer首部

blocked:請(qǐng)求報(bào)文有referer首部,但無有效值

server_names:參數(shù),其可以有值作為主機(jī)名或主機(jī)名模式

arbitrary_string:任意字符串,但可使用*作通配符

regular expression:被指定的正則表達(dá)式模式匹配到的字符串,要使用~開頭,例如:~.*\.magedu\.com

.示例:

valid_referers ?none blocked ?server_names ?*.sunny.com ??~\.sunny\.~\.baidu\.;

#定義有效的referers

if ($invalid_referer) {

return 403;

}

#定義如果出現(xiàn)無效的referer將返回code 403

7? ngx_http_headers_module模塊

向由代理服務(wù)器響應(yīng)給客戶端的響應(yīng)報(bào)文添加自定義首部,或修改指定首部的值

.1、add_header

add_header? name value [always];

例子

添加自定義首部,在server配置段里添加如下的配置

add_header proxy_name sunny_proxy;

add_header sunny_X-Via? $server_addr;

add_header?sunny_X-Cache?$upstream_cache_status;

add_header? sunny_X-Accel? $server_name;

測(cè)試

curl -I http://172.18.50.73/m.txt

那么在返回的報(bào)文頭部信息里多了如下的四行信息:

proxy_name: sunny_proxy

sunny_X-Via: 172.18.50.73

sunny_X-Cache: MISS

sunny_X-Accel: www.sunny.com

2、add_trailer

add_trailer? name value [always];

添加自定義響應(yīng)信息的尾部,沒測(cè)試通過,提示報(bào)錯(cuò)未知指令“add_trailer”

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容