Angie Web Server: The Complete Guide — Review, ACME, Migration, API and HTTP/3

In 2021, a group of engineers left F5 Networks — the company that had acquired NGINX Inc. in 2019. These weren’t peripheral contributors. They were the original NGINX core team: the people who wrote the event loop, designed the memory allocator, built the module system. They left because F5’s roadmap for NGINX was, diplomatically, not their vision. They forked the codebase and called it Angie.

That origin story matters. Angie isn’t a community fork with sporadic commits. It’s the continuation of NGINX development by the people who invented it, without corporate constraints. The result is a web server that is 100% backward-compatible with NGINX — every config file, every directive, every module works unchanged — but with features that F5 was either charging for (NGINX Plus) or not building at all.

This guide covers everything about Angie in one place: what it is, what it adds, how it performs, how to migrate from NGINX, how to set up native ACME certificates, how to use the monitoring API, and how to decide whether it’s right for you. The myguard APT repository ships Angie for Debian and Ubuntu with all 50+ dynamic modules pre-built.

What Angie adds over NGINX — the full list

These are the capabilities Angie has that stock NGINX mainline does not:

1. Native ACME client (Let’s Encrypt without Certbot)

This is the headline feature and the one that earns Angie the most converts. Angie has a full RFC 8555 ACME client built directly into the server. You declare certificates in angie.conf, Angie fetches them on first start, and renews them automatically before expiry. No Certbot. No cron jobs. No renewal hooks. No 2am emergency when a certificate silently expires.

http {
    acme_client letsencrypt https://acme-v02.api.letsencrypt.org/directory
        email admin@example.com;

    server {
        listen 443 ssl;
        http2 on;
        server_name example.com www.example.com;

        acme letsencrypt;
        ssl_certificate      $acme_cert_letsencrypt;
        ssl_certificate_key  $acme_cert_key_letsencrypt;
    }
}

Reload Angie and the certificate is issued within seconds. Zero-downtime renewal happens automatically when fewer than 30 days remain. Multiple CAs are supported simultaneously — Let’s Encrypt and ZeroSSL in parallel, private internal CAs, staging environments.

2. JSON status API with Prometheus endpoint

NGINX’s built-in stub_status module returns five lines of plain text. Angie’s status API returns structured JSON with detailed per-server, per-upstream, and per-connection metrics. Add it to any server block:

location /status {
    api /status/;
    allow 127.0.0.1;
    deny all;
}

location /metrics {
    api /metrics/prometheus;
    allow 127.0.0.1;
    deny all;
}

The /metrics/prometheus endpoint returns Prometheus-format metrics — no third-party exporter needed. Plug it straight into your Grafana dashboard. The JSON API includes: active connections, requests/sec per server, upstream server health, SSL certificate expiry dates, response time percentiles, and bytes transferred.

3. Dynamic upstream management (NGINX Plus feature, free in Angie)

NGINX requires a full reload to add or remove upstream servers. NGINX Plus offers dynamic upstreams via its paid API. Angie offers this for free via its status API:

# Add an upstream server without reloading
curl -X POST http://127.0.0.1/status/upstreams/backend/servers 
  -H 'Content-Type: application/json' 
  -d '{"server": "192.168.1.100:8080"}'

This is enormous for Kubernetes and container deployments where backend IPs change constantly. No reload means no brief traffic interruption during scaling events.

4. Monthly release cadence

NGINX mainline releases every three to four months. Angie releases roughly monthly. Security fixes ship faster. New features accumulate faster. The gap compounds over time.

5. Extended upstream health checks

Angie’s active health checks are more configurable than NGINX’s — check HTTP status codes, match response body patterns, set custom failure thresholds — all without a commercial licence. NGINX Pro/Plus features, available free.

6. HTTP/3 and QUIC

Same as the myguard NGINX build — full HTTP/3 support via openssl-nginx with QUIC patches. The configuration is identical to NGINX’s HTTP/3 setup.

Performance: Angie vs NGINX

