With zgix config.json running (see first config), four checks confirm every leg is alive.

1. The TCP leg

curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:80/

Route a request at the api host to exercise the route table:

curl -s -H 'Host: api.example.com' http://127.0.0.1:80/healthz

2. The L4 leg

Any TLS client pointed at the SNI listener should behave exactly as if the backend were contacted directly — zgix relays the handshake byte for byte:

psql 'host=db.example.com port=443 sslmode=require' -c 'select 1'

3. The HTTP/3 leg

Point an HTTP/3-capable client at the UDP port directly. With a curl built for HTTP/3:

curl --http3-only -kv https://127.0.0.1:4443/

or use the bundled interop client, a minimal aioquic client pinned to an IPv4 socket — aioquic’s default dual-stack IPv6 path can look exactly like a server-side hang on some hosts:

pip install aioquic
python3 scripts/h3-interop-client.py 4443
# -> STATUS 200 / BODY ...

Until clients trust the Alt-Svc hint you may also choose to advertise the UDP port from an http listener; see HTTP/3.

4. The admin scrape

curl -s 127.0.0.1:9100/metrics | grep -E '^zgix_(info|h3_)'

You should see the inventory row and the h3 verdict counters:

zgix_info{version="0.9.0"} 1
zgix_h3_requests 2
zgix_h3_responses 2

The scrape ends with a # zgix_access_log marker and the newest 128 access lines as # <json> comments — the control panel parses exactly that section for its logs view.

5. The access log

With "access_log": { "sink": "stdout" }, one JSON object lands per exchange:

{"time":"2026-10-20T09:14:22.481Z","kind":"http","outcome":"ok","client":"10.1.2.3:52344","method":"GET","host":"api.example.com","path":"/v1/items","status":200,"upstream_reused":true,"upstream_replayed":false,"duration_us":1873,"bytes_in":142,"bytes_out":4096,"cluster":"api","upstream":"10.0.0.7:8080"}

Every request lands in exactly one verdict bucket — the simulator asserts the identities between log lines, counters and histogram counts on every seed — so zgix_l7_responses plus the shed counters always reconcile with the lines you see.

Last updated:

Built with zdoc