跳转至

sts: Nginx 流服务器流量状态模块

安装

您可以在任何基于 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-sts
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-sts

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

load_module modules/ngx_http_stream_server_traffic_status_module.so;

本文档描述了 nginx-module-sts v0.1.1,于 2018 年 7 月 4 日发布。


License

Nginx 流服务器流量状态模块

截图

nginx-module-sts 截图

概述

http {
    stream_server_traffic_status_zone;

    ...

    server {

        ...

        location /status {
            stream_server_traffic_status_display;
            stream_server_traffic_status_display_format html;
        }
    }
}

stream {
    server_traffic_status_zone;

    ...

    server {
        ...
    }
}

描述

这是一个 Nginx 模块,提供对流服务器流量状态信息的访问。 这是 nginx-module-vts 的移植版本,支持与 nginx-module-vts 相同的功能。 它包含当前状态,例如服务器、上游和用户定义的过滤器。

首先,流块中需要 server_traffic_status_zone 指令,HTTP 块中需要 stream_server_traffic_status_zone 指令,然后如果设置了 stream_server_traffic_status_display 指令,可以通过以下方式访问:

  • /status/format/json
  • 如果请求 /status/format/json,将响应一个包含当前活动数据的 JSON 文档,以用于实时仪表板和第三方监控工具。
  • /status/format/html
  • 如果请求 /status/format/html,将响应一个内置的 HTML 实时仪表板,该仪表板内部请求 /status/format/json
  • /status/format/jsonp
  • 如果请求 /status/format/jsonp,将响应一个包含当前活动数据的 JSONP 回调函数,以用于实时仪表板和第三方监控工具。
  • /status/format/prometheus
  • 如果请求 /status/format/prometheus,将响应一个包含当前活动数据的 prometheus 文档。
  • /status/control
  • 如果请求 /status/control,将响应一个 JSON 文档,在通过查询字符串重置或删除区域后。请参见 Control

JSON 文档包含如下内容:

{
    "hostName": ...,
    "nginxVersion": ...,
    "loadMsec": ...,
    "nowMsec": ...,
    "connections": {
        "active":...,
        "reading":...,
        "writing":...,
        "waiting":...,
        "accepted":...,
        "handled":...,
        "requests":...
    },
    "sharedZones": {
        "name":...,
        "maxSize":...,
        "usedSize":...,
        "usedNode":...
    },
    "streamServerZones": {
        "...":{
            "port":...,
            "protocol":...,
            "connectCounter":...,
            "inBytes":...,
            "outBytes":...,
            "responses":{
                "1xx":...,
                "2xx":...,
                "3xx":...,
                "4xx":...,
                "5xx":...,
            },
            "sessionMsecCounter":...,
            "sessionMsec":...,
            "sessionMsecs":{
                "times":[...],
                "msecs":[...]
            },
            "sessionBuckets":{
                "msecs":[...],
                "counters":[...]
            }
        }
        ...
    },
    "streamFilterZones": {
        "...":{
            "...":{

                "port":...,
                "protocol":...,
                "connectCounter":...,
                "inBytes":...,
                "outBytes":...,
                "responses":{
                    "1xx":...,
                    "2xx":...,
                    "3xx":...,
                    "4xx":...,
                    "5xx":...,
                },
                "sessionMsecCounter":...,
                "sessionMsec":...,
                "sessionMsecs":{
                    "times":[...],
                    "msecs":[...]
                },
                "sessionBuckets":{
                    "msecs":[...],
                    "counters":[...]
                }
            },
            ...
        },
        ...
    },
    "streamUpstreamZones": {
        "...":[
            {
                "server":...,
                "connectCounter":...,
                "inBytes":...,
                "outBytes":...,
                "responses":{
                    "1xx":...,
                    "2xx":...,
                    "3xx":...,
                    "4xx":...,
                    "5xx":...
                },
                "sessionMsecCounter":...,
                "sessionMsec":...,
                "sessionMsecs":{
                    "times":[...],
                    "msecs":[...]
                },
                "sessionBuckets":{
                    "msecs":[...]
                    "counters":[...]
                },
                "uSessionMsecCounter":...,
                "uSessionMsec":...,
                "uSessionMsecs":{
                    "times":[...],
                    "msecs":[...]
                },
                "uSessionBuckets":{
                    "msecs":[...]
                    "counters":[...]
                },
                "uConnectMsecCounter":...,
                "uConnectMsec":...,
                "uConnectMsecs":{
                    "times":[...],
                    "msecs":[...]
                },
                "uConnectBuckets":{
                    "msecs":[...]
                    "counters":[...]
                },
                "uFirstByteMsecCounter":...,
                "uFirstByteMsec":...,
                "uFirstByteMsecs":{
                    "times":[...],
                    "msecs":[...]
                },
                "uFirstByteBuckets":{
                    "msecs":[...]
                    "counters":[...]
                },
                "weight":...,
                "maxFails":...,
                "failTimeout":...,
                "backup":...,
                "down":...
            }
            ...
        ],
        ...
    }
}
  • main
  • 基本版本,正常运行时间((nowMsec - loadMsec)/1000)
  • nowMsec, loadMsec 是毫秒。
  • connections
  • 总连接数和请求数(与 NGINX 中的 stub_status_module 相同)
  • streamServerZones
  • 每个服务器区域的流量(进/出)和请求及响应计数和状态(1xx,2xx...)命中率
  • 总流量(进/出)和请求及响应计数(区域名称为 *)和命中率
  • streamFilterZones
  • 通过 server_traffic_status_filter_by_set_key 指令过滤的每个服务器区域的流量(进/出)和请求及响应计数和状态(1xx,2xx...)命中率
  • 通过 server_traffic_status_filter_by_set_key 指令过滤的总流量(进/出)和请求及响应计数(区域名称为 *)和命中率
  • streamUpstreamZones
  • 每个上游组中每个服务器的流量(进/出)和请求及响应计数
  • nginx.conf 中的当前设置(weight, maxfails, failtimeout...)