The honest answer: essentially identical. Angie and NGINX share the same core architecture — event-driven, asynchronous, single-threaded workers managing thousands of connections each. The performance comes from the design, not from either project’s additions on top of it.

MetricNGINX 1.29 (myguard)Angie 1.11 (myguard)
Static file req/sec (500 conc.)~95,000~93,000
Latency (avg)5.2ms5.4ms
RSS memory (4 workers)~12MB~12MB
TLS handshakes/sec~8,200~8,100

Tested with wrk on 4 vCPU/8GB, 1KB static file, both compiled with the same optimization flags via the myguard build system. Differences are within noise margin.

For PHP and proxy workloads the comparison is the same — the bottleneck is PHP-FPM or the upstream app, not the web server. Pick based on features, not benchmarks.

Who should use Angie

Start with Angie if you’re setting up a new server

For fresh deployments in 2026, Angie is the better default. Native ACME removes Certbot as a dependency. The JSON API means you get monitoring without installing a separate exporter. The monthly release cycle means security patches arrive faster. There’s no reason to start with NGINX and then add the complexity of Certbot when Angie handles it natively.

Migrate from NGINX if you value simplicity

If you’re currently running Certbot renewal timers, a stub_status scraper, and three shell scripts to manage certificate hooks — Angie replaces all of that with directives in angie.conf. The migration is five minutes and your config works unchanged.

Stay on NGINX if you need these specific things

  • You use a module that hasn’t been ported to Angie yet (check the Angie modules page — most are available)
  • You have a specific vendor integration that hard-requires NGINX (rare but exists in enterprise)
  • Your organisation mandates specific software and hasn’t approved Angie yet

In all other cases, Angie is a strict improvement on NGINX for new deployments.

Installation

wget https://deb.myguard.nl/pool/myguard.deb
dpkg -i myguard.deb
apt-get update
apt-get install angie

Supported distributions: Debian 12 (Bookworm), Debian 13 (Trixie), Ubuntu 22.04 (Jammy), Ubuntu 24.04 (Noble), Ubuntu 26.04 (Resolute). Both amd64 and arm64.

All 50+ dynamic modules are available as angie-module-* packages and load with load_module in angie.conf:

apt-get install angie-module-http-brotli angie-module-http-modsecurity angie-module-http-geoip2

Migrating from NGINX to Angie

This is the easiest server migration you will ever do. Your config files work without changes. Your modules have 1:1 equivalents. Your sites stay online throughout.

Step 1 — Back up your config

tar -czf /tmp/nginx-backup-$(date +%Y%m%d).tar.gz /etc/nginx/
nginx -V 2>&1 | grep -o 'modules/[^ ]*.so'   # note which modules you use

Step 2 — Add the myguard repository and install Angie

wget https://deb.myguard.nl/pool/myguard.deb
dpkg -i myguard.deb
apt-get update
apt-get install angie

Angie installs alongside NGINX without removing it. They coexist as packages — they just can’t both listen on ports 80 and 443 at the same time.

Step 3 — Test your config with Angie

angie -t
# Angie reads /etc/nginx/ by default
# "syntax is ok" means you're ready to switch

Step 4 — Switch over

systemctl stop nginx
systemctl start angie
systemctl status angie

Step 5 — Verify your sites

curl -I https://yourdomain.com
tail -f /var/log/angie/error.log

Step 6 — Make it permanent

systemctl disable nginx
systemctl enable angie

Rollback (if needed)

systemctl stop angie
systemctl start nginx
# NGINX config is untouched, sites are back online

Module package name mapping

NGINX module packageAngie module package
libnginx-mod-http-brotliangie-module-http-brotli
libnginx-mod-http-modsecurityangie-module-http-modsecurity
libnginx-mod-http-luaangie-module-http-lua
libnginx-mod-http-headers-moreangie-module-http-headers-more
libnginx-mod-http-geoip2angie-module-http-geoip2
libnginx-mod-http-njsangie-module-http-njs
libnginx-mod-http-zstdangie-module-http-zstd

ACME / Let’s Encrypt: full configuration guide

