TLS 1.2+ · ROUTING SNI · BINARIO ~560KB

Un proxy inverso HTTPS.
Un binario chico.

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á.

Empezar GitHub
~560KB
un solo binario
13
dominios en una IP, más un comodín
1
archivo TOML
128
upstreams por archivo
Config simple

Un archivo para todo

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"
Del SO en blanco a producción

Instala y ponlo en producción

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á.

1 · Instala el toolchain y compila

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

2 · Apunta el DNS a la máquina

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

3 · Emite los certificados TLS

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/

4 · Escribe proxy.toml

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

5 · Córrelo bajo systemd

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)

6 · Verifica y observa

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
Renovación de certificados

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.

Características

Todo lo que necesitas

TLS multi-dominio con SNI
Sirve múltiples dominios en una sola IP. Cada dominio con su propio certificado TLS. Este servidor rutea 13 dominios y un comodín con un solo nyx-proxy.
Hostnames comodín
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.
Health checks
Verificaciones TCP activas cada N segundos. Los backends caídos se remueven automáticamente y se restauran al recuperarse.
Access logs
Formato estructurado: timestamp, método, path, status, latencia. Grep-friendly, escrituras protegidas con mutex.
Rate limiting
Contador de ventana deslizante por IP. Retorna HTTP 429 con header Retry-After. Configurable en proxy.toml.
Connection pooling
HTTP keep-alive entre el proxy y los backends. Reduce el overhead de conexiones.
Cache de respuestas (LRU + TTL)
Cachea respuestas GET 200 bajo HOST:PATH y honra el Cache-Control del upstream (no-store / no-cache / private bypassean; max-age override). Los hits van marcados X-Nyx-Cache: HIT.
Prometheus /metrics
Conteos de requests, clases de status, latencia y salud de upstreams en un puerto admin aparte — recoléctalo directo a Grafana.
X-Forwarded-For, -Host, -Proto
Inyecta la IP real del cliente, el hostname que pidió y el esquema original, para que tus backends registren por origen y atiendan varios clientes desde un solo proceso.
Redirect HTTP
Redirección automática HTTP a HTTPS en el puerto 80.
Observabilidad

Access logs estructurados

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
Comparacion

Reemplaza Nginx

Para setups simples de proxy inverso, nyx-proxy hace lo mismo en una fracción del tamaño.

Nginx
~1.5MB binario. Configuración compleja. Sistema de módulos. Docenas de dependencias.
nyx-proxy
Binario de ~560KB. Config TOML simple. TLS, routing comodín, health checks, rate limiting, cache LRU, /metrics y access logs integrados. Solo enlaza OpenSSL, Boehm GC y zlib; sin sistema de módulos.
Ecosistema

Parte del ecosistema Nyx

NyxKV
Almacén clave-valor compatible con Redis — 64 comandos, Pub/Sub.
redis-compatible
nyx-serve
El framework web — WebSockets, plantillas, sesiones.
9,971 req/s
nyx-queue
Cola de mensajes persistente con ACK.
3,252 msg/s