Lighttpd sobre CentOS 7

2
170

Siempre me ha llamado la atención el servidor web Lighttpd y siempre lo uso localmente para publicar mis repositorios en la red local de mi casa y de mi empresa. Se lo he recomendado a muchos colegas como la primera opción a elegir entre otros servidores como el Nginx y el Apache, que no son todos los servidores web disponibles para ambientes UNIX/Linux, pero si los mas utilizados.

No me agradan las comparaciones. Creo que cada uno de ellos fueron concebido para diferentes prestaciones y cargas. Tampoco soy especialista en la materia. ¡Que cada cual saque sus propias conclusiones!. 😉

El objetivo principal de éste documento es presentar al Lighttpd y mostrar como empezar a utilizarlo de forma simple y segura.

¡Esperamos le sea útil!

Lighttpd en Wikipedia:

lighttpd (pronunciado lighty) es un servidor web diseñado para ser rápido, seguro, flexible, y fiel a los estándares.

Está optimizado para entornos donde la velocidad es muy importante, y por eso consume menos CPU y memoria RAM que otros servidores. Por todo lo que ofrece, lighttpd es apropiado para cualquier servidor que tenga problemas de carga.

lighttpd es software libre y se distribuye bajo la licencia BSD. Funciona en GNU/Linux y UNIX de forma oficial. Para Microsoft Windows actualmente hay una distribución conocida como Lighttpd For Windows mantenida por Kevin Worthington.

Características

Entre sus principales características solo mencionaremos las siguientes:

  • Múltiples Hosts Virtuales para una misma dirección IP
  • Soporte para la Interfaz de entrada común o “Common Gateway Interface CGI“.
  • Soporte para el FastCGI, protocolo concebido con el objetivo de reducir la carga asociada, al permitir que el servidor atienda a muchas peticiones simultaneas de programas CGI. Es independiente de la plataforma o del lenguaje empleado en la confección del programa: C++, PHP, Perl, Java, etcétera. Utiliza un proceso por separado para atender a cada programa CGI, y permite que se ejecute en un host remoto.
  • Re-escritura de URL.
  • Admite conexiones seguras mediante SSL.
  • Soporta la Autenticación Básica (htpasswd, htdigest, plain), MySQL, GSSAPI y LDAP.
  • Mediante el módulo lighttpd-mod-geoip, permite la búsqueda o localización rápida de direcciones IP.
  • Compresión de contenidos de forma transparente.
  • Configuración condicional
  • Proxy HTTP

Paquetes relacionados con el Lighttpd en CentOS 7

Después de tener una instalación limpia como indicamos en cualquiera de los artículos anteriores

podemos iniciar el recorrido y enterarnos ¿qué nos trae CentOS 7 sobre éste servidor web?.

Los paquetes relacionados con Lighttpd se encuentran en el repositorio epel. Por tanto lo debemos habilitar:

[buzz@blog ~]$ sudo yum install epel-release
[buzz@blog ~]$ sudo yum update
[buzz@lemp ~]$ yum search lighttpd
lighttpd-fastcgi.x86_64 : FastCGI module and spawning helper for lighttpd and PHP configuration
lighttpd-mod_authn_gssapi.x86_64 : Authentication module for lighttpd that uses GSSAPI
lighttpd-mod_authn_mysql.x86_64 : Authentication module for lighttpd that uses a MySQL database
lighttpd-mod_geoip.x86_64 : GeoIP module for lighttpd to use for location lookups
lighttpd-mod_mysql_vhost.x86_64 : Virtual host module for lighttpd that uses a MySQL database
lighttpd.x86_64 : Lightning fast webserver with light system requirements

Para mayor información sobre el Lighttpd y cada uno de sus módulos visite http://trac.lighttpd.net/trac/wiki/. Una lista de Grandes Sitios que ejecutan Lighttpd la puede encontrar en Powered by Lighttpd.

En éste artículo, solamente usaremos el paquete principal. En posteriores, veremos el lighttpd-fastcgi.

Instalación, Firewall, SELinux, e inicio del Lighttpd

[buzz@blog ~]$ sudo yum install lighttpd

Ajustes en el firewall

[buzz@blog ~]$ firewall-cmd --help
[buzz@blog ~]$ man firewall-cmd

[buzz@blog ~]$ sudo firewall-cmd --list-all-zones
[buzz@blog ~]$ sudo firewall-cmd --list-all-zones | grep active
public (active)

[buzz@blog ~]$ sudo firewall-cmd  --get-services
[buzz@blog ~]$ sudo firewall-cmd --zone=public --list-services
dhcpv6-client ssh
  • Después de un breve tour por el comando, habilitamos los servicios http y https:
