跳转至

vts: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-vts
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-vts

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

load_module modules/ngx_http_vhost_traffic_status_module.so;

本文档描述的是 nginx-module-vts v0.2.7,发布于 2026 年 8 月 8 日。


CI License

Nginx 虚拟主机流量状态模块

测试

安装此模块后,运行 sudo prove -r t。需要 sudo 是因为测试要求 Nginx 监听 80 端口。

截图

screenshot-vts-0

screenshot-vts-1

概要

http {
    vhost_traffic_status_zone;

    ...

    server {

        ...

        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
    }
}

描述

这是一个 Nginx 模块,提供对虚拟主机状态信息的访问。 它包含当前状态,如服务器(servers)、上游(upstreams)、缓存(caches)。 这类似于 nginx plus 的实时活动监控。 内置的 html 也取自旧版本的演示页面。

首先,指令 vhost_traffic_status_zone 是必需的, 然后如果设置了指令 vhost_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 文档。参见 控制

JSON 文档包含以下内容:

{
    "hostName": ...,
    "moduleVersion": ...,
    "nginxVersion": ...,
    "loadMsec": ...,
    "nowMsec": ...,
    "connections": {
        "active":...,
        "reading":...,
        "writing":...,
        "waiting":...,
        "accepted":...,
        "handled":...,
        "requests":...
    },
    "sharedZones": {
        "name":...,
        "maxSize":...,
        "usedSize":...,
        "usedNode":...,
        "freeSize":...
    },
    "serverZones": {
        "...":{
            "requestCounter":...,
            "inBytes":...,
            "outBytes":...,
            "responses":{
                "1xx":...,
                "2xx":...,
                "3xx":...,
                "4xx":...,
                "5xx":...,
                "miss":...,
                "bypass":...,
                "expired":...,
                "stale":...,
                "updating":...,
                "revalidated":...,
                "hit":...,
                "scarce":...
            },
            "requestMsecCounter":...,
            "requestMsec":...,
            "requestMsecs":{
                "times":[...],
                "msecs":[...]
            },
            "requestBuckets":{
                "msecs":[...],
                "counters":[...]
            },
        }
        ...
    },
    "filterZones": {
        "...":{
            "...":{
                "requestCounter":...,
                "inBytes":...,
                "outBytes":...,
                "responses":{
                    "1xx":...,
                    "2xx":...,
                    "3xx":...,
                    "4xx":...,
                    "5xx":...,
                    "miss":...,
                    "bypass":...,
                    "expired":...,
                    "stale":...,
                    "updating":...,
                    "revalidated":...,
                    "hit":...,
                    "scarce":...
                },
                "requestMsecCounter":...,
                "requestMsec":...,
                "requestMsecs":{
                    "times":[...],
                    "msecs":[...]
                },
                "requestBuckets":{
                    "msecs":[...],
                    "counters":[...]
                },
            },
            ...
        },
        ...
    },
    "upstreamZones": {
        "...":[
            {
                "server":...,
                "requestCounter":...,
                "inBytes":...,
                "outBytes":...,
                "responses":{
                    "1xx":...,
                    "2xx":...,
                    "3xx":...,
                    "4xx":...,
                    "5xx":...
                },
                "requestMsecCounter":...,
                "requestMsec":...,
                "requestMsecs":{
                    "times":[...],
                    "msecs":[...]
                },
                "requestBuckets":{
                    "msecs":[...],
                    "counters":[...]
                },
                "responseMsecCounter":...,
                "responseMsec":...,
                "responseMsecs":{
                    "times":[...],
                    "msecs":[...]
                },
                "responseBuckets":{
                    "msecs":[...],
                    "counters":[...]
                },
                "weight":...,
                "maxFails":...,
                "failTimeout":...,
                "backup":...,
                "down":...
            }
            ...
        ],
        ...
    }
    "cacheZones": {
        "...":{
            "maxSize":...,
            "usedSize":...,
            "inBytes":...,
            "outBytes":...,
            "responses":{
                "miss":...,
                "bypass":...,
                "expired":...,
                "stale":...,
                "updating":...,
                "revalidated":...,
                "hit":...,
                "scarce":...
            }
        },
        ...
    }
}
  • main
  • 基本版本、运行时间((nowMsec - loadMsec)/1000)
  • nowMsec、loadMsec 的单位是毫秒。
  • connections
  • 总连接数和请求数(与 NGINX 中的 stub_status_module 相同)
  • sharedZones
  • nginx-module-vts 使用的共享内存信息。
  • serverZones
  • 每个服务器区域的流量(入/出)、请求和响应计数以及缓存命中率
  • 总流量(入/出)、请求和响应计数(区域名为 *)以及命中率
  • filterZones
  • 通过 vhost_traffic_status_filter_by_set_key 指令过滤后的每个服务器区域的流量(入/出)、请求和响应计数以及缓存命中率
  • 通过 vhost_traffic_status_filter_by_set_key 指令过滤后的总流量(入/出)、请求和响应计数(区域名为 *)以及命中率
  • upstreamZones
  • 每个上游组中每个服务器的流量(入/出)、请求和响应计数
  • nginx.conf 中的当前设置(weight、maxfails、failtimeout...)
  • cacheZones
  • 使用 proxy_cache 指令时,每个缓存区域的流量(入/出)、大小(容量/已用)以及命中率。

