miniserv

Volver

License: GPL v3 Language: C Standard: POSIX Website

miniserv es un servidor web HTTP/1.1 de archivos estáticos, minimalista, portátil y conforme a POSIX, escrito en C. Diseñado para ser simple, auditable y sin dependencias, está implementado únicamente con C estándar y APIs POSIX.

Repositorio

https://github.com/kaisarcode/miniserv

Características

  • Conexiones Keep-Alive (HTTP/1.1)
  • Soporte para rangos y contenido parcial (RFC 7233)
  • Métodos HEAD y GET
  • Pool de hilos con cola de peticiones segura (pthread)
  • I/O completamente POSIX: poll, read, write, lseek, socket
  • Detección estática de MIME types (incluyendo .ico)
  • Apagado limpio con señales SIGINT o SIGTERM

Arquitectura Técnica

miniserv utiliza un pool fijo de hilos trabajadores. Cada hilo usa poll(2) para esperar datos del cliente y servir solicitudes directamente.

Los descriptores de archivo se distribuyen entre hilos mediante una cola circular (fd_queue_t), sincronizada con pthread_mutex_t y pthread_cond_t, asegurando concurrencia eficiente con mínimo locking.

Todas las llamadas del sistema son conformes a POSIX.1-2008, sin extensiones específicas como epoll o kqueue.


Compilación

cd src
make

El binario resultante se generará como ./miniserv en la raíz del proyecto.

Instalación

sudo make install

Instala:

  • Binario → /usr/local/bin/miniserv
  • Manpage → /usr/local/share/man/man1/miniserv.1

Para desinstalar:

sudo make uninstall

Uso

Modo básico

./miniserv 8080 ./www

Sintaxis completa

miniserv [PUERTO] [DOCUMENT_ROOT] [THREADS] [TIMEOUT] [MAX_KEEPALIVE]

Valores por defecto:

  • Puerto: 8080
  • Hilos: 4
  • Timeout Keep-Alive: 5s
  • Máx. solicitudes Keep-Alive: 100

Ejemplo

./miniserv 8080 /var/www 8 10 200

Después abre tu navegador en:

http://localhost:8080/

Soporte HTTPS

miniserv no implementa SSL/TLS internamente, por diseño. Para HTTPS, puede ejecutarse detrás de un proxy TLS como stunnel, nginx, caddy o haproxy.

Ejemplo con stunnel:

[https]
accept = 443
connect = 127.0.0.1:8080
cert = /ruta/a/server.pem

Luego inicia miniserv normalmente:

./miniserv 8080 ./www
sudo stunnel stunnel-miniserv.conf

Esto habilita HTTPS sin comprometer la portabilidad y simplicidad de miniserv.


Historia

miniserv fue creado originalmente en 2013 por KaisarCode, como un experimento personal inspirado en el libro "Lenguaje C" de Fco. Javier Ceballos.

En 2025 fue reescrito desde cero como un servidor modular, limpio y completamente POSIX.1-2008, sirviendo como referencia didáctica y base práctica para proyectos de red en C.


Licencia

miniserv está licenciado bajo GNU General Public License v3.0 (GPLv3).

Puedes usar, modificar y distribuir este software según los términos de dicha licencia. Consulta el archivo LICENSE o visita: https://www.gnu.org/licenses/gpl-3.0.html


Invitame un café en cafecito.app