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

目录
  • 前言
  • 实现思路
  • 实现步骤
    • 1. 编译 Nginx
    • 2. 配置文件如下
  • 总结

前言

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日志实时上报内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Nginx日志统计分析的常用命令总结

    本文主要给大家总结了关于Nginx日志统计分析的一些常用命令,分享出来供大家参考学习,下面来一起看看详细的介绍: 一.IP相关统计 统计IP访问量 awk '{print $1}' access.log | sort -n | uniq | wc -l 查看某一时间段的IP访问量(4-5点) grep "07/Apr/2017:0[4-5]" access.log | awk '{print $1}' | sort | uniq -c| sort -nr | wc -l 查看访问最频繁

  • Nginx实现浏览器可实时查看访问日志的步骤详解

    一.首先查看nginx版本,我使用的是1.9.7的版本,安装目录在/application/nginx-1.9.7 [root@AnSheng ~]# /application/nginx-1.9.7/sbin/nginx -V nginx version: nginx/1.9.7 built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) configure arguments: --prefix=/application/nginx-1.9.7

  • nginx日志配置指令详解

    日志对于统计排错来说非常有利的.本文总结了nginx日志相关的配置如access_log.log_format.open_log_file_cache.log_not_found.log_subrequest.rewrite_log.error_log. nginx有一个非常灵活的日志记录模式.每个级别的配置可以有各自独立的访问日志.日志格式通过log_format命令来定义.ngx_http_log_module是用来定义请求日志格式的. 1. access_log指令 语法: access_

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

    目录 前言 实现思路 实现步骤 1. 编译 Nginx 2. 配置文件如下 总结 前言 Nginx 作为常用的负载均衡网关. 会产生大量的日志. 但是由于 Nginx 的配置文件是一种声明式的编程范式, 不方便描述流程控制, 因此不能通过简单的指令实现日志的上报. 通常 Nginx 的日志上报是需要写一个shell脚本或其他语言的脚本来定时解析 Nginx 的 log 文件, 然后进行上报. 利用 NJS 模块, 可以实现实时的日志上报. 但是由于 NJS 模块支持的指令的限制, 无法通过单一指

  • 添加Nginx代理配置只允许内部IP访问的实现方法

    location / { index index.jsp; proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; deny 192.168.1.1;

  • 聊聊配置 Nginx 访问与错误日志的问题

    目录 配置Nginx访问日志 配置错误日志 日志文件的位置 读取和理解Nginx日志文件 Nginx是一个开放源代码的高性能HTTP和反向代理服务器,负责处理Internet上某些最大站点的负载.在管理NGINX网络服务器时,你要执行的最常见任务之一就是检查日志文件. 在对服务器或应用程序问题进行故障排除时,知道如何配置和读取日志非常有用,因为它们提供了详细的调试信息. Nginx用两种类型的日志记录其事件:访问日志和错误日志.访问日志记录有关客户端请求的信息,错误日志记录有关服务器和应用程序问

  • 详解Nginx日志配置及日志切割

    日志配置 日志对于统计排错来说非常有利的.本文总结了nginx日志相关的配置如access_log.log_format.open_log_file_cache.log_not_found.log_subrequest.rewrite_log.error_log. nginx有一个非常灵活的日志记录模式.每个级别的配置可以有各自独立的访问日志.日志格式通过log_format命令来定义. ngx_http_log_module是用来定义请求日志格式的. 1. access_log指令 语法: a

  • PHP7+Nginx的配置与安装教程详解

    下面我们小编把PHP7+Nginx的配置与安装教程分享给大家,供大家参考,本文写的不好还请见谅. 系统环境:centos6.5 x64 软件版本:nginx-1.10.0 php-7.0.6 安装 Nginx Nginx官网:http://nginx.org/ 先安装编译依赖的一些组件 复制代码 代码如下: yum install pcre pcre-devel openssl openssl-devel -y 1.解压程序包 复制代码 代码如下: tar xf nginx-1.10.0.tar

  • Nginx 日志改成 JSON 格式的方法

    Nginx 日志默认为普通文本的格式,例如,下面是 Nginx 的一行访问日志: 10.88.122.105 - - [02/Dec/2017:09:15:04 +0800] "GET /js/pagination.js HTTP/1.1" 304 0 "http://10.88.105.20:8063/stockrecommand.html" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW6

  • Nginx状态监控以及日志分析详解

    1.Nginx状态监控 Nginx提供了一个内置的状态信息监控页面可用于监控Nginx的整体访问情况,这个功能由ngx_http_stub_status_module模块进行实现. 使用nginx -V 2>&1 | grep -o with-http_stub_status_module命令检测当前Nginx是否有status功能,如果输出ngx_http_stub_status_module则说明是有的,如果没有可以在编译时加上此模块. 默认情况下,status是关闭的,我们需要开启,并

  • springboot项目配置logback日志系统的实现

    记录springboot项目配置logback日志文件管理: logback依赖jar包 SpringBoot项目配置logback理论上需要添加logback-classic依赖jar包: <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> <

  • windows下快速安装nginx并配置开机自启动的方法

      nginx已经是我们日常开发中在常用不过的工具了,简单快捷的安装和配置,大大减少了我们部署调试浪费的时间,本文给各位同学介绍一下nginx正常安装流程,以及开机自启动配置,记得提前收藏,莫要书到用时方恨少~   废话少说,上车! 一.windows系统下Nginx安装启动流程: 这是我们在正常环境中,Windows下Nginx的安装及启动方式 1.到nginx官网下载相应版本(http://nginx.org/en/download.html),我这里放到了D:\work\nginx\路径下

  • Nginx可视化配置工具NginxWebUI的使用

    目录 NginxWebUI介绍 NginxWebUI功能说明 NginxWebUI安装 1.jar包运行方式 2.docker安装说明 NginxWebUI使用演示 介绍一款好用的网页版开源工具,同样它的功能也是Nginx配置生成器,功能非常强大,方便实用,它是:NginxWebUI. NginxWebUI介绍 NginxWebUI是一款方便实用的nginx 网页配置工具,可以使用 WebUI 配置 Nginx 的各项功能,包括端口转发,反向代理,ssl 证书配置,负载均衡等,最终生成「ngin

随机推荐