亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用Nginx純配置實現日志實時上報

發布時間:2021-12-29 10:27:25 來源:億速云 閱讀:184 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“如何使用Nginx純配置實現日志實時上報”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“如何使用Nginx純配置實現日志實時上報”這篇文章吧。

    前言

    Nginx 作為常用的負載均衡網關. 會產生大量的日志. 但是由于 Nginx 的配置文件是一種聲明式的編程范式, 不方便描述流程控制, 因此不能通過簡單的指令實現日志的上報.

    通常 Nginx 的日志上報是需要寫一個shell腳本或其他語言的腳本來定時解析 Nginx 的 log 文件, 然后進行上報.

    利用 NJS 模塊, 可以實現實時的日志上報.

    但是由于 NJS 模塊支持的指令的限制, 無法通過單一指令很好的實現日志上報. 通過多個指令的組合可以實現非阻塞性的實時日志上報.

    該方案在 Nginx 中實現, 不依賴Node, Python 等其他進程

    實現思路

    Nginx 指令繁多, 以下為最近探索出的一種實現方式. 如果有更優雅的實現方法, 歡迎留言交流.

    雖然擁有了強大的 Njs 模塊可以寫 JS 腳本, 但是 NJS 模塊的指令有諸多限制, 并不像 Node 一樣可以實現任意的功能.

    如果要實現日志的實時上報, 需要滿足以下2個能力:

    1. 每個請求都可以觸發

    2. 后臺上報, 不阻塞當前請求的處理進程

    常用的 js_set 指令雖然可以在每個請求時都觸發, 但是只支持同步的操作. 無法使用 fetch, subrequest 方法.

    js_content 指令中可以使用 fetch 函數. 但只能在 location 中使用. 因此可以利用其他指令將請求轉發到 js_content 的路徑中, 在該指令中完成日志的上報.

    而 http_auth_request_module 模塊的 auth_request 指令用于做請求的權限校驗, 如 jwt 校驗等. 該指令在每個請求時都會觸發, 創建一個子請求, 根據該請求的返回結果決定權限校驗的結果.

    因此可以結合這兩個模塊來實現日志的上報.

    實現步驟

    1. 編譯 Nginx

    實現該功能需要 Nginx 支持 ngx_http_js_module 和  ngx_http_auth_request_module 模塊.  這2個模塊是默認不安裝的. 需要自己編譯實現

    1. NJS 模塊安裝可以參考 當JS邂逅Nginx

    2. http_auth_request_module 模塊只要在編譯時增加參數 --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; # 該指令對于每個請求開始時都會觸發, 創建一個子請求轉發到 proxy_report 路徑上
            location / { 
                index  index.html index.htm;
            }
            
            location /proxy_report {
                internal; # 限制僅接受內部請求
                # 把原請求的 uri 和 method 數據保存在 header 中. 因為auth_request 請求會修改這些數據.            
                proxy_set_header X-Original-URI $request_uri;
                proxy_set_header X-Original-METHOD $request_method;
                # 轉發到另外一個 server 上
                proxy_pass http://localhost:8080/report;
            }
        }
        
        server {
            listen 8080;
            # 上報接口放在另外一個 server 中, 且該 server 中無 auth_request 指令, 避免循環觸發請求
            location /report {
                # 通過 js_content 指令引入一個 js 處理腳本, 完成上報操作
                js_content http.report;
            }
        }
    }
    // http.js 文件
    
    import qs from "querystring";
    
    async function report (r) {
        let args = {
            // 從 header 中取原始的 uri 和 method 等請求數據
            uri: r.headersIn['X-Original-URI'],
            method: r.headersIn['X-Original-METHOD'],
            remoteAddress: r.remoteAddress,
            status: r.status,
            headersIn: JSON.stringifry(r.headersIn),
        }
        // 發出異步請求, 不阻塞當前請求的進程, 在后臺完成上報
        ngx.fetch(`http://[上報服務路徑]?${qs.stringify(args)}`, {
            method: 'GET',
        })
        // 返回200的狀態碼使校驗指令成功
        r.return(200)
    }
    
    export default { report }

    以上是“如何使用Nginx純配置實現日志實時上報”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    枣庄市| 望谟县| 安福县| 新晃| 琼中| 元江| 澄城县| 高安市| 阿克陶县| 宾川县| 宝丰县| 巴楚县| 武隆县| 沁水县| 上饶市| 兰州市| 永定县| 汉川市| 大竹县| 饶平县| 陆丰市| 靖西县| 汶上县| 瑞金市| 廊坊市| 喀什市| 双峰县| 苏尼特左旗| 芜湖县| 临沧市| 长宁区| 临潭县| 灵宝市| 彭阳县| 获嘉县| 维西| 长丰县| 历史| 通州市| 中卫市| 任丘市|