指令 stream_server_traffic_status_display_format 设置默认输出格式,可以是 json、jsonp、html、prometheus 之一。(默认:json)

流量计算如下:

  • streamServerZones
  • in += requested_bytes
  • out += sent_bytes
  • streamFilterZones
  • in += requested_bytes 通过过滤器
  • out += sent_bytes 通过过滤器
  • streamUpstreamZones
  • in += requested_bytes 通过 ServerZones
  • out += sent_bytes 通过 ServerZones

所有计算在 Nginx 的日志处理阶段进行。

注意事项: 此模块依赖于 nginx 日志系统(NGX_STREAM_LOG_PHASE:nginx 流的最后阶段),因此在某些情况下,流量可能与实际带宽流量不同。 Websocket、取消的下载可能导致不准确。 模块的工作与 access_log 指令的 "on" 或 "off" 无关。 再次强调,此模块在 "access_log off" 时也能正常工作。

控制

可以通过查询字符串重置或删除流量区域。 请求将响应一个 JSON 文档。

  • URI 语法
  • /{status_uri}/control?cmd={command}&group={group}&zone={name}
http {

    stream_server_traffic_status_zone;

    ...

    server {

        server_name example.org;

        ...


        location /status {
            stream_server_traffic_status_display;
            stream_server_traffic_status_display_format html;
        }
    }                                                                                                                                                                                           }
}

stream {
    geoip_country    /usr/share/GeoIP/GeoIP.dat;

    server_traffic_status_zone;

    server_traffic_status_filter_by_set_key $geoip_country_code country::*;

    server {

        ...

    }

    ...

}

如果按上述方式设置,则控制 URI 类似于 example.org/status/control

可用的请求参数如下: * cmd=\<status|reset|delete> * status * 返回流量区域的状态,格式为 json,类似于 status/format/json。 * reset * 重置流量区域而不删除共享内存中的节点。(= 初始化为 0) * delete * 删除共享内存中的流量区域。当重新请求时会重新创建。 * group=\<server|filter|upstream@alone|upstream@group|*> * server * filter * upstream@alone * upstream@group * * * zone=name * server * name * filter * filter_group@name * upstream@group * upstream_group@name * upstream@alone * @name

实时获取流量区域状态

这与 status/format/json 类似,只是可以获取每个区域。

获取所有区域

  • status/format/json 完全相同。
  • /status/control?cmd=status&group=*

获取组区域

  • streamServerZones
  • /status/control?cmd=status&group=server&zone=*
  • streamFilterZones
  • /status/control?cmd=status&group=filter&zone=*
  • streamUpstreamZones
  • /status/control?cmd=status&group=upstream@group&zone=*
  • streamUpstreamZones::nogroups
  • /status/control?cmd=status&group=upstream@alone&zone=*