Basic single domain

http {
    acme_client letsencrypt https://acme-v02.api.letsencrypt.org/directory
        email admin@example.com;

    # HTTP → HTTPS redirect
    server {
        listen 80;
        server_name example.com www.example.com;
        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl;
        listen 443 quic reuseport;  # HTTP/3
        http2 on;
        http3 on;
        server_name example.com www.example.com;

        acme letsencrypt;
        ssl_certificate      $acme_cert_letsencrypt;
        ssl_certificate_key  $acme_cert_key_letsencrypt;

        ssl_protocols       TLSv1.2 TLSv1.3;
        ssl_session_cache   shared:SSL:10m;
        ssl_session_timeout 1d;
        ssl_session_tickets off;

        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
        add_header Alt-Svc 'h3=":443"; ma=86400';
    }
}

Multiple certificate authorities

acme_client letsencrypt https://acme-v02.api.letsencrypt.org/directory;
acme_client zerossl    https://acme.zerossl.com/v2/DV90;

server {
    acme letsencrypt;
    acme zerossl;
    ssl_certificate      $acme_cert_letsencrypt;
    ssl_certificate_key  $acme_cert_key_letsencrypt;
}

Private / internal CA

acme_client internal https://ca.internal/acme/directory;
# Works with Step CA, HashiCorp Vault PKI, EJBCA, Smallstep

Staging for testing (avoids rate limits)

acme_client staging https://acme-staging-v02.api.letsencrypt.org/directory;

Custom certificate storage path

acme_client letsencrypt https://acme-v02.api.letsencrypt.org/directory
    email admin@example.com
    path /etc/angie/ssl/acme;

How ACME renewal works

Let’s Encrypt certificates expire after 90 days. Angie starts renewal when fewer than 30 days remain, giving a 60-day buffer. Renewal uses a graceful reload — active connections finish with the old certificate, new connections use the new one. Zero downtime, zero cron jobs.

ACME uses HTTP-01 challenges — port 80 must be reachable from the internet. Wildcard certificates (*.example.com) require DNS-01 challenges which Angie’s built-in ACME doesn’t support; use Certbot with a DNS plugin for those specific cases.

Migrating from Certbot to Angie ACME

# 1. Add acme_client and acme directives to your config
# 2. Change ssl_certificate paths to $acme_cert_* variables
# 3. Test: angie -t
# 4. Reload: systemctl reload angie (fetches certificate immediately)
# 5. Confirm: openssl s_client -connect example.com:443 2>/dev/null | grep -A1 'Certificate chain'
# 6. Remove certbot: apt-get remove certbot
#    (delete any renewal timers and hooks)

Monitoring: JSON API and Prometheus

Angie’s status API is a REST endpoint that returns real-time server metrics. It’s available for both JSON consumption and Prometheus scraping — no extra software needed.

Enable the API

server {
    listen 127.0.0.1:8080;

    location /status {
        api /status/;
    }

    location /metrics {
        api /metrics/prometheus;
    }
}

Query it

# Full JSON status
curl -s http://127.0.0.1:8080/status | python3 -m json.tool

# Prometheus metrics for Grafana/Prometheus scraping
curl -s http://127.0.0.1:8080/metrics

# Just connection counts
curl -s http://127.0.0.1:8080/status/connections

# Upstream health
curl -s http://127.0.0.1:8080/status/upstreams

# Certificate expiry
curl -s http://127.0.0.1:8080/status/ssl

Dynamic upstream management via API

# Add an upstream server (no reload required)
curl -X POST http://127.0.0.1:8080/status/upstreams/backend/servers 
  -H 'Content-Type: application/json' 
  -d '{"server": "192.168.1.100:8080", "weight": 1}'

# Remove a server
curl -X DELETE http://127.0.0.1:8080/status/upstreams/backend/servers/0

# Drain a server before removal (set to 'draining')
curl -X PATCH http://127.0.0.1:8080/status/upstreams/backend/servers/0 
  -H 'Content-Type: application/json' 
  -d '{"drain": true}'

