Files
nginx-ipng-stats-plugin/debian/changelog
Pim van Pelt 7ed77f5b22 Strip socket options on cross-cscf repeat listens (v0.7.2)
Make the shared-listen-include pattern work with `reuseport` and the
other socket-level listen options. Nginx core enforces at-most-once
per sockaddr on options that set lsopt.set=1 (reuseport, bind,
backlog=, rcvbuf=, sndbuf=, setfib=, fastopen=, accept_filter=,
deferred, ipv6only=, so_keepalive=) and emits "duplicate listen
options for <addr>" otherwise. That rule collides with a single
listens.conf included from every vhost — each vhost's include
re-submits the same options.

The listen wrapper now detects the cross-cscf case, strips those
options from cf->args before delegating to the core handler, and
logs one notice per stripped listen. The first cscf owns the
options on the kernel socket; later cscfs merge cleanly via
ngx_http_add_server. Protocol-level flags (ssl, http2, quic,
proxy_protocol) pass through untouched since nginx OR-merges those
across cscfs.

This unblocks `reuseport` for deployments that want better
new-connection spread across workers.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 16:23:58 +02:00

107 lines
4.6 KiB
Plaintext

nginx-ipng-stats-plugin (0.7.2-1) unstable; urgency=medium
* Pre-release v0.7.2.
- Listen wrapper now strips socket-level options (reuseport,
bind, backlog=, rcvbuf=, sndbuf=, setfib=, fastopen=,
accept_filter=, deferred, ipv6only=, so_keepalive=) from
cf->args when a sockaddr recurs under a different server
block. Previously this pattern — typical with a shared
`include listens.conf;` across vhosts — tripped nginx's
"duplicate listen options for <addr>" check because those
options are one-shot per kernel socket. The first cscf now
owns the options on the shared kernel socket and later
cscfs merge cleanly via ngx_http_add_server. A NOTICE is
logged each time socket options are stripped. This makes
`reuseport` usable with the shared-include deployment
pattern from docs/user-guide.md, which helps worker
load-balancing on busy hosts.
-- Pim van Pelt <pim@ipng.ch> Sun, 19 Apr 2026 16:30:00 +0200
nginx-ipng-stats-plugin (0.7.1-1) unstable; urgency=medium
* Pre-release v0.7.1.
- Listen wrapper now deduplicates on (server block, sockaddr)
across both plain and device-tagged listens. A plain
`listen 80;` and `listen 80 device=eth0 ...;` in the same
server block now coexist, matching the runtime reality under
the IP_PKTINFO attribution model (all same-sockaddr listens
collapse to one wildcard kernel socket). Docs updated to
drop the "must be device-tagged" restriction.
-- Pim van Pelt <pim@ipng.ch> Sun, 19 Apr 2026 10:00:00 +0200
nginx-ipng-stats-plugin (0.7.0-1) unstable; urgency=medium
* Pre-release v0.7.0.
- New ipng_stats_rescan_interval directive (default 60s, 0 to
disable). Per-worker timer that re-resolves every device= →
ifindex mapping, self-healing attribution after interface
teardown/recreate without requiring nginx -s reload.
- New nginx_ipng_ifindex_misses_total counter: connections whose
ingress ifindex didn't match any configured binding. Surfaces
stale mappings and genuinely-unconfigured interfaces.
- Expose the existing nginx_ipng_zone_full_events_total and
nginx_ipng_flushes_total meta counters in both the Prometheus
and JSON scrape outputs. JSON gains a top-level "meta" object
alongside "records" (schema unchanged, additive).
-- Pim van Pelt <pim@ipng.ch> Sat, 18 Apr 2026 19:36:36 +0200
nginx-ipng-stats-plugin (0.6.0-1) unstable; urgency=medium
* Pre-release v0.6.0.
-- Pim van Pelt <pim@ipng.ch> Sat, 18 Apr 2026 15:30:40 +0200
nginx-ipng-stats-plugin (0.5.0-1) unstable; urgency=medium
* Pre-release v0.5.0.
-- Pim van Pelt <pim@ipng.ch> Sat, 18 Apr 2026 14:38:25 +0200
nginx-ipng-stats-plugin (0.4.0-1) unstable; urgency=medium
* Pre-release v0.4.0.
-- Pim van Pelt <pim@ipng.ch> Sat, 18 Apr 2026 13:15:15 +0200
nginx-ipng-stats-plugin (0.3.0-1) unstable; urgency=medium
* Pre-release v0.3.0.
-- Pim van Pelt <pim@ipng.ch> Sat, 18 Apr 2026 11:47:26 +0200
nginx-ipng-stats-plugin (0.2.0-1) unstable; urgency=medium
* Reduce scrape cardinality.
- Status codes are collapsed to six class lanes
(1xx/2xx/3xx/4xx/5xx/unknown) on the counter key. Per-(source, vip)
counter cardinality is now bounded at six regardless of response mix.
- Histograms drop the code label entirely and aggregate across classes
per (source, vip).
- New nginx_ipng_latency_total counter (with code class label) exposes
per-class mean latency via latency_total / requests_total.
- New nginx_ipng_bytes_in and nginx_ipng_bytes_out histograms; bucket
bounds configurable via the new ipng_stats_byte_buckets directive.
- JSON schema bumped to 2. Records are now per-(source, vip) with an
inner `classes` map.
- Operators needing per-three-digit-code breakdowns should consume
ipng_stats_logtail off-host; the stats zone intentionally trades
that resolution for a smaller, bounded scrape.
-- Pim van Pelt <pim@ipng.ch> Fri, 17 Apr 2026 12:36:57 +0000
nginx-ipng-stats-plugin (0.1.0-1) unstable; urgency=medium
* Initial release.
- ngx_http_ipng_stats_module: per-VIP, per-device HTTP traffic
counters, attributed via SO_BINDTODEVICE on per-interface
listening sockets, exposed as Prometheus text and JSON from a
single scrape endpoint.
- Debian package libnginx-mod-http-ipng-stats builds against the
target release's nginx-dev headers with --with-compat and loads
into stock upstream nginx without recompiling nginx itself.
-- Pim van Pelt <pim@ipng.ch> Thu, 16 Apr 2026 00:00:00 +0000