Nginx純配置實(shí)現(xiàn)日志實(shí)時(shí)上報(bào)的思路與方法
前言
Nginx 作為常用的負(fù)載均衡網(wǎng)關(guān). 會(huì)產(chǎn)生大量的日志. 但是由于 Nginx 的配置文件是一種聲明式的編程范式, 不方便描述流程控制, 因此不能通過(guò)簡(jiǎn)單的指令實(shí)現(xiàn)日志的上報(bào).
通常 Nginx 的日志上報(bào)是需要寫一個(gè)shell腳本或其他語(yǔ)言的腳本來(lái)定時(shí)解析 Nginx 的 log 文件, 然后進(jìn)行上報(bào).
利用 NJS 模塊, 可以實(shí)現(xiàn)實(shí)時(shí)的日志上報(bào).
但是由于 NJS 模塊支持的指令的限制, 無(wú)法通過(guò)單一指令很好的實(shí)現(xiàn)日志上報(bào). 通過(guò)多個(gè)指令的組合可以實(shí)現(xiàn)非阻塞性的實(shí)時(shí)日志上報(bào).
該方案在 Nginx 中實(shí)現(xiàn), 不依賴Node, Python 等其他進(jìn)程
實(shí)現(xiàn)思路
Nginx 指令繁多, 以下為最近探索出的一種實(shí)現(xiàn)方式. 如果有更優(yōu)雅的實(shí)現(xiàn)方法, 歡迎留言交流.
雖然擁有了強(qiáng)大的 Njs 模塊可以寫 JS 腳本, 但是 NJS 模塊的指令有諸多限制, 并不像 Node 一樣可以實(shí)現(xiàn)任意的功能.
如果要實(shí)現(xiàn)日志的實(shí)時(shí)上報(bào), 需要滿足以下2個(gè)能力:
- 每個(gè)請(qǐng)求都可以觸發(fā)
- 后臺(tái)上報(bào), 不阻塞當(dāng)前請(qǐng)求的處理進(jìn)程
常用的 js_set 指令雖然可以在每個(gè)請(qǐng)求時(shí)都觸發(fā), 但是只支持同步的操作. 無(wú)法使用 fetch, subrequest 方法.
js_content 指令中可以使用 fetch 函數(shù). 但只能在 location 中使用. 因此可以利用其他指令將請(qǐng)求轉(zhuǎn)發(fā)到 js_content 的路徑中, 在該指令中完成日志的上報(bào).
而 http_auth_request_module 模塊的 auth_request 指令用于做請(qǐng)求的權(quán)限校驗(yàn), 如 jwt 校驗(yàn)等. 該指令在每個(gè)請(qǐng)求時(shí)都會(huì)觸發(fā), 創(chuàng)建一個(gè)子請(qǐng)求, 根據(jù)該請(qǐng)求的返回結(jié)果決定權(quán)限校驗(yàn)的結(jié)果.
因此可以結(jié)合這兩個(gè)模塊來(lái)實(shí)現(xiàn)日志的上報(bào).
實(shí)現(xiàn)步驟
1. 編譯 Nginx
實(shí)現(xiàn)該功能需要 Nginx 支持 ngx_http_js_module 和? ngx_http_auth_request_module 模塊.? 這2個(gè)模塊是默認(rèn)不安裝的. 需要自己編譯實(shí)現(xiàn)
- NJS 模塊安裝可以參考 當(dāng)JS邂逅Nginx
- http_auth_request_module 模塊只要在編譯時(shí)增加參數(shù) --with-http_auth_request_module 即可
編譯
./configure --add-module=[NJS 模塊路徑]/NJS/nginx --with-http_auth_request_module make && make install
2. 配置文件如下
http {
js_import http.js; # 引入 js 文件
server {
listen 80;
auth_request /proxy_report; # 該指令對(duì)于每個(gè)請(qǐng)求開始時(shí)都會(huì)觸發(fā), 創(chuàng)建一個(gè)子請(qǐng)求轉(zhuǎn)發(fā)到 proxy_report 路徑上
location / {
index index.html index.htm;
}
location /proxy_report {
internal; # 限制僅接受內(nèi)部請(qǐng)求
# 把原請(qǐng)求的 uri 和 method 數(shù)據(jù)保存在 header 中. 因?yàn)閍uth_request 請(qǐng)求會(huì)修改這些數(shù)據(jù).
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Original-METHOD $request_method;
# 轉(zhuǎn)發(fā)到另外一個(gè) server 上
proxy_pass http://localhost:8080/report;
}
}
server {
listen 8080;
# 上報(bào)接口放在另外一個(gè) server 中, 且該 server 中無(wú) auth_request 指令, 避免循環(huán)觸發(fā)請(qǐng)求
location /report {
# 通過(guò) js_content 指令引入一個(gè) js 處理腳本, 完成上報(bào)操作
js_content http.report;
}
}
}
// http.js 文件
import qs from "querystring";
async function report (r) {
let args = {
// 從 header 中取原始的 uri 和 method 等請(qǐng)求數(shù)據(jù)
uri: r.headersIn['X-Original-URI'],
method: r.headersIn['X-Original-METHOD'],
remoteAddress: r.remoteAddress,
status: r.status,
headersIn: JSON.stringifry(r.headersIn),
}
// 發(fā)出異步請(qǐng)求, 不阻塞當(dāng)前請(qǐng)求的進(jìn)程, 在后臺(tái)完成上報(bào)
ngx.fetch(`http://[上報(bào)服務(wù)路徑]?${qs.stringify(args)}`, {
method: 'GET',
})
// 返回200的狀態(tài)碼使校驗(yàn)指令成功
r.return(200)
}
export default { report }
總結(jié)
到此這篇關(guān)于Nginx純配置實(shí)現(xiàn)日志實(shí)時(shí)上報(bào)的思路與方法的文章就介紹到這了,更多相關(guān)Nginx日志實(shí)時(shí)上報(bào)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx+SpringBoot實(shí)現(xiàn)負(fù)載均衡的示例
這篇文章主要介紹了Nginx優(yōu)雅的實(shí)現(xiàn)負(fù)載均衡,幫助大家更好的理解和使用nginx,感興趣的朋友可以了解下2020-10-10
Nginx實(shí)現(xiàn)if多重判斷配置方法示例
這篇文章主要介紹了Nginx實(shí)現(xiàn)if多重判斷配置方法示例,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-05-05
Nginx 配置根據(jù)請(qǐng)求IP末段進(jìn)行分流的方法
這篇文章主要介紹了Nginx 配置根據(jù)請(qǐng)求IP末段進(jìn)行分流的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Windows下用Nginx配置https服務(wù)器及反向代理的問題
這篇文章主要介紹了Windows下用Nginx配置https服務(wù)器及反向代理的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
nginx的FastDFS分布式存儲(chǔ)模塊測(cè)試方法
很長(zhǎng)時(shí)間沒有關(guān)注FastDFS了,第一次使用FastDFS 是在 08年的時(shí)候11月的時(shí)候,那個(gè)時(shí)候是為了解決公司的數(shù)據(jù)存儲(chǔ)~那時(shí)候可能是對(duì)Fastdfs了解不深,功能還不算太健全,最后選擇了lustre。2010-12-12
Nginx Location指令URI匹配規(guī)則詳解小結(jié)
這篇文章主要介紹了Nginx Location指令URI匹配規(guī)則詳解小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
一文教會(huì)你使用Nginx訪問日志統(tǒng)計(jì)PV與UV
做網(wǎng)站的都知道,平常經(jīng)常要查詢下網(wǎng)站PV、UV等網(wǎng)站的訪問數(shù)據(jù),所以下面這篇文章主要給大家介紹了關(guān)于如何使用Nginx訪問日志統(tǒng)計(jì)PV與UV的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05