[buzz@blog ~]$ sudo firewall-cmd --zone=public --permanent --add-service=http
success

[buzz@blog ~]$ sudo firewall-cmd --zone=public --permanent --add-service=https
success
  • Para que los cambios tengan efecto, recargamos el servicio:
[buzz@blog ~]$ sudo firewall-cmd --reload
success
  • Comprobamos
[buzz@blog ~]$ sudo firewall-cmd --zone=public --list-services
dhcpv6-client http ssh https

[buzz@blog ~]$ sudo firewall-cmd --info-zone=public
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens32
  sources:
  services: dhcpv6-client http https ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

Contexto SELinux – NSA Security-Enhanced Linux

No existen reglas en el contexto con el nombre lighttpd. Si existen para el Apache que en CentOS lo identifica el paquete httpd. Compruebe Usted mismo:

[buzz@blog ~]$ sudo getsebool -a | grep lighttpd
[buzz@blog ~]$ sudo getsebool -a | grep httpd

No obstante, el archivo de configuración global hace referencia a SELinux en el párrafo siguiente:

## With SELinux enabled, this is denied by default and needs to be allowed
## by running the following once : setsebool -P httpd_setrlimit on
#server.max-fds = 2048

Lo que infiere que debamos configurar alguna variable httpd en caso necesario. Las habilitadas por defecto son:

httpd_builtin_scripting --> on
httpd_enable_cgi --> on
httpd_graceful_shutdown --> on

Habilitemos e iniciemos el servicio