获取每个区域

  • streamServerZones 中的单个区域
  • /status/control?cmd=status&group=server&zone=name
  • streamFilterZones 中的单个区域
  • /status/control?cmd=status&group=filter&zone=filter_group@name
  • streamUpstreamZones 中的单个区域
  • /status/control?cmd=status&group=upstream@group&zone=upstream_group@name
  • streamUpstreamZones::nogroups 中的单个区域
  • /status/control?cmd=status&group=upstream@alone&zone=name

实时重置流量区域

将指定区域的值重置为 0。

重置所有区域

  • /status/control?cmd=reset&group=*

重置组区域

  • streamServerZones
  • /status/control?cmd=reset&group=server&zone=*
  • streamFilterZones
  • /status/control?cmd=reset&group=filter&zone=*
  • streamUpstreamZones
  • /status/control?cmd=reset&group=upstream@group&zone=*
  • streamUpstreamZones::nogroups
  • /status/control?cmd=reset&group=upstream@alone&zone=*

重置每个区域

  • streamServerZones 中的单个区域
  • /status/control?cmd=reset&group=server&zone=name
  • streamFilterZones 中的单个区域
  • /status/control?cmd=reset&group=filter&zone=filter_group@name
  • streamUpstreamZones 中的单个区域
  • /status/control?cmd=reset&group=upstream@group&zone=upstream_group@name
  • streamUpstreamZones::nogroups 中的单个区域
  • /status/control?cmd=reset&group=upstream@alone&zone=name

实时删除流量区域

删除共享内存中的指定区域。

删除所有区域

  • /status/control?cmd=delete&group=*

删除组区域

  • streamServerZones
  • /status/control?cmd=delete&group=server&zone=*
  • streamFilterZones
  • /status/control?cmd=delete&group=filter&zone=*
  • streamUpstreamZones
  • /status/control?cmd=delete&group=upstream@group&zone=*
  • streamUpstreamZones::nogroups
  • /status/control?cmd=delete&group=upstream@alone&zone=*

删除每个区域

  • streamServerZones 中的单个区域
  • /status/control?cmd=delete&group=server&zone=name
  • streamFilterZones 中的单个区域
  • /status/control?cmd=delete&group=filter&zone=filter_group@name
  • streamUpstreamZones 中的单个区域
  • /status/control?cmd=delete&group=upstream@group&zone=upstream_group@name
  • streamUpstreamZones::nogroups 中的单个区域
  • /status/control?cmd=delete&group=upstream@alone&zone=name

JSON

以下状态信息以 JSON 格式提供:

状态使用的 Json

/{status_uri}/format/json