JSON 文档中的 overCounts 对象主要用于 32 位系统,如果其值溢出,将增加 1。 指令 vhost_traffic_status_display_format 设置默认输出格式,可以是 json、jsonp、html、prometheus 之一。(默认:json)

流量计算如下:

  • ServerZones
  • in += 请求的字节数
  • out += 发送的字节数
  • FilterZones
  • in += 通过过滤器请求的字节数
  • out += 通过过滤器发送的字节数
  • UpstreamZones
  • in += 通过 ServerZones 请求的字节数
  • out += 通过 ServerZones 发送的字节数
  • cacheZones
  • in += 通过 ServerZones 请求的字节数
  • out += 通过 ServerZones 发送的字节数

所有计算都在 Nginx 的日志处理阶段进行。 内部重定向(X-Accel-Redirect 或 error_page)不计入 UpstreamZones。

注意: 此模块依赖于 nginx 日志系统(NGX_HTTP_LOG_PHASE:nginx http 的最后一个阶段),因此流量在某些情况下可能与实际带宽流量不同。 Websocket、取消的下载可能导致不准确。 无论 access_log 指令是“on”还是“off”,模块的工作都不受影响。 同样,此模块在“access_log off”时也能正常工作。 当使用多个域名时,它设置为 server_name 指令的第一个域名(左侧)。 如果您不希望这样,请参见 vhost_traffic_status_filter_by_hostvhost_traffic_status_filter_by_set_key 指令。

有关 stream 流量统计,请参见以下模块: * nginx-module-sts * nginx-module-stream-sts

计算和间隔

平均值

所有平均值目前都计算为最近 64 个值的 AMM(算术平均值)。

控制

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

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

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

    vhost_traffic_status_zone;
    vhost_traffic_status_filter_by_set_key $geoip_country_code country::*;

    ...

    server {

        server_name example.org;

        ...

        vhost_traffic_status_filter_by_set_key $geoip_country_code country::$server_name;

        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
    }
}

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

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

动态获取流量区域状态

这类似于 status/format/json,不同之处在于它可以获取各个区域。

获取全部区域

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

获取组区域

  • mainZones
  • /status/control?cmd=status&group=server&zone=::main
  • serverZones
  • /status/control?cmd=status&group=server&zone=*
  • filterZones
  • /status/control?cmd=status&group=filter&zone=*
  • upstreamZones
  • /status/control?cmd=status&group=upstream@group&zone=*
  • upstreamZones::nogroups
  • /status/control?cmd=status&group=upstream@alone&zone=*
  • cacheZones
  • /status/control?cmd=status&group=cache&zone=*

mainZones 值是默认状态值,包括 hostNamemoduleVersionnginxVersionloadMsecnowMsecconnections

