跳转至

[BETA!] log-zmq: NGINX 的 ZeroMQ 日志模块

安装

您可以在任何基于 RHEL 的发行版中安装此模块,包括但不限于:

  • RedHat Enterprise Linux 7、8、9 和 10
  • CentOS 7、8、9
  • AlmaLinux 8、9
  • Rocky Linux 8、9
  • Amazon Linux 2 和 Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-log-zmq
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-log-zmq

通过在 /etc/nginx/nginx.conf 的顶部添加以下内容来启用该模块:

load_module modules/ngx_http_log_zmq_module.so;

本文档描述了 nginx-module-log-zmq v0,于 2021 年 11 月 28 日发布。

生产稳定性不保证


NGINX 的 ZeroMQ 日志模块。

ZeroMQ,\zero-em-queue\,是一种消息交换协议。它是一种使用任何语言或平台通过 inproc、IPC、TCP、TPIC 或多播进行通信的简单方式。它是异步的,只需要一个小型库。

描述

这是一个与 ZeroMQ 库集成的 NGINX 日志模块。

nginx-log-zmq 提供了一种非常高效的方式来记录一个或多个 PUB/SUB 订阅者的数据,通过一个或多个不同的端点。这对于数据收集和处理非常有用。

消息格式可以与传统日志格式相同,这为通过网络 tail 数据或探索其他文本格式(如 JSON)提供了有趣的方式。与传统日志一样,可以使用在每个请求中更新的 NGINX 变量。

所有消息都是异步发送的,不会阻塞 NGINX 服务器的正常行为。正如预期的那样,连接对网络故障具有弹性。

概述

    http {
        # 发送简单消息到 IPC 端点,使用 4 个线程和 1000 个队列元素

        log_zmq_server main "/tmp/main.ipc" ipc 4 1000;
        log_zmq_endpoint  main "/topic/";

        log_zmq_format main '{"remote_addr":"$remote_addr"}'

        # 发送消息到监听在 127.0.0.1:5556 的订阅者

        log_zmq_server secondary 127.0.0.1:5556 tcp 4 1000;

        # 设置次要端点
        log_zmq_endpoint secondary "/endpoint/";

        # 使用多行设置格式
        log_zmq_format secondary '{"request_uri":"$request_uri",'
                                   '{"status":"$status"}';


        server {

            location /status {
                # 对于此位置静音来自 log_zmq 的所有消息

                log_zmq_off all;
            }

            location /endpoint {
                # 对于此位置静音来自 log_zmq 的主要消息

                log_zmq_off main;
            }
        }
    }

指令

log_zmq_server

语法: log_zmq_server <definition_name> <address> <ipc|tcp> <threads> <queue size>

默认值: no

上下文: http

配置要连接的服务器(PUB/SUB 订阅者)。

以下选项是必需的:

definition_name <name> - NGINX 用于标识此日志实例的名称。

address <path>|<ipaddress>:<port> - 订阅者的地址。如果您使用 IPC 协议,则应指定 unix 套接字的 <path>。如果您使用 TCP 协议,则应指定您的 ZeroMQ 订阅者正在监听的 <ipaddress><port>

protocol <ipc|tcp> - 用于通信的协议。

threads <integer> - 要使用的 I/O 线程数。

queue_size <integer> - 等待发送的消息的最大队列大小。

log_zmq_endpoint

语法: log_zmq_endpoint <definition_name> "<topic>"

默认值: no

上下文: http

配置 ZeroMQ 消息的主题。

definition_name <name> - NGINX 用于标识此日志实例的名称。

topic <topic> - 消息的主题。这是一个字符串(可以是 NGINX 变量),在每条发送的消息前加上。举例来说,如果您将消息 "hello" 发送到 "/talk:" 主题,则消息将变为 "/talk:hello"。

示例:

http {
    log_zmq_server main "/tmp/example.ipc" 4 1000;

    # 根据响应状态发送消息到主题
    log_zmq_endpoint main "/remote/$status";
}

log_zmq_format

语法: log_zmq_format <definition_name> "<format>"

默认值: no

上下文: http

配置 ZeroMQ 消息格式。

definition_name <name> - NGINX 用于标识此日志实例的名称。

format <format> - 消息的格式。这定义了发送到 PUB/SUB 订阅者的实际消息。它遵循与标准 log_format 指令相同的规则。可以在这里使用 NGINX 变量,并且也可以将其分成多行。

http {
    log_zmq_format main '{"line1": value,'
                          '{"line2": value}';
}

log_zmq_off

语法: log_zmq_off <definition_name>|all

默认值: no

上下文: location

在当前上下文中关闭 ZeroMQ 日志。

definition_name <name> - 要静音的日志实例的名称。如果使用特殊的 all 名称,则所有日志实例都将被静音。

GitHub

您可以在 nginx-module-log-zmq 的 GitHub 仓库 中找到有关此模块的其他配置提示和文档。