Grafana dashboard

Point a Prometheus scrape config at http://127.0.0.1:8080/metrics. The metrics follow standard naming conventions and work with existing NGINX Prometheus dashboards (Grafana dashboard ID 12708 and similar).

HTTP/3 and QUIC with Angie

Angie’s HTTP/3 configuration is identical to NGINX’s. Both use the same openssl-nginx QUIC build. Add QUIC alongside your existing HTTPS listener:

server {
    listen 443 ssl;
    listen 443 quic reuseport;   # HTTP/3
    http2 on;
    http3 on;
    quic_retry on;

    ssl_protocols TLSv1.3;       # HTTP/3 requires TLS 1.3
    ssl_early_data on;

    add_header Alt-Svc 'h3=":443"; ma=86400';
    # ... rest of your server block
}

Open UDP 443 in your firewall (ufw allow 443/udp or the iptables/nftables equivalent) — QUIC runs on UDP. HTTP/3 falls back gracefully to HTTP/2 for clients that don’t support it. See the full HTTP/3 setup guide for verification steps and troubleshooting.

Angie vs NGINX Plus

NGINX Plus is NGINX’s commercial version, priced at ~$3,000/year per server. It adds the features that Angie provides for free:

FeatureNGINX (free)NGINX Plus ($3k/yr)Angie (free)
Native ACME/Let’s Encrypt
JSON status API
Prometheus metrics endpoint
Dynamic upstream API
Active upstream health checksBasicAdvancedAdvanced
HTTP/3 + QUIC
Commercial support

For most organisations, Angie delivers the operational features of NGINX Plus without the licence fee.

Frequently asked questions

Is Angie a drop-in replacement for NGINX?
Yes. Angie reads your /etc/nginx/ config directory unchanged. Every NGINX directive works. The service is named angie instead of nginx, but the config syntax, module loading, and file locations are identical. You can switch back to NGINX in two commands if anything doesn’t work.
Who maintains Angie? Is it trustworthy?
Angie is maintained by Webserver LLC, founded by the original NGINX core development team after leaving F5 in 2021. These are the engineers who wrote NGINX’s event loop, memory allocator, and module system. The project is active, has monthly releases, and is open-source under the BSD licence.
Does Angie ACME support wildcard certificates?
No. Wildcard certificates (*.example.com) require DNS-01 challenges. Angie’s built-in ACME module only supports HTTP-01. For wildcards, use Certbot with a DNS plugin alongside Angie (the cert files work fine with Angie’s ssl_certificate directive). For all non-wildcard domains, Angie’s native ACME handles everything.
Will my sites go down during migration from NGINX to Angie?
There’s a brief switchover when you stop NGINX and start Angie — typically under a second. For truly zero-downtime migration, use socket passing or do the switch during a low-traffic window. For most production sites, the stop/start approach causes no measurable downtime.
Does Angie support the same 50+ modules as myguard NGINX?
Yes. All 50+ dynamic modules in the myguard repository are available for both NGINX and Angie as angie-module-* packages. ModSecurity WAF, Brotli, Zstd compression, Lua, NJS, GeoIP2, Headers More — all of them, all available.
How do I monitor certificate expiry with Angie?
The Angie JSON API includes certificate status at /status/ssl, including days until expiry for every managed certificate. You can scrape this with Prometheus and alert when certificates approach expiry. With Angie’s native ACME, certificates auto-renew — but it’s still good practice to monitor.
What’s the difference between angie.conf and nginx.conf?
There is no difference in syntax. Angie reads /etc/nginx/nginx.conf by default (for backward compatibility). You can also use /etc/angie/angie.conf if you prefer a clean install. The directive language is identical.
Is Angie suitable for high-traffic production environments?
Yes. Angie has the same performance characteristics as NGINX — the same architecture handles hundreds of thousands of concurrent connections per server. Multiple high-traffic sites run Angie in production. The myguard packages are compiled with the same optimization flags (-O3, jemalloc, openssl-nginx) as the NGINX builds.

Related posts