获取各个区域

  • serverZones 中的单个区域
  • /status/control?cmd=status&group=server&zone=name
  • filterZones 中的单个区域
  • /status/control?cmd=status&group=filter&zone=filter_group@name
  • upstreamZones 中的单个区域
  • /status/control?cmd=status&group=upstream@group&zone=upstream_group@name
  • upstreamZones::nogroups 中的单个区域
  • /status/control?cmd=status&group=upstream@alone&zone=name
  • cacheZones 中的单个区域
  • /status/control?cmd=status&group=cache&zone=name

动态重置流量区域

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

重置全部区域

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

重置组区域

  • serverZones
  • /status/control?cmd=reset&group=server&zone=*
  • filterZones
  • /status/control?cmd=reset&group=filter&zone=*
  • upstreamZones
  • /status/control?cmd=reset&group=upstream@group&zone=*
  • upstreamZones::nogroups
  • /status/control?cmd=reset&group=upstream@alone&zone=*
  • cacheZones
  • /status/control?cmd=reset&group=cache&zone=*

重置各个区域

  • serverZones 中的单个区域
  • /status/control?cmd=reset&group=server&zone=name
  • filterZones 中的单个区域
  • /status/control?cmd=reset&group=filter&zone=filter_group@name
  • upstreamZones 中的单个区域
  • /status/control?cmd=reset&group=upstream@group&zone=upstream_group@name
  • upstreamZones::nogroups 中的单个区域
  • /status/control?cmd=reset&group=upstream@alone&zone=name
  • cacheZones 中的单个区域
  • /status/control?cmd=reset&group=cache&zone=name

动态删除流量区域

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

删除全部区域

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

删除组区域

  • serverZones
  • /status/control?cmd=delete&group=server&zone=*
  • filterZones
  • /status/control?cmd=delete&group=filter&zone=*
  • upstreamZones
  • /status/control?cmd=delete&group=upstream@group&zone=*
  • upstreamZones::nogroups
  • /status/control?cmd=delete&group=upstream@alone&zone=*
  • cacheZones
  • /status/control?cmd=delete&group=cache&zone=*

删除各个区域

  • serverZones 中的单个区域
  • /status/control?cmd=delete&group=server&zone=name
  • filterZones 中的单个区域
  • /status/control?cmd=delete&group=filter&zone=filter_group@name
  • upstreamZones 中的单个区域
  • /status/control?cmd=delete&group=upstream@group&zone=upstream_group@name
  • upstreamZones::nogroups 中的单个区域
  • /status/control?cmd=delete&group=upstream@alone&zone=name
  • cacheZones 中的单个区域
  • /status/control?cmd=delete&group=cache&zone=name

设置

可以使用 vhost_traffic_status_set_by_filter 指令在 nginx 配置中单独获取状态值。 它可以获取几乎所有状态值,获取的值存储在第一个参数的用户自定义变量中。

  • 指令语法
  • vhost_traffic_status_set_by_filter $variable group/zone/name
http {

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

    vhost_traffic_status_zone;
    vhost_traffic_status_filter_by_set_key $geoip_country_code country::*;

    ...
    upstream backend {
        10.10.10.11:80;
        10.10.10.12:80;
    }

    server {

        server_name example.org;

        ...

        vhost_traffic_status_filter_by_set_key $geoip_country_code country::$server_name;

        vhost_traffic_status_set_by_filter $requestCounter server/example.org/requestCounter;
        vhost_traffic_status_set_by_filter $requestCounterKR filter/country::example.org@KR/requestCounter;

        location /backend {
            vhost_traffic_status_set_by_filter $requestCounterB1 upstream@group/[email protected]:80/requestCounter;
            proxy_pass http://backend;
        }
    }
}

上述设置如下:

  • $requestCounter
  • serverZones -> example.org -> requestCounter
  • $requestCounterKR
  • filterZones -> country::example.org -> KR -> requestCounter
  • $requestCounterB1
  • upstreamZones -> backend -> 10.0.10.11:80 -> requestCounter

详细用法请参见 vhost_traffic_status_set_by_filter 指令。

JSON

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

状态使用的 Json