[buzz@blog ~]$ sudo systemctl status lighttpd.service 
● lighttpd.service - Lightning Fast Webserver With Light System Requirements
   Loaded: loaded (/usr/lib/systemd/system/lighttpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

[buzz@blog ~]$ sudo systemctl enable lighttpd.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/lighttpd.service
to /usr/lib/systemd/system/lighttpd.service.

[buzz@blog ~]$ sudo systemctl start lighttpd.service

[buzz@blog ~]$ sudo systemctl status lighttpd.service 
● lighttpd.service - Lightning Fast Webserver With Light System Requirements
   Loaded: loaded (/usr/lib/systemd/system/lighttpd.service; enabled; vendor preset: disabled)
   Active: active (running) since dom 2017-10-22 10:42:50 EDT; 5s ago
 Main PID: 33940 (lighttpd)
   CGroup: /system.slice/lighttpd.service
           └─33940 /usr/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.conf

oct 22 10:42:50 blog systemd[1]: Started Lightning Fast Webserver With Ligh...s.
oct 22 10:42:50 blog systemd[1]: Starting Lightning Fast Webserver With Lig.....
oct 22 10:42:50 blog lighttpd[33940]: 2017-10-22 10:42:50: (network.c.273) ...es
oct 22 10:42:50 blog lighttpd[33940]: 2017-10-22 10:42:50: (server.c.1168) ...24
Hint: Some lines were ellipsized, use -l to show in full.

Comprobemos el funcionamiento

Podemos acceder a la página de bienvenida del Lighttpd mediante el nombre del dominio o su dirección IP:

lighty01

Configuraciones por defecto

La instalación del paquete lighttpd crea la carpeta /var/www/lighttpd como raíz para almacenar las páginas web, al mas puro estilo BSDBerkeley Software Distribution y descendientes como el FreeBSD.

La configuración completa del servidor la encontramos en la carpeta /etc/lighttpd:

[buzz@blog ~]$ ls -l /etc/lighttpd/
total 24
drwxr-xr-x. 2 root root  4096 oct 22 10:12 conf.d
-rw-r--r--. 1 root root 13561 ene 17  2017 lighttpd.conf
-rw-r--r--. 1 root root  3305 ene 14  2017 modules.conf
drwxr-xr-x. 2 root root    28 oct 22 10:12 vhosts.d
  • Hasta éste momento no hemos alterado en absoluto la configuración por defecto del lighttpd ni las carpetas de documentos que crea y ya lo tenemos funcionando.
  • El archivo de configuración principal es el lighttpd.conf.
  • Para habilitar los módulos modificamos el archivo modules.conf, pues la versión que instala CentOS carece de los comandos lighty-enable-mod y lighty-disble-mod como -por ejemplo- en Debian.
  • La carpeta conf.d contiene los archivos de configuración de los módulos que se pueden utilizar en el lighttpd.
  • En la carpeta vhosts.d almacenaremos las configuraciones de los hosts virtuales –virtual hosts– que necesitemos.

Aseguremos el servidor web

Cada vez es menos frecuente encontrar un sitio web en Internet al que podemos acceder mediante el protocolo http://. La mayoría nos permite el acceso mediante https://. Aunque para una red local o red empresarial es suficiente el HTTP, veamos como se puede asegurar nuestro lighttpd.

  • Creamos la carpeta /etc/lighttpd/certs y generamos el certificado del servidor.
    IMPORTANTE: El protocolo HTTPS no permite el uso de hosts virtuales con SSL.
[buzz@blog ~]$ sudo mkdir /etc/lighttpd/certs
[buzz@blog ~]$ cd /etc/lighttpd/certs

[buzz@blog certs]$ sudo openssl req -new -x509 -keyout blog.swl.fan.pem \
-out blog.swl.fan.pem -days 365 -nodes
Generating a 2048 bit RSA private key
.....+++
.+++
writing new private key to 'blog.swl.fan.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CU
State or Province Name (full name) []:Cuba
Locality Name (eg, city) [Default City]:Habana
Organization Name (eg, company) [Default Company Ltd]:Fans SWL
Organizational Unit Name (eg, section) []:Fans
Common Name (eg, your name or your server's hostname) []:blog.swl.fan
Email Address []:buzz@swl.fan
  • Editamos el archivo lighttpd.conf y agregamos al final:
[buzz@blog certs]$ cd
[buzz@blog ~]$ sudo nano /etc/lighttpd/lighttpd.conf
----
$SERVER["socket"] == "192.168.10.6:443" {
        ssl.engine                  = "enable"
           ssl.pemfile                 = "/etc/lighttpd/certs/blog.swl.fan.pem"
        server.name                 = "blog.swl.fan"
        server.document-root = server_root + "/lighttpd"
}
  • Reiniciamos el servicio y comprobamos en un navegador
[buzz@blog ~]$ sudo systemctl restart lighttpd.service 
[buzz@blog ~]$ sudo systemctl status lighttpd.service

En éstos momentos, podemos acceder al servidor mediante HTTP o HTTPS. Si lo hacemos mediante HTTPS, la primera vez nos pedirá que confiemos en el sitio.

Posteriormente, enviaremos todas las peticiones por el puerto 80 hacia el 443, al habilitar el módulo mod_redirect y modificar el archivo lighttpd.conf.

  • Al incluir de forma Global la seguridad SSL -solo se puede configurar a nivel del archivo de configuración global- se extenderá a TODOS los hosts virtuales que configuremos.

A propósito quiero comentar que el mensaje que muestran muchos navegadores donde nos dicen algo así como:

Su conexión no es segura

El propietario de blog.swl.fan ha configurado su sitio web de manera incorrecta. Para evitar que su información sea robada, Firefox no ha conectado con este sitio web.

Y nos dan las opciones de Ir atrás o Avanzado, no es mas que puro marketing para obligarnos a comprar certificados o resolver con sus variantes “free“. El Certificado Autofirmado generado mediante OpenSSL es tan seguro como cualquiera. Al menos esa es mi opinión.

Hosts virtuales

En mi opinión, una de las mas fuertes características del Lighttpd es la de que podemos ejecutar múltiples hosts virtuales mediante una sola instancia del demonio lighttpd. El módulo lighttpd-mod-mysql-vhost habla por si solo. Imaginen la enorme cantidad de hosts virtuales que podemos tener mediante su uso.

En redes empresariales es raro el uso de muchos hosts virtuales, y por ello emplearemos el módulo mod_simple_vhost que se instala por defecto.

Supongamos que queremos instalar por separado un WordPress del resto del contenido web que albergará la Intranet de nuestra empresa.

  • Agregamos un registro CNAME en el DNS para cada nuevo host virtual que creemos:
blog            IN      A       192.168.10.6
wordpress       IN      CNAME   blog.swl.fan.

[buzz@blog ~]$ host wordpress.swl.fan
wordpress.swl.fan is an alias for blog.swl.fan.
blog.swl.fan has address 192.168.10.6
  • Creamos la carpeta /var/www/vhosts y dentro de ella los directorios relacionados con el nuevo host virtual wordpress.swl.fan:
[buzz@blog ~]$ sudo mkdir -p /var/www/vhosts/wordpress.swl.fan/htdocs
[buzz@blog ~]$ sudo chown lighttpd:lighttpd /var/www/vhosts/
  • Modificamos el archivo /etc/lighttpd/conf.d/simple_vhost.conf y lo adaptamos a nuestras necesidades. Observen que el único cambio se indica en negritas y color rojo:
buzz@blog ~]$ sudo nano /etc/lighttpd/conf.d/simple_vhost.conf
##
##  Simple Virtual hosting
## ------------------------
## See http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModSimpleVhost
##
server.modules += ( "mod_simple_vhost" )

##  If you want name-based virtual hosting add the next three settings and load
##  mod_simple_vhost
##
## document-root =
##   virtual-server-root + virtual-server-default-host + virtual-server-docroot
## or
##   virtual-server-root + http-host + virtual-server-docroot
##
simple-vhost.server-root   = vhosts_dir + "/"
simple-vhost.default-host  = "blog.swl.fan"
simple-vhost.document-root = "/htdocs/"
##
## Print some errors for finding the document-root
##
#simple-vhost.debug = "enable"
  • Para configurar hosts virtuales, habilitamos el módulo mod_simple_vhost en el archivo /etc/lighttpd/modules.conf. Para reenviar las peticiones del puerto 80 HTTP hacia el puerto 443 HTTPS, habilitamos el módulo mod_redirect en el mismo archivo:
[buzz@blog ~]$ sudo nano /etc/lighttpd/modules.conf
----
server.modules = (
  "mod_simple_vhost",
  "mod_access",
  "mod_alias",
#  "mod_auth",
#  "mod_authn_file",
#  "mod_evasive",
  "mod_redirect",
#  "mod_rewrite",
#  "mod_setenv",
#  "mod_usertrack",
)
----
  • Para hacer efectivo el reenvío del 80 al 443, agregamos al final del archivo de configuración global /etc/lighttpd/lighttpd.conf -después del bloque que ya adicionamos y comienza con $SERVER[“socket”] == “192.168.10.6:443”– lo siguiente:
[root@blog ~]# nano /etc/lighttpd/lighttpd.conf
$SERVER["socket"] == ":80" {
 $HTTP["host"] =~ "(.*)" {
 url.redirect = ( "^/(.*)" => "https://%1:443/$1" )
 }
}
  • Creamos el archivo de configuración del nuevo sitio en la carpeta /etc/lighttpd/vhost.d/:
[buzz@blog ~]$ sudo nano /etc/lighttpd/vhosts.d/wordpress.swl.fan.conf
$HTTP["host"] == "wordpress.swl.fan" {
  simple-vhost.server-root = "/var/www/vhosts/"
  simple-vhost.default-host = "wordpress.swl.fan"
  simple-vhost.document-root = "htdocs"
}
  • Habiltamos los hosts virtuales en el archivo de configuración global. Solamente es necesario eliminar el comentario de la siguiente línea:
[buzz@blog ~]$ sudo nano /etc/lighttpd/lighttpd.conf
---
#include_shell "cat /etc/lighttpd/vhosts.d/*.conf"
include_shell "cat /etc/lighttpd/vhosts.d/*.conf"
---
  • Como hemos modificado algunos archivos de configuración, debemos comprobar su sintaxis antes de reiniciar el servicio:
[buzz@blog ~]$ sudo lighttpd -t -f /etc/lighttpd/lighttpd.conf 
Syntax OK
  • No debemos olvidar crear una página de prueba para el nuevo sitio. Ejemplo:
[buzz@blog ~]$ sudo nano /var/www/vhosts/wordpress.swl.fan/htdocs/index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>wordpress.swl.fan</title>
  </head>
  <body>
    <h1>Bienvenido al Blog empresarial wordpress.swl.fan</h1>
  </body>
</html>
  • Reiniciamos el servicio y comprobamos en un navegador el acceso al nuevo sitio:
[buzz@blog ~]$ sudo systemctl restart lighttpd.service 
[buzz@blog ~]$ sudo systemctl status lighttpd.service

lighty02

  • De igual forma podemos crear cuantos hosts virtuales sean necesarios.

Resumen

  • El tip principal en la configuración del Lighttpd en CentOS 7 es respetar los parámetros por defecto y modificar lo estrictamente necesario.
  • Solo hemos visto el 10% de la punta del Iceberg que es el Lighttpd. Sin embargo, ya lo podemos usar.
  • En próximos documentos veremos mas características de este potente, rápido y ligero servidor de páginas web.

¡Hasta la próxima entrega!

2 Comentarios

  1. WOW excelente aporte el de este tutorial. Sigan asi chicos!!!! Esperando desde ya el siguiente. Saludos.
    Fede gracias por el ejemplo detallado de la configuracion del Firewall.

    • Yoan, ese es nuestro propósito: dar tutos didácticos y probados. Pruebo varias veces cada uno que he escrito. Se me pude ir algún error pues soy humano. ;-). Esperamos sigas con nosotros, y gracias por comentar.

Dejar respuesta

Please enter your comment!
Please enter your name here