Nginx纯配置实现日志实时上报的思路与方法

 更新时间:2021年12月29日 09:28:10   作者:须臾同学69925  
在很多时候我们都需要在页面上实时查看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纯配置实现日志实时上报的思路与方法的文章就介绍到这了,更多相关Nginx日志实时上报内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • windows下nginx+tomcat配置负载均衡的方法

    windows下nginx+tomcat配置负载均衡的方法

    这篇文章主要介绍了windows下nginx+tomcat配置负载均衡的方法,需要的朋友可以参考下
    2016-09-09
  • Nginx限制某个IP同一时间段的访问次数和请求数示例代码

    Nginx限制某个IP同一时间段的访问次数和请求数示例代码

    nginx可以通过ngx_http_limit_conn_module和ngx_http_limit_req_module配置来限制ip在同一时间段的访问次数.具体示例代码大家参考下本文
    2017-08-08
  • nginx location块配置小结

    nginx location块配置小结

    nginx可以通过配置文件中的location指令来定义不同的请求匹配规则和处理逻辑,也就是描述不同请求资源在服务器的位置或者配置代理转发路径,这篇文章主要介绍了nginx location块配置,需要的朋友可以参考下
    2024-03-03
  • 在Nginx服务器上配置Google反向代理的基本方法

    在Nginx服务器上配置Google反向代理的基本方法

    这篇文章主要介绍了在Nginx服务器上配置Google反向代理的基本方法,文中使用到了SSL来加密反向代理,需要的朋友可以参考下
    2015-12-12
  • 详解nginx 的 default_server 定义及匹配规则

    详解nginx 的 default_server 定义及匹配规则

    这篇文章主要介绍了详解nginx 的 default_server 定义及匹配规则,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • keepalived+nginx高可用实现方法示例

    keepalived+nginx高可用实现方法示例

    这篇文章主要介绍了keepalived+nginx高可用实现方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • 解决国内k8s的ingress-nginx镜像无法正常pull拉取问题

    解决国内k8s的ingress-nginx镜像无法正常pull拉取问题

    本文主要介绍了解决国内k8s的ingress-nginx镜像无法正常pull拉取问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-03-03
  • Nginx配置参数中文说明详解(负载均衡与反向代理)

    Nginx配置参数中文说明详解(负载均衡与反向代理)

    最近在看高性能Linux服务器构建实战的Nginx章节,对其nginx介绍的非常详细,现把经常用到的Nginx配置参数中文说明摘录和nginx做负载均衡的本人真实演示实例抄录下来以便以后查看
    2020-03-03
  • 分析nginx日志并屏蔽采集者ip(nginx屏蔽ip配置实例)

    分析nginx日志并屏蔽采集者ip(nginx屏蔽ip配置实例)

    这篇文章主要介绍了分析nginx日志并屏蔽采集者ip(nginx屏蔽ip配置实例),本文先是讲解了分析需要屏蔽日志的方法,然后讲解了Nginx中屏蔽IP的配置方法,需要的朋友可以参考下
    2015-02-02
  • Nginx进程杀不完的解决方法

    Nginx进程杀不完的解决方法

    这篇文章主要给大家介绍了Nginx进程杀不完的解决方法,文中通过图文结合的方式给大家介绍的非常详细,对大家的学习或工作有一定的帮助,,需要的朋友可以参考下
    2023-12-12

最新评论