/{status_uri}/format/json

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

  • hostName
  • 主机名。
  • moduleVersion
  • 模块版本,格式为 {version}(|.dev.{commit})
  • nginxVersion
  • 提供的版本。
  • loadMsec
  • 进程加载时间(毫秒)。
  • nowMsec
  • 当前时间(毫秒)
  • connections
  • active
    • 当前活跃的客户端连接数。
  • reading
    • 正在读取的客户端连接总数。
  • writing
    • 正在写入的客户端连接总数。
  • waiting
    • 等待中的客户端连接总数。
  • accepted
    • 已接受的客户端连接总数。
  • handled
    • 已处理的客户端连接总数。
  • requests
    • 请求的客户端连接总数。
  • sharedZones
  • name
    • 配置中指定的共享内存名称。(默认:vhost_traffic_status
  • maxSize
    • 配置中指定的共享内存最大大小限制。
  • usedSize
    • 共享内存的当前大小。
  • usedNode
    • 共享内存中当前使用的节点数。可以使用以下公式估算单个节点的近似大小:(usedSize / usedNode)
  • freeSize
    • 共享内存为更多节点剩余的空间。上面的 usedSize 是节点大小的总和,并不是区域已消耗的空间,因为 slab 分配器为每个节点分配整个页面或整个槽位。因此,当 usedSize 仍低于 maxSize 时,区域可能已停止接受节点,而这个值正是说明这一点的。一个节点大于半页,因此当页面为 4k 时,这是容纳更多节点的空间;当页面更大时,这是一个下限,因为部分使用的页面仍然可以容纳一个节点。
  • serverZones
  • requestCounter
    • 从客户端接收的客户端请求总数。
  • inBytes
    • 从客户端接收的字节总数。
  • outBytes
    • 发送给客户端的字节总数。
  • responses
    • 1xx、2xx、3xx、4xx、5xx
    • 状态码为 1xx、2xx、3xx、4xx 和 5xx 的响应数量。
    • miss
    • 缓存未命中的数量。
    • bypass
    • 缓存绕过的数量。
    • expired
    • 缓存过期的数量。
    • stale
    • 缓存陈旧的数量。
    • updating
    • 缓存更新的数量。
    • revalidated
    • 缓存重新验证的数量。
    • hit
    • 缓存命中的数量。
    • scarce
    • 缓存稀缺的数量。
  • requestMsecCounter
    • 累计请求处理时间(毫秒)的数量。
  • requestMsec
    • 请求处理时间的平均值(毫秒)。
  • requestMsecs
    • times
    • 请求处理时间的时间点(毫秒)。
    • msecs
    • 请求处理时间(毫秒)。
  • requestBuckets
    • msecs
    • vhost_traffic_status_histogram_buckets 指令设置的直方图桶值。
    • counters
    • 累计值,因为每个桶值大于或等于请求处理时间。
  • filterZones
  • 提供与 serverZones 相同的字段,不同之处在于它包含组名。
  • upstreamZones
  • server
    • 服务器的地址。
  • requestCounter
    • 转发到此服务器的客户端连接总数。
  • inBytes
    • 从此服务器接收的字节总数。
  • outBytes
    • 发送到此服务器的字节总数。
  • responses
    • 1xx、2xx、3xx、4xx、5xx
    • 状态码为 1xx、2xx、3xx、4xx 和 5xx 的响应数量。
  • requestMsecCounter
    • 包括上游在内的累计请求处理时间(毫秒)的数量。
  • requestMsec
    • 包括上游在内的请求处理时间的平均值(毫秒)。
  • requestMsecs
    • times
    • 请求处理时间的时间点(毫秒)。
    • msecs
    • 包括上游在内的请求处理时间(毫秒)。
  • requestBuckets
    • msecs
    • vhost_traffic_status_histogram_buckets 指令设置的直方图桶值。
    • counters
    • 累计值,因为每个桶值大于或等于包括上游在内的请求处理时间。
  • responseMsecCounter
    • 仅上游响应处理时间的累计数量(毫秒)。
  • responseMsec
    • 仅上游响应处理时间的平均值(毫秒)。
  • responseMsecs
    • times
    • 请求处理时间的时间点(毫秒)。
    • msecs
    • 仅上游响应处理时间(毫秒)。
  • responseBuckets
    • msecs
    • vhost_traffic_status_histogram_buckets 指令设置的直方图桶值。
    • counters
    • 累计值,因为每个桶值大于或等于仅上游响应处理时间。
  • weight
    • 服务器的当前 weight 设置。
  • maxFails
    • 服务器的当前 max_fails 设置。
  • failTimeout
    • 服务器的当前 fail_timeout 设置。
  • backup
    • 服务器的当前 backup 设置。
  • down
    • 服务器的当前 down 设置。基本上,这只是 ngx_http_upstream_module 服务器 down 的标记(例如 server backend3.example.com down),并非实际的上游服务器状态。如果您启用了 upstream zone 指令,它将变为实际状态。
  • cacheZones
  • maxSize
    • 配置中指定的缓存最大大小限制。如果 proxy_cache_path 指令中未指定 max_size,则默认分配系统相关的值 NGX_MAX_OFF_T_VALUE。换句话说,此值来自 nginx,而不是我指定的。
  • usedSize
    • 缓存的当前大小。此值取自 nginx,类似于上面的 maxSize 值。
  • inBytes
    • 从缓存接收的字节总数。
  • outBytes
    • 从缓存发送的字节总数。
  • responses
    • miss
    • 缓存未命中的数量。
    • bypass
    • 缓存绕过的数量。
    • expired
    • 缓存过期的数量。
    • stale
    • 缓存陈旧的数量。
    • updating
    • 缓存更新的数量。
    • revalidated
    • 缓存重新验证的数量。
    • hit
    • 缓存命中的数量。
    • scarce
    • 缓存稀缺的数量。

控制使用的 Json

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

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

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

变量

提供以下嵌入变量:

  • $vts_request_counter
  • 从客户端接收的客户端请求总数。
  • $vts_in_bytes
  • 从客户端接收的字节总数。
  • $vts_out_bytes
  • 发送给客户端的字节总数。
  • $vts_1xx_counter
  • 状态码为 1xx 的响应数量。
  • $vts_2xx_counter
  • 状态码为 2xx 的响应数量。
  • $vts_3xx_counter
  • 状态码为 3xx 的响应数量。
  • $vts_4xx_counter
  • 状态码为 4xx 的响应数量。
  • $vts_5xx_counter
  • 状态码为 5xx 的响应数量。
  • $vts_cache_miss_counter
  • 缓存未命中的数量。
  • $vts_cache_bypass_counter
  • 缓存绕过的数量。
  • $vts_cache_expired_counter
  • 缓存过期的数量。
  • $vts_cache_stale_counter
  • 缓存陈旧的数量。
  • $vts_cache_updating_counter
  • 缓存更新的数量。
  • $vts_cache_revalidated_counter
  • 缓存重新验证的数量。
  • $vts_cache_hit_counter
  • 缓存命中的数量。
  • $vts_cache_scarce_counter
  • 缓存稀缺的数量。
  • $vts_request_time_counter
  • 累计请求处理时间的数量。
  • $vts_request_time
  • 请求处理时间的平均值。

限制

可以使用指令 vhost_traffic_status_limit_traffic 限制每个主机的总流量。 也可以使用指令 vhost_traffic_status_limit_traffic_by_set_key 限制所有流量。 当超过限制时,服务器将返回 503(服务暂时不可用)错误以响应请求。 返回代码可以更改。

限制服务器流量

http {

    vhost_traffic_status_zone;

    ...

    server {

        server_name *.example.org;

        vhost_traffic_status_limit_traffic in:64G;
        vhost_traffic_status_limit_traffic out:1024G;

        ...
    }
}
  • *.example.org 的入/出总流量分别限制为 64G 和 1024G。 如果启用了 vhost_traffic_status_filter_by_host 指令,它将分别对每个域名生效。

限制过滤器流量

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

    vhost_traffic_status_zone;

    ...

    server {

        server_name example.org;

        vhost_traffic_status_filter_by_set_key $geoip_country_code country::$server_name;
        vhost_traffic_status_limit_traffic_by_set_key FG@country::$server_name@US out:1024G;
        vhost_traffic_status_limit_traffic_by_set_key FG@country::$server_name@CN out:2048G;

        ...

    }
}
  • example.org 上进入 US 和 CN 的总流量分别限制为 1024G 和 2048G。

