Terminación TLS con routing SNI multi-dominio, health checks activos, cache LRU de respuestas, rate limiting por IP, tunneling de WebSockets y un endpoint Prometheus /metrics — desde un solo archivo TOML. Este es el proxy delante de cada dominio de acá.
Define upstreams, certificados TLS y límites en un solo TOML.
# proxy.toml [server] listen = 443 workers = 64 tls_cert = "/etc/letsencrypt/live/ejemplo.com/fullchain.pem" tls_key = "/etc/letsencrypt/live/ejemplo.com/privkey.pem" rate_limit = 100 access_log = "/var/log/nyx-proxy/access.log" [upstream.0] name = "web" host = "127.0.0.1" port = 3000 hostname = "ejemplo.com" # cada <cliente>.ejemplo.com que no esté arriba [upstream.1] name = "clientes" host = "127.0.0.1" port = 3002 hostname = "*.ejemplo.com"
Seis pasos llevan una máquina Linux nueva a un proxy con terminación TLS corriendo bajo systemd en el puerto 443. Es la forma exacta que está delante de cada dominio de acá.
nyx-proxy es una librería Nyx. Instala el compilador, clona, compila el único binario.
$ curl -sSf https://nyxlang.com/install.sh | sh $ sudo apt install -y clang certbot # deps de build + TLS $ git clone https://github.com/nyxlang-dev/nyx-proxy $ cd nyx-proxy && nyx build # produce ./nyx-proxy
Crea registros A para cada dominio que vas a servir, apuntando a la IP pública del servidor. Confirma que resuelven antes de emitir certificados.
$ dig +short ejemplo.com # debe devolver la IP de tu servidor $ dig +short api.ejemplo.com
Let's Encrypt vía el modo standalone de certbot (ocupa :80 un momento — asegúrate de que nada más lo tenga tomado). Un certificado por dominio, o uno multi-dominio.
$ sudo certbot certonly --standalone \ -d ejemplo.com -d api.ejemplo.com # los certs quedan en /etc/letsencrypt/live/ejemplo.com/
Apunta tls_cert / tls_key al certificado emitido, lista tus upstreams por hostname (mira la config de arriba), y activa cache, métricas y rate limiting según necesites.
[server] listen = 443 workers = 64 tls_cert = "/etc/letsencrypt/live/ejemplo.com/fullchain.pem" tls_key = "/etc/letsencrypt/live/ejemplo.com/privkey.pem" [cache] enabled = 1 [metrics] enabled = 1 port = 9090
Una unit lo mantiene vivo entre reinicios y crashes. Necesita ligarse a :443, así que corre como root (o con CAP_NET_BIND_SERVICE).
# /etc/systemd/system/nyx-proxy.service
[Unit]
Description=nyx-proxy
After=network-online.target
[Service]
ExecStart=/srv/nyx-proxy/nyx-proxy /srv/nyx-proxy/proxy.toml
WorkingDirectory=/srv/nyx-proxy
Restart=always
AmbientCapabilities=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target
$ sudo systemctl enable --now nyx-proxy $ systemctl status nyx-proxy # active (running)
Pega cada dominio por HTTPS, confirma un HIT de cache, y recolecta las métricas. El timer de certbot renueva los certificados solo — recarga el proxy después de una renovación.
$ curl -sI https://ejemplo.com | head -1 # HTTP/2 200 $ curl -sD - https://ejemplo.com -o /dev/null | grep X-Nyx-Cache X-Nyx-Cache: HIT $ curl -s http://127.0.0.1:9090/metrics | head
certbot instala un timer de systemd que renueva antes del vencimiento. Agrega un deploy hook — --deploy-hook "systemctl reload nyx-proxy" — para que el proxy tome el certificado nuevo sin un restart manual.
hostname = "*.ejemplo.com" manda cada subdominio de una etiqueta a un solo upstream: los clientes nuevos entran sin tocar la config. Los hostnames exactos siempre le ganan al comodín, sin importar el orden; igual que un certificado comodín, no cubre el dominio pelado ni a.b.ejemplo.com.X-Nyx-Cache: HIT.2026-04-02 10:15:23 GET / 200 12ms 2026-04-02 10:15:24 GET /api/usuarios 200 3ms 2026-04-02 10:15:24 POST /api/data 201 8ms 2026-04-02 10:15:30 GET /api/spam 429 0ms
Para setups simples de proxy inverso, nyx-proxy hace lo mismo en una fracción del tamaño.