Nginx學(xué)習(xí):日志與鏡像流量復(fù)制總算到了日志模塊,其實(shí)這個(gè)模塊的指令之前我們就用過(guò)了,而且也是是非常常見(jiàn)的指令。相信這一塊的學(xué)習(xí)大家應(yīng)該不會(huì)有什么難度。另一個(gè)則是鏡像功能,這個(gè)估計(jì)用過(guò)的同學(xué)就比較少了,不過(guò)也并不是特別的復(fù)雜,一會(huì)講到的時(shí)候咱們?cè)僭敿?xì)說(shuō)哦。 今天的兩個(gè)模塊都是包含在 Nginx 源碼中的,不需要額外單獨(dú)編譯安裝。所有的配置指令大分部都可以在 http、server、location 中使用,僅有一個(gè)指令是只能配置在 http 中的,我會(huì)單獨(dú)說(shuō)明。 日志日志模塊是非常常用的模塊,這里指的是訪問(wèn)日志哦,不是 error_log 。錯(cuò)誤日志是屬于 HTTP 核心模塊的內(nèi)容,之前我們已經(jīng)學(xué)習(xí)過(guò)了。大多數(shù)情況下,我們只是去為每個(gè) Server 指定一個(gè)單獨(dú)的日志文件,這樣便于管理,或者有特殊需要就為某些 Location 指定。另外還有一些情況就是會(huì)屏蔽掉一些比如說(shuō) favicon.ico 文件或者靜態(tài)圖片等資源文件的訪問(wèn)日志記錄。 它的全名是 ngx_http_log_module 模塊,用于以指定的格式寫(xiě)入請(qǐng)求日志。請(qǐng)求記錄在處理結(jié)束位置的上下文中。如果在請(qǐng)求處理期間發(fā)生內(nèi)部重定向,它可能與原始位置不同。 還是先來(lái)學(xué)習(xí)它的配置指令,最后再進(jìn)行簡(jiǎn)單地測(cè)試。 access_log設(shè)置緩沖日志寫(xiě)入的路徑、格式和配置。 默認(rèn)值是 logs/access.log combined 。可以在同一配置級(jí)別上指定多個(gè)日志??梢酝ㄟ^(guò)在第一個(gè)參數(shù)中指定“syslog:”前綴來(lái)配置日志記錄到 syslog。特殊值 off 取消當(dāng)前級(jí)別的所有 access_log 指令。如果未指定格式,則使用預(yù)定義的“組合”格式。 必須要有的這個(gè) path 參數(shù),是指定日志要記錄到哪個(gè)文件的,可以相對(duì)也可以是絕對(duì)路徑的文件。后面的 format 則是根據(jù)后面要講的 log_format 配置,確定使用哪個(gè)日志格式。這個(gè)參數(shù)可以不填,不填走默認(rèn)的 combined 格式,下面會(huì)看到。 如果使用了 buffer 或 gzip (1.3.10, 1.2.7) 參數(shù),寫(xiě)入日志將被緩沖。緩沖區(qū)大小不得超過(guò)對(duì)磁盤(pán)文件的原子寫(xiě)入大小。對(duì)于 FreeBSD,這個(gè)大小是無(wú)限的。這個(gè)一會(huì)我們會(huì)測(cè)試。 啟用緩沖后,這些數(shù)據(jù)將馬上寫(xiě)入文件:
如果使用 gzip 參數(shù),則緩沖的數(shù)據(jù)將在寫(xiě)入文件之前進(jìn)行壓縮。壓縮級(jí)別可以設(shè)置在 1(最快,較少壓縮)和 9(最慢,最佳壓縮)之間。默認(rèn)情況下,緩沖區(qū)大小等于 64K 字節(jié),壓縮級(jí)別設(shè)置為 1。由于數(shù)據(jù)是按原子塊壓縮的,因此日志文件可以隨時(shí)被“zcat”解壓縮或讀取。 文件路徑可以包含變量(0.7.6+),但是這樣的日志有一些限制:
if 參數(shù) (1.7.0) 啟用條件日志記錄。如果條件評(píng)估為“0”或空字符串,則不會(huì)記錄請(qǐng)求。就是可以有條件的記錄到日志,后面我們也會(huì)測(cè)試這個(gè)參數(shù)。 另外,如果是新安裝好的 Nginx ,沒(méi)有別的訪問(wèn)日志配置,并且在編譯時(shí)有 log_format指定日志的格式。 默認(rèn)值 combined "..." ,它只能配置在 http 模塊下。轉(zhuǎn)義參數(shù) (1.11.8) 允許在變量中設(shè)置 json 或默認(rèn)字符轉(zhuǎn)義,默認(rèn)情況下使用默認(rèn)轉(zhuǎn)義。none 值 (1.13.10) 禁用轉(zhuǎn)義。對(duì)于默認(rèn)轉(zhuǎn)義,字符“"”、“\”和其他值小于 32 (0.7.0) 或大于 126 (1.1.6) 的字符將轉(zhuǎn)義為“\xXX”。如果找不到變量值,將記錄一個(gè)連字符(“-”)。對(duì)于json轉(zhuǎn)義,JSON字符串中不允許的所有字符都將被轉(zhuǎn)義:字符“”和“\”被轉(zhuǎn)義為“\”和“\\”,值小于32的字符被轉(zhuǎn)義為“\n”, “\r”、“\t”、“\b”、“\f”或“\u00XX”。 必須的 name 參數(shù)就是上面 access_log 所需要的那個(gè) format 參數(shù)。這樣兩邊配合起來(lái)就是一套完整的日志記錄功能了。 日志格式可以包含公共變量,以及僅在寫(xiě)入日志時(shí)存在的變量:
在現(xiàn)代 nginx 版本中,變量 $status (1.3.2, 1.2.2), $bytes_sent (1.3.8, 1.2.5), $connection (1.3.8, 1.2.5), $connection_requests (1.3.8, 1.2 .5), $msec (1.3.9, 1.2.6), $request_time (1.3.9, 1.2.6), $pipe (1.3.12, 1.2.7), $request_length (1.3.12, 1.2.7 )、$time_iso8601 (1.3.12, 1.2.7) 和 $time_local (1.3.12, 1.2.7) 也可用作公共變量。 發(fā)送到客戶端的標(biāo)題行具有前綴“sent_http_”,例如,$sent_http_content_range。 配置始終包含預(yù)定義的“組合”格式: 默認(rèn)安裝完成后提供的 nginx.conf 或 nginx.conf.default 中,有兩段注釋掉的日志配置,其實(shí)就是最基本的日志配置信息。你可以打開(kāi)試試哦。 open_log_file_cache定義一個(gè)緩存,用于存儲(chǔ)名稱(chēng)包含變量的常用日志的文件描述符。 該指令具有以下參數(shù):
這個(gè)確實(shí)沒(méi)用過(guò),不過(guò)看樣子是緩存打開(kāi)的日志文件的句柄的。也不知道怎么測(cè)出效果,所以咱們就不演示了哈。有興趣的小伙伴可以自己看一下,有相關(guān)的經(jīng)驗(yàn)的大佬也歡迎留言評(píng)論哈。 日志測(cè)試好了,日志模塊的配置指令就是上面那三個(gè),不是特別復(fù)雜吧,接下來(lái)我們就簡(jiǎn)單測(cè)試一下。先配置兩個(gè) log_format ,名字就叫 log1 和 log2 吧,為了測(cè)試方便。真實(shí)業(yè)務(wù)場(chǎng)景下還是要根據(jù)自己的需求好好起名字哈。 然后找一個(gè) Server ,建個(gè) lcoation 。 這個(gè)配置是啥意思呢?第一條 access_log ,加了一些參數(shù),分別是緩沖區(qū)配置、gzip壓縮一下,然后還有條件。也就是說(shuō),當(dāng)我們的 GET 參數(shù)中有 a 這個(gè)參數(shù)時(shí),訪問(wèn)日志會(huì)記錄到 logs/log1_access_con.log.gz 這個(gè)文件中。 第二條 access_log ,沒(méi)有別的參數(shù),就是最簡(jiǎn)單的使用 log1 的配置。現(xiàn)在直接訪問(wèn)一下吧,先看下不帶任何參數(shù)。 普通的日志記錄文件中,清楚地看到了訪問(wèn)請(qǐng)求的情況。注意最后有兩個(gè)空的雙引號(hào),并且 logs/log1_access_con.log.gz 創(chuàng)建了,但還是空的。然后我們?cè)賻б粋€(gè) 看出來(lái)不同了吧,最后的一個(gè)空引號(hào)有值了,因?yàn)槲覀冊(cè)谏厦娴?log1 的 log_format 中最后加入了 查看解壓出來(lái)文件內(nèi)容,應(yīng)該和上面記錄的日志是一樣的。不過(guò)這邊記錄的日志都是有最后那個(gè) GET 參數(shù)的。 好了,上面還有一個(gè) log2 的格式配置,使用了 訪問(wèn)之后查看日志文件,記錄的內(nèi)容是這樣的。 記錄 POST 日志在之前學(xué)習(xí)內(nèi)嵌變量時(shí),我們就說(shuō)過(guò),所有的變量都可以用在日志記錄中,而且之前還學(xué)習(xí)過(guò)一些變量是只能在日志中體現(xiàn)的。比如說(shuō) 為了利用 Nginx 的強(qiáng)大性能,并同步收集到 POST 數(shù)據(jù)埋點(diǎn)信息,我們也可以直接簡(jiǎn)單地將 POST 數(shù)據(jù)變量放到日志格式配置中就可以實(shí)現(xiàn)這種功能了。 上面的配置中,只是在默認(rèn)日志最后多加了一個(gè) 看到日志記錄的結(jié)果了吧。不過(guò)需要注意的是,POST 還有一種提交格式是 FORM-DATA ,就是需要上傳文件時(shí)要用的那種格式,這種格式獲得的結(jié)果是不一樣的哦。 大數(shù)據(jù)提取日志時(shí)需要注意這兩塊的不同哦。 鏡像 Mirror這個(gè)鏡像是啥?在沒(méi)系統(tǒng)學(xué)習(xí)文檔之前我都不知道還有這么個(gè)東西。它的全稱(chēng)是 ngx_http_mirror_module 模塊(1.13.4)通過(guò)創(chuàng)建后臺(tái)鏡像子請(qǐng)求來(lái)實(shí)現(xiàn)原始請(qǐng)求的鏡像,并且會(huì)忽略對(duì)鏡像子請(qǐng)求的響應(yīng)。 還是看不懂吧?其實(shí)呀,它就是可以將我們的請(qǐng)求再發(fā)給另一個(gè)鏡像地址,它只管發(fā)送,不管那邊會(huì)有什么響應(yīng)。就相當(dāng)于是將流量復(fù)制了一份。我們先來(lái)看它的配置。 mirror設(shè)置原始請(qǐng)求將被鏡像到的 URI。 默認(rèn)值是 off ,打開(kāi)的話就是設(shè)置一個(gè) URI 就可以了,這個(gè) URI 就是要發(fā)送到的地址??梢栽谕慌渲眉?jí)別上指定多個(gè)鏡像。 mirror_request_body指示客戶端請(qǐng)求正文是否被鏡像。啟用后,將在創(chuàng)建鏡像子請(qǐng)求之前讀取客戶端請(qǐng)求正文。 在這種情況下,由 proxy_request_buffering、fastcgi_request_buffering、scgi_request_buffering 和 uwsgi_request_buffering 指令設(shè)置的無(wú)緩沖客戶端請(qǐng)求正文代理將被禁用。 這個(gè)配置默認(rèn)是 on ,如果改成 off 的話,POST 請(qǐng)求中的 Body 部分就不會(huì)被發(fā)送到鏡像地址上了。 鏡像流量復(fù)制測(cè)試好了,直接來(lái)測(cè)試吧,這個(gè)東西要是上面沒(méi)看懂,那就手動(dòng)測(cè)試一下,不動(dòng)手,光看概念,不懂的始終還是不懂。我們先準(zhǔn)備一個(gè)鏡像 location 。 設(shè)置一個(gè) mirror 指定地址為當(dāng)前目錄的 26.php 這個(gè)文件,當(dāng)然我們也可以設(shè)置成靜態(tài)文件,不過(guò)為了記錄請(qǐng)求是否真的發(fā)過(guò)去了,使用動(dòng)態(tài)文件還是方便些。 這個(gè) 26.php 里面就是記錄一下請(qǐng)求的內(nèi)容到一個(gè)日志文件中。不需要返回什么響應(yīng),因?yàn)殓R像是會(huì)忽略響應(yīng)的嘛,它只是將請(qǐng)求發(fā)走,響應(yīng)還是按正常的響應(yīng),不會(huì)走鏡像中的響應(yīng)。 上面兩個(gè)準(zhǔn)備好了之后,我們就可以測(cè)試了。 可以看到,請(qǐng)求內(nèi)容被完整記錄了下來(lái),但是訪問(wèn)路徑返回的響應(yīng)還是我們的靜態(tài)首頁(yè)的內(nèi)容。不過(guò)你會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題,這個(gè)日志被記錄了兩條,也就是說(shuō),這個(gè) 26.php 被訪問(wèn)了兩次。如果我們直接訪問(wèn)這個(gè) php 頁(yè)面,是只會(huì)正常記錄一次的。 這個(gè)原因我也沒(méi)找到,網(wǎng)上也沒(méi)有相關(guān)的資料。 那么這個(gè)鏡像功能可以有什么實(shí)際的應(yīng)用嗎?一是可以做流量放大,比如多次請(qǐng)求;二是灰度發(fā)布驗(yàn)證,通過(guò)鏡像到新版來(lái)驗(yàn)證新版本是否會(huì)報(bào)錯(cuò);三是忽略響應(yīng)很重要,可以發(fā)送一些回調(diào)驗(yàn)證之類(lèi)的請(qǐng)求。 不過(guò)需要注意的是,雖然會(huì)忽略響應(yīng),但如果鏡像的地址無(wú)響應(yīng)或者響應(yīng)慢的時(shí)候,也會(huì)拖累主請(qǐng)求的響應(yīng)速度。另外如果是 POST/PUT/DELETE 這些請(qǐng)求,一定要清楚地知道自己發(fā)送的請(qǐng)求會(huì)對(duì)數(shù)據(jù)產(chǎn)生的影響,并且鏡像端要做好日志記錄。 總結(jié)日志功能很重要,雖然錯(cuò)誤日志可能更有利于我們進(jìn)行調(diào)試,發(fā)現(xiàn)問(wèn)題。但是訪問(wèn)日志同樣也很關(guān)鍵,網(wǎng)站的很多統(tǒng)計(jì),流量、熱點(diǎn)鏈接、爬蟲(chóng)分析、黑客防護(hù)等也都需要通過(guò)分析訪問(wèn)日志來(lái)實(shí)現(xiàn)。因此,大部分情況下,咱們還是要打開(kāi)并且配置好相應(yīng)的訪問(wèn)日志信息的。但是訪問(wèn)日志一般會(huì)比較大,因此會(huì)有日志需要分割保存的問(wèn)題,關(guān)于這個(gè)問(wèn)題,我們后面再說(shuō),但其實(shí)非常簡(jiǎn)單,大家自己先去找找相關(guān)的資料也沒(méi)問(wèn)題。 另一個(gè)鏡像模塊,真的之前從來(lái)不知道,現(xiàn)在雖然了解了,但是要想靈活運(yùn)用還是需要更多的實(shí)踐的。所以咱們也不瞎吹牛了,功能用法了解之后就是實(shí)踐運(yùn)用嘗試一下咯。 參考文檔: http:///en/docs/http/ngx_http_log_module.html http:///en/docs/http/ngx_http_mirror_module.html |
|
|
來(lái)自: 硬核項(xiàng)目經(jīng)理 > 《待分類(lèi)》