HTTPS y varios servidores
HTTPS
Corvis no termina TLS: el servidor solo acepta HTTP/1.1 y HTTP/2 sin cifrar (h2c). No hay opciones para cargar un certificado y una clave en la aplicación.
La forma recomendada de servir HTTPS es poner un proxy inverso delante (nginx, Caddy, Traefik, un balanceador de la nube) que termine TLS y reenvíe a la aplicación por HTTP en la red interna. En ese caso:
- Escucha solo en la interfaz interna o en
127.0.0.1, por ejemploapp.listen("127.0.0.1:3000").await. Ojo:app.listen(3000)(un número) escucha en0.0.0.0. - Configura
trust proxypara quereq.ip(),req.ips()yreq.hostname()lean las cabecerasX-Forwarded-*del proxy:app.set_trust_proxy(1). Ver Adaptadores HTTP. - Fija
Strict-Transport-Securityen el proxy o con un middleware. Ver Cabeceras de seguridad.
Escuchar en varios puertos
listen consume la aplicación y bloquea hasta que termina, pero listen_in_background(addr) arranca un servidor en segundo plano y devuelve la dirección en la que escucha. Puedes combinarlos para atender la misma aplicación en dos direcciones:
#[corvis::main]
async fn main() -> corvis::Result<()> {
let mut app = CorvisFactory::create::<AppModule>().await?;
app.enable_shutdown_hooks();
let internal = app.listen_in_background("127.0.0.1:9000").await?;
Logger::new("Bootstrap").log(format!("Internal listener on {internal}"));
app.listen("0.0.0.0:3000").await
}Ambos servidores comparten rutas, providers y configuración (se inicializa una sola vez). Ten en cuenta que:
- Las opciones de
set_server_optionsse aplican a los dos. - Con
enable_shutdown_hooks, al recibir la señal se detiene el servidor delisteny se ejecutan los hooks de cierre; el delisten_in_backgroundno se drena: termina cuando termina el proceso. app.get_url()devuelve la dirección del último servidor que empezó a escuchar.
listen_in_background("127.0.0.1:0") elige un puerto libre, lo que también resulta útil en pruebas end to end.
No hay forma de servir rutas distintas en cada puerto: si necesitas eso, crea dos aplicaciones con módulos raíz distintos.