限制上游流量

http {

    vhost_traffic_status_zone;

    ...

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

    server {

        server_name example.org;

        location /backend {
            vhost_traffic_status_limit_traffic_by_set_key UG@[email protected]:80 in:512G;
            vhost_traffic_status_limit_traffic_by_set_key UG@[email protected]:80 in:1024G;
            proxy_pass http://backend;
        }

        ...

    }
}
  • example.org 上进入上游 backend 的总流量分别限制为每个对等点 512G 和 1024G。

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

使用案例

可以使用指令 vhost_traffic_status_filter_by_set_key 计算用户定义的单独统计信息。

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

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

    vhost_traffic_status_zone;
    vhost_traffic_status_filter_by_set_key $geoip_country_code country::*;

    ...

    server {

        ...

        vhost_traffic_status_filter_by_set_key $geoip_country_code country::$server_name;

        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
    }
}
  • 计算总服务器组中各个国家的流量。
  • 计算每个服务器组中各个国家的流量。

基本上,HTML 中内置了国家旗帜图片。 如果 vhost_traffic_status_filter_by_set_key 指令的第二个参数(组名)中包含 country 字符串,则启用国家旗帜图片。

计算各个存储卷的流量

http {
    vhost_traffic_status_zone;

    ...

    server {

        ...

        location ~ ^/storage/(.+)/.*$ {
            set $volume $1;
            vhost_traffic_status_filter_by_set_key $volume storage::$server_name;
        }

        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
    }
}
  • 计算由 location 指令的正则表达式匹配的各个存储卷的流量。