/{status_uri}/control?cmd=status&...

  • hostName
  • 主机名。
  • nginxVersion
  • 提供的版本。
  • loadMsec
  • 加载进程时间(以毫秒为单位)。
  • nowMsec
  • 当前时间(以毫秒为单位)。
  • connections
  • active
    • 当前活动客户端连接的数量。
  • reading
    • 正在读取的客户端连接总数。
  • writing
    • 正在写入的客户端连接总数。
  • waiting
    • 等待的客户端连接总数。
  • accepted
    • 已接受的客户端连接总数。
  • handled
    • 已处理的客户端连接总数。
  • requests
    • 请求的客户端连接总数。
  • sharedZones
  • name
    • 配置中指定的共享内存名称。(默认:stream_server_traffic_status
  • maxSize
    • 配置中指定的共享内存的最大大小限制。
  • usedSize
    • 当前共享内存的大小。
  • usedNode
    • 当前使用共享内存的节点数量。可以使用以下公式获取每个节点的近似大小:(usedSize / usedNode)
  • streamServerZones
  • connectCounter
    • 从客户端接收到的请求总数。
  • inBytes
    • 从客户端接收到的字节总数。
  • outBytes
    • 发送给客户端的字节总数。
  • responses
    • 1xx, 2xx, 3xx, 4xx, 5xx
    • 状态码为 1xx、2xx、3xx、4xx 和 5xx 的响应数量。
  • sessionMsecCounter
    • 累计请求处理时间(以毫秒为单位)。
  • sessionMsec
    • 请求处理时间的平均值(以毫秒为单位)。
  • sessionMsecs
    • times
    • 请求处理时间的毫秒数。
    • msecs
    • 请求处理时间(以毫秒为单位)。
  • sessionBuckets
    • msecs
    • server_traffic_status_histogram_buckets 指令设置的直方图的桶值。
    • counters
    • 每个桶值大于或等于请求处理时间的累计值。
  • streamFilterZones
  • 提供与 streamServerZones 相同的字段,只是包含了组名称。
  • streamUpstreamZones
  • server
    • 服务器的地址。
  • connectCounter
    • 转发到此服务器的客户端连接总数。
  • inBytes
    • 从此服务器接收到的字节总数。
  • outBytes
    • 发送到此服务器的字节总数。
  • responses
    • 1xx, 2xx, 3xx, 4xx, 5xx
    • 状态码为 1xx、2xx、3xx、4xx 和 5xx 的响应数量。
  • sessionMsecCounter
    • 包括上游的累计请求处理时间(以毫秒为单位)。
  • sessionMsec
    • 包括上游的请求处理时间的平均值(以毫秒为单位)。
  • sessionMsecs
    • times
    • 请求处理时间的毫秒数。
    • msecs
    • 包括上游的请求处理时间(以毫秒为单位)。
  • sessionBuckets
    • msecs
    • server_traffic_status_histogram_buckets 指令设置的直方图的桶值。
    • counters
    • 每个桶值大于或等于连接到上游服务器的时间的累计值。
  • uSessionMsecCounter
    • 累计连接到上游服务器的会话持续时间(以毫秒为单位)。
  • uSessionMsec
    • 连接到上游服务器的会话持续时间的平均值(以毫秒为单位)。
  • uSessionMsecs
    • times
    • 请求处理时间的毫秒数。
    • msecs
    • 连接到上游服务器的会话持续时间(以毫秒为单位)。
  • uSessionBuckets
    • msecs
    • server_traffic_status_histogram_buckets 指令设置的直方图的桶值。
    • counters
    • 每个桶值大于或等于连接到上游服务器的会话持续时间的累计值。
  • uConnectMsecCounter
    • 累计连接到上游服务器的时间(以毫秒为单位)。
  • uConnectMsec
    • 连接到上游服务器的时间的平均值(以毫秒为单位)(1.11.4)。
  • uConnectMsecs
    • times
    • 请求处理时间的毫秒数。
    • msecs
    • 连接到上游服务器的时间(以毫秒为单位)。
  • uConnectBuckets
    • msecs
    • server_traffic_status_histogram_buckets 指令设置的直方图的桶值。
    • counters
    • 每个桶值大于或等于连接到上游服务器的时间的累计值。
  • uFirstByteMsecCounter
    • 累计接收第一字节数据的时间(以毫秒为单位)。
  • uFirstByteMsec
    • 接收第一字节数据的时间的平均值(以毫秒为单位)(1.11.4)。
  • uFirstByteMsecs
    • times
    • 请求处理时间的毫秒数。
    • msecs
    • 接收第一字节数据的时间(以毫秒为单位)(1.11.4)。
  • uFirstByteBuckets
    • msecs
    • server_traffic_status_histogram_buckets 指令设置的直方图的桶值。
    • counters
    • 每个桶值大于或等于接收第一字节数据的时间的累计值。
  • weight
    • 服务器的当前 weight 设置。
  • maxFails
    • 服务器的当前 max_fails 设置。
  • failTimeout
    • 服务器的当前 fail_timeout 设置。
  • backup
    • 服务器的当前 backup 设置。
  • down
    • 服务器的当前 down 设置。

控制使用的 Json

/{status_uri}/control?cmd=reset&...

/{status_uri}/control?cmd=delete&...

  • processingReturn
  • 结果为真或假。
  • processingCommandString
  • 请求的命令字符串。
  • processingGroupString
  • 请求的组字符串。
  • processingZoneString
  • 请求的区域字符串。
  • processingCounts
  • 实际处理的数量。

变量

stream 块中提供以下嵌入变量:

  • $sts_connect_counter
  • 从客户端接收到的请求总数。
  • $sts_in_bytes
  • 从客户端接收到的字节总数。
  • $sts_out_bytes
  • 发送给客户端的字节总数。
  • $sts_1xx_counter
  • 状态码为 1xx 的响应数量。
  • $sts_2xx_counter
  • 状态码为 2xx 的响应数量。
  • $sts_3xx_counter
  • 状态码为 3xx 的响应数量。
  • $sts_4xx_counter
  • 状态码为 4xx 的响应数量。
  • $sts_5xx_counter
  • 状态码为 5xx 的响应数量。
  • $sts_session_time
  • 请求处理时间的平均值。

限制

可以使用指令 server_traffic_status_limit_traffic 限制每个服务器的总流量。 还可以使用指令 server_traffic_status_limit_traffic_by_set_key 限制所有流量。 当超过限制时,服务器将返回 503(服务暂时不可用)错误作为请求的响应。 返回代码是可变的。

限制服务器流量

stream {

    server_traffic_status_zone;

    ...

    server {

        listen 1981;

        server_traffic_status_limit_traffic in:64G;
        server_traffic_status_limit_traffic out:1024G;

        ...
    }
}
  • 1981/tcp 上的进/出总流量限制为 64G 和 1024G。

限制过滤器流量

stream {
    geoip_country /usr/share/GeoIP/GeoIP.dat;

    server_traffic_status_zone;

    ...

    server {

        listen 1981;

        server_traffic_status_filter_by_set_key $geoip_country_code country::$server_addr;
        server_traffic_status_limit_traffic_by_set_key FG@country::$server_addr@US out:1024G;
        server_traffic_status_limit_traffic_by_set_key FG@country::$server_addr@CN out:2048G;

        ...

    }
}
  • 将进入美国和中国的总流量限制为 1024G 和 2048G。

限制上游流量

stream {

    server_traffic_status_zone;

    ...

    upstream backend {
        server 10.10.10.17:80;
        server 10.10.10.18:80;
    }

    server {

        listen 1981;

        server_traffic_status_limit_traffic_by_set_key UG@backend@10.10.10.17:80 in:512G;
        server_traffic_status_limit_traffic_by_set_key UG@backend@10.10.10.18:80 in:1024G;
        proxy_pass backend;

        ...

    }
}
  • 将进入上游后端的总流量限制为 512G 和 1024G。

注意事项: 流量是累积传输或计数,而不是带宽。

用例

可以使用指令 server_traffic_status_filter_by_set_key 计算用户定义的个体统计信息。

使用 GeoIP 计算单个国家的流量

stream {
    geoip_country /usr/share/GeoIP/GeoIP.dat;

    server_traffic_status_zone;
    server_traffic_status_filter_by_set_key $geoip_country_code country::*;

    ...

    server {

        ...

        server_traffic_status_filter_by_set_key $geoip_country_code country::$server_addr:$server_port;

    }
}
  • 计算所有服务器组的单个国家的流量。
  • 计算每个服务器组的单个国家的流量。

基本上,国家旗帜图像内置于 HTML 中。 如果在 server_traffic_status_filter_by_set_key 指令的第二个参数中包含 country 字符串,则启用国家旗帜图像。

自定义

模块安装后进行自定义

  1. 您需要在 status.template.html 中将 {{uri}} 字符串更改为您的状态 URI,如下所示:

    shell> vi share/status.template.html
    
    var vtsStatusURI = "yourStatusUri/format/json", vtsUpdateInterval = 1000;
    

  2. 然后,自定义并将 status.template.html 复制到服务器根目录,如下所示:

    shell> cp share/status.template.html /usr/share/nginx/html/status.html
    

  3. 配置 nginx.conf

       server {
           server_name example.org;
           root /usr/share/nginx/html;
    
           # 将对 / 的请求重定向到 /status.html
           location = / {
               return 301 /status.html;
           }
    
           location = /status.html {}
    
           # 所有以 /status 开头的请求(除了 /status.html)都由状态处理程序处理
           location /status {
               stream_server_traffic_status_display;
               stream_server_traffic_status_display_format json;
           }
       }
    

  4. 访问您的 HTML

    http://example.org/status.html
    

模块安装前进行自定义

  1. 修改 share/status.template.html(不要更改 {{uri}} 字符串)

  2. 重新创建 ngx_http_stream_server_traffic_status_module_html.h,如下所示:

    shell> cd util
    shell> ./tplToDefine.sh ../share/status.template.html > ../src/ngx_http_stream_server_traffic_status_module_html.h
    

  3. 通过添加以下内容将模块添加到构建配置中

    --add-module=/path/to/nginx-module-sts
    --add-module=/path/to/nginx-module-stream-sts
    

  4. 构建 nginx 二进制文件。

  5. 安装 nginx 二进制文件。

指令

stream_server_traffic_status

- -
语法 stream_server_traffic_status \<on|off>
默认 off
上下文 http, server, location

描述: 启用或禁用模块的工作。 如果设置了 stream_server_traffic_status_zone 指令,则会自动启用。

stream_server_traffic_status_zone

- -
语法 stream_server_traffic_status_zone [shared:name]
默认 shared:stream_server_traffic_status
上下文 http

描述: 设置由 server_traffic_status_zone 指令在流块中指定的共享内存区域的参数。 注意事项: name 必须与 server_traffic_status_zone 指定的名称相同。

stream_server_traffic_status_display

- -
语法 stream_server_traffic_status_display
默认 -
上下文 http, server, location

描述: 启用或禁用模块显示处理程序。

stream_server_traffic_status_display_format

- -
语法 stream_server_traffic_status_display_format \<json|html|jsonp|prometheus>
默认 json
上下文 http, server, location

描述: 设置显示处理程序的输出格式。 如果设置为 json,将响应一个 JSON 文档。 如果设置为 html,将响应内置的 HTML 实时仪表板。 如果设置为 jsonp,将响应一个 JSONP 回调函数(默认:ngx_http_stream_server_traffic_status_jsonp_callback)。 如果设置为 prometheus,将响应一个 prometheus 文档。

stream_server_traffic_status_display_jsonp

- -
语法 stream_server_traffic_status_display_jsonp callback
默认 ngx_http_stream_server_traffic_status_jsonp_callback
上下文 http, server, location

描述: 设置 JSONP 的回调名称。

stream_server_traffic_status_average_method

- -
语法 stream_server_traffic_status_average_method \<AMM|WMA> [period]
默认 AMM 60s
上下文 http, server, location

描述: 设置计算响应处理时间平均值的公式方法。 period 是用于平均计算的值的有效时间。(默认:60s) 如果将 period 设置为 0,则忽略有效时间。 在这种情况下,即使没有请求,经过一段时间后也会显示最后的平均值。 相应的值为 JSON 中的 sessionMsecuSessionMsecuConnectMsecuFirstByteMsec

server_traffic_status

- -
语法 server_traffic_status \<on|off>
默认 off
上下文 stream, server

描述: 启用或禁用模块的工作。 如果设置了 server_traffic_status_zone 指令,则会自动启用。

server_traffic_status_zone

- -
语法 server_traffic_status_zone [shared:name:size]
默认 shared:stream_server_traffic_status:1m
上下文 stream

描述: 设置将为各种键保留状态的共享内存区域的参数。 缓存在所有工作进程之间共享。

server_traffic_status_filter

- -
语法 server_traffic_status_filter \<on|off>
默认 on
上下文 stream, server

描述: 启用或禁用过滤器功能。

server_traffic_status_filter_by_set_key

- -
语法 server_traffic_status_filter_by_set_key key [name]
默认 -
上下文 stream, server

描述: 启用用户定义变量的键。 key 是用于计算流量的键字符串。 name 是用于计算流量的组字符串。 keyname 可以包含变量,例如 $host、$server_addr、$server_port。 如果指定,则 name 的组属于 streamFilterZones。 如果未指定第二个参数 name,则 key 的组属于 streamServerZones。 使用 geoip 模块的示例如下:

stream {

      ...

      server {
          listen 1981;
          server_traffic_status_filter_by_set_key $geoip_country_code country::$server_addr:$server_port;

          ...

      }
}
  ...
  "streamServerZones": {
  ...
  },
  "streamFilterZones": {
      "country::example.org": {
          "KR": {
              "port":...,
              "protocol":...,
              "connectCounter":...,
              "inBytes":...,
              "outBytes":...,
              "responses":{
                  "1xx":...,
                  "2xx":...,
                  "3xx":...,
                  "4xx":...,
                  "5xx":...,
              },
              "sessionMsec":...
              "sessionMsecs":{
                  "times":[...],
                  "msecs":[...]
              },
            },
          },
          "US": {
          ...
          },
          ...
      },
      ...
  },
  ...