计算各个用户代理的流量

http {
    vhost_traffic_status_zone;

    map $http_user_agent $filter_user_agent {
        default 'unknown';
        ~iPhone ios;
        ~Android android;
        ~(MSIE|Mozilla) windows;
    }

    vhost_traffic_status_filter_by_set_key $filter_user_agent agent::*;

    ...

    server {

        ...

        vhost_traffic_status_filter_by_set_key $filter_user_agent agent::$server_name;

        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
    }
}
  • 计算各个 http_user_agent 的流量

计算详细 http 状态码的流量

http {
    vhost_traffic_status_zone;

    server {

        ...

        vhost_traffic_status_filter_by_set_key $status $server_name;

        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
    }
}
  • 计算详细 http 状态码 的流量

注意: $status 变量在 nginx-(1.3.2、1.2.2) 中可用。

计算动态 DNS 的流量

如果域名有多个 DNS A 记录,您可以使用过滤器功能或 proxy_pass 中的变量计算该域名的各个 IP 的流量。

http {
    vhost_traffic_status_zone;

    upstream backend {
        elb.example.org:80;
    }

    ...

    server {

        ...

        location /backend {
            vhost_traffic_status_filter_by_set_key $upstream_addr upstream::backend;
            proxy_pass backend;
        }
    }
}
  • 计算域名 elb.example.org 的各个 IP 的流量。 如果 elb.example.org 有多个 DNS A 记录,将在 filterZones 中显示所有 IP。 在上述设置中,当 NGINX 启动或重新加载配置时, 它会查询 DNS 服务器以解析域名,并将 DNS A 记录缓存在内存中。 因此,即使 DNS 管理员更改了 DNS A 记录,内存中的 DNS A 记录也不会更改, 除非 NGINX 重新启动或重新加载。
http {
    vhost_traffic_status_zone;

    resolver 10.10.10.53 valid=10s

    ...

    server {

        ...

        location /backend {
            set $backend_server elb.example.org;
            proxy_pass http://$backend_server;
        }
    }
}
  • 计算域名 `elb