server_traffic_status_filter_check_duplicate

- -
语法 server_traffic_status_filter_check_duplicate \<on|off>
默认 on
上下文 stream, server

描述: 启用或禁用 server_traffic_status_filter_by_set_key 的去重。 如果启用此选项,则在每个指令(流、服务器)中仅处理一个重复值(key + name)。

server_traffic_status_limit

- -
语法 server_traffic_status_limit \<on|off>
默认 on
上下文 stream, server

描述: 启用或禁用限制功能。

server_traffic_status_limit_traffic

- -
语法 server_traffic_status_limit_traffic member:size [code]
默认 -
上下文 stream, server

描述: 启用指定 member 的流量限制。 member 是用于限制流量的成员字符串。 size 是限制流量的大小(k/m/g)。 code 是对被拒绝请求的响应代码。(默认:503)

可用的 member 字符串如下: * connect * 从客户端接收到的客户端连接总数。 * in * 从客户端接收到的字节总数。 * out * 发送给客户端的字节总数。 * 1xx * 状态码为 1xx 的响应数量。 * 2xx * 状态码为 2xx 的响应数量。 * 3xx * 状态码为 3xx 的响应数量。 * 4xx * 状态码为 4xx 的响应数量。 * 5xx * 状态码为 5xx 的响应数量。

server_traffic_status_limit_traffic_by_set_key

- -
语法 server_traffic_status_limit_traffic_by_set_key key member:size [code]
默认 -
上下文 stream, server

描述: 启用指定 keymember 的流量限制。 key 是用于限制流量的键字符串。 member 是用于限制流量的成员字符串。 size 是限制流量的大小(k/m/g)。 code 是对被拒绝请求的响应代码。(默认:503)

key 语法如下: * group@[subgroup@]name

可用的 group 字符串如下: * NO * 服务器组。 * UA * 单独的上游组。 * UG * 上游组。(使用 subgroup) * FG * 过滤器组。(使用 subgroup

可用的 member 字符串如下: * connect * 从客户端接收到的请求总数。 * in * 从客户端接收到的字节总数。 * out * 发送给客户端的字节总数。 * 1xx * 状态码为 1xx 的响应数量。 * 2xx * 状态码为 2xx 的响应数量。 * 3xx * 状态码为 3xx 的响应数量。 * 4xx * 状态码为 4xx 的响应数量。 * 5xx * 状态码为 5xx 的响应数量。

memberserver_traffic_status_limit_traffic 指令相同。

server_traffic_status_limit_check_duplicate

- -
语法 server_traffic_status_limit_check_duplicate \<on|off>
默认 on
上下文 stream, server

描述: 启用或禁用 server_traffic_status_limit_by_set_key 的去重。 如果启用此选项,则在每个指令(流、服务器)中仅处理一个重复值(member | key + member)。

server_traffic_status_average_method

- -
语法 server_traffic_status_average_method \<AMM|WMA> [period]
默认 AMM 60s
上下文 stream, server

描述: 设置计算响应处理时间平均值的公式方法。 period 是用于平均计算的值的有效时间。(默认:60s) 如果将 period 设置为 0,则忽略有效时间。 在这种情况下,即使没有请求,经过一段时间后也会显示最后的平均值。 相应的值仅为 $sts_session_time 变量。

注意事项: $sts_session_time 变量是在最后请求时计算的值。 在使用变量时不会计算。

server_traffic_status_histogram_buckets

- -
语法 server_traffic_status_histogram_buckets second ...
默认 -
上下文 stream

描述: 设置用于直方图的观察桶。 默认情况下,如果不设置此指令,则将不起作用。 second 可以用小数表示,最小值为 0.001(1ms)。 桶的最大大小为 32。如果这个值对您来说不够,请更改 NGX_STREAM_SERVER_TRAFFIC_STATUS_DEFAULT_BUCKET_LENnginx-mdule-stream-sts/src/ngx_stream_server_traffic_status_node.hNGX_HTTP_STREAM_SERVER_TRAFFIC_STATUS_DEFAULT_BUCKET_LENnginx-module-sts/src/ngx_http_stream_server_traffic_status_node.h

例如: * server_traffic_status_histogram_buckets 0.005 0.01 0.05 0.1 0.5 1 5 10 * 观察桶为 [5ms 10ms 50ms 1s 5s 10s]。 * server_traffic_status_histogram_buckets 0.005 0.01 0.05 0.1 * 观察桶为 [5ms 10ms 50ms 1s]。

注意事项: 默认情况下,如果不设置此指令,直方图统计将不起作用。

另请参阅

GitHub

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