Documentos de Académico
Documentos de Profesional
Documentos de Cultura
3 de septiembre de 2001
A mi padre y
a mi novia Isabel
Prefacio
Ha pasado mucho tiempo “informáticamente hablando” desde los primeros servidores Web que
simplemente servían páginas bajo el protocolo HTTP, estos eran programas que no necesitaban
de un conocimiento demasiado avanzado ni para su instalación ni para su mantenimiento. Hoy
por hoy, la evolución es patente, siendo innumerables tanto los servidores Web disponibles en el
mercado como los servicios de alto nivel que se ofrecen en torno a ellos; esta evolución hace que
las tareas de configuración y mantenimiento de un servidor Web no sean triviales.
En este proyecto y ante la actual explosión tanto de Internet como de la World Wide Web, se
pretende hacer un análisis, desde el punto de vista de un administrador o Webmaster, de las
tecnologías asociadas al protocolo HTTP (servidores Web) y aplicar las mismas de forma práctica
instalando y configurando adecuadamente un servidor.
Objetivos básicos
A modo de resumen se puede decir que los objetivos básicos son dos:
1. Realizar un estudio teórico de las tecnologías más relevantes que se pueden usar en un
servidor Web.
2. Instalar y configurar un servidor Web sobre el que corran aplicaciones reales de ejemplo de
las tecnologías abordadas en la parte teórica.
Debido al carácter predominantemente teórico del proyecto, se ha optado por una organización de
la memoria que no se adecua al formato estándar indicado en el reglamento de proyectos fin de
carrera. Concretamente se ha dividido este documento en cuatro grandes partes:
i
ii
5. Apéndices.
Servidores Web y de aplicaciones, con información sobre el estado del arte y una breve
descripción de los que se consideran más interesantes.
Otras tecnologías asociadas y de gran implantación en la actualidad (CGI, ASP, PHP, etc.).
Capítulo 2. El protocolo HTTP: que trata los conceptos básicos del protocolo que subyace en
todas las implementaciones de servidores Web.
Capítulo 5. HTTP seguro: un vistazo general a las técnicas que se pueden utilizar para asegurar
la transferencia de datos sobre HTTP (HTTP + SSL y S-HTTP).
Capítulo 6. Relación entre Web y XML: este capítulo trata los conceptos básicos de XML y de
algunas de sus aplicaciones más importantes a la World Wide Web (XHTML y SOAP).
Capítulo 7. Gestión de recursos remotos: presenta dos soluciones para proporcionar la gestión
de recursos remotos, FrontPage y WebDAV. Se hará hincapié en WebDAV, ya que es un
estándar del W3C e incluso Microsoft le está dando su apoyo.
Capítulo 8. Bases de datos y búsqueda en la Web: proporciona una visión general de algunos
de los sistemas gestores de bases de datos más utilizados. También se presentan algunas de
las tecnologías que permiten a una aplicación Web conectarse a BBDDs. Además se incluye
una sección donde se describen los aspectos teóricos de un buscador, una de las aplicaciones
Web que hace un uso más intensivo de los sistemas de bases de datos.
iii
Capítulo 9. Registro de actividad, log o bitácora: introduce los métodos más utilizados para el
registro de actividad en un servidor Web (archivos de log, cookies, etc.). Además se
comentan de manera genérica varias herramientas relacionadas (analizadores y rotadores
de log).
En esta segunda parte se documenta el trabajo práctico necesario para instalar y configurar un
servidor Web Apache con sus extensiones más habituales1 sobre una plataforma Linux/Unix.
Capítulo 10. Instalando Apache para Linux/Unix: presenta los pasos a seguir para efectuar la
instalación básica de Apache.
Capítulo 11. Configuración básica del servidor: se muestran cuales son los ficheros, directivas
y módulos utilizados en una configuración básica de Apache. Además se comentan aspectos
de seguridad relacionados y algunas herramientas típicas de chequeo de la configuración.
Capítulo 12. Servidores virtuales: explica como simular más de un equipo servidor cuando en
realidad se dispone de una sola máquina con Apache.
Capítulo 13. Configurando SSI y CGI: SSI y CGI son las dos tecnologías de generación de
contenido dinámico más antiguas, ambas se incluyen en las distribuciones de Apache. En
este capítulo se discute como se instalan y configuran adecuadamente.
Capítulo 14. Servlets y Jsp con Tomcat. Integración con Apache: Tomcat es un contenedor
Servlet muy extendido en el mercado, su instalación, configuración y métodos de
integración con Apache son el objetivo de este capítulo.
Capítulo 15. Configurando PHP: donde se explica como instalar y configurar PHP, un conocido
lenguaje embebido en HTML, sobre un servidor Web Apache.
Capítulo 16. Autenticación, autorización y control de acceso: está dedicado a como proteger
partes de un sitio Web, abordando los métodos de autenticación definidos en la
especificación HTTP (Basic y Digest), su posible uso combinado con el control de acceso
basado en IPs o nombres de equipos, y algunas técnicas relacionadas.
Capítulo 17. Habilitando la gestión remota de recursos con WebDAV: o como habilitar las
capacidades de gestión de recursos remotos que proporciona el módulo de Apache mod_dav.
1 Remarcar que se instalan las extensiones más habituales, esto quiere decir, que son todas las que están pero no están
todas las que son. Más concretamente, todas las características instaladas en Apache son comentadas como conceptos
en la parte teórica, pero no todos estos conceptos teóricos han sido instalados en Apache.
iv
Capítulo 18. Configurar conexiones seguras en Apache sobre SSL: se discute como utilizar el
módulo de Apache mod_ssl para conseguir un servidor Web capaz de recibir peticiones y
transferir datos de manera “segura”2 sobre el protocolo SSL.
Capítulo 19. Personalizar el registro y recopilar estadísticas: existen varios métodos que un
servidor Web Apache puede utilizar para registrar (log) sus operaciones. En este capítulo se
explica como configurar adecuadamente el servicio de log y como personalizarlo según las
necesidades particulares.
Capítulo 20. Otros módulos y tecnologías relacionadas: presenta algunas otras tecnologías
relacionadas con Apache (proxy-caché, redundancia, reescritura, etc.), que aún siendo
importantes no han tenido cabida en los capítulos anteriores.
En esta parte se supone un caso práctico (el servidor Web de una Escuela de Informática) donde
el lector es el administrador Web. Sobre este ejemplo, y en lenguaje coloquial, se describe
una posible evolución temporal. En cada capítulo se plantean nuevos problemas a los que el
administrador deberá responder:
Los conocimientos teóricos sobre instalación y configuración comentados en las dos primeras
partes serán fundamentales en la resolución de este caso práctico.
Capítulo 21. Primeros pasos: narra como el administrador se encuentra ante un equipo sin
servidor Web. Se conseguirá instalar un Apache, publicar la primera página y
posteriormente mejorar el sistema con servidores virtuales.
se abusa del término seguridad, el lector debe entender que se refiere a seguridad relativa.
v
Capítulo 24. Linkómetro. Ejecución de scripts CGI de usuario: un usuario necesita ejecutar
sus propios scripts CGI, ¿cómo hacerlo de forma segura?, vea este capítulo.
Capítulo 25. Macromedia Dreamweaver y WebDav. Gestión remota de sitios Web: donde el
administrador se enfrenta a la tarea de preparar un repositorio WebDAV sobre el que puedan
trabajar varios usuarios y que esté disponible mediante acceso restringido.
Capítulo 26. UDMSearch. Un buscador Web: si el espacio de páginas crece mucho, se puede
utilizar alguna herramienta que permita indexar y hacer búsquedas. En este capítulo se
comenta una de ellas.
Capítulo 27. Jive. Un sistema de foros basado en Servlets y JSP: hay muchos métodos de
crear foros en Internet, las clásicas News, listas de correo electrónico, etc, pero en los
últimos tiempos ha surgido algo más, los sistemas de foros basados en Web.
Capítulo 28. PhpMyAdmin. Gestión Web de bases de datos MySQL: el Webmaster también
tiene sus necesidades, por ejemplo, en este capítulo se ilustra como gestionar un SGBD
MySQL desde Web de manera “segura”.
Una parte, breve pero importante, donde se expone la conclusión final y algunas posibles líneas de
trabajo futuras relacionadas con el proyecto realizado.
Apéndices
Esta parte contiene explicaciones o listados un poco más en profundidad de ciertos conceptos que
se utilizan a lo largo de la memoria. Se opta por incluirlos como apéndices porque no tienen la
suficiente entidad y/o no están lo suficientemente relacionados con el tema del proyecto como para
ser objeto de un capítulo propio.
Apéndice B. Dynamic Shared Objects en Apache: en muchos sitios de esta memoria aparece
el concepto DSO. Aunque en el capítulo 10 se hace una breve descripción del mismo, se
ha decidido incluir como apéndice una adaptación de la traducción hecha por el proyecto
ApacheES [21] del documento Soporte de Objetos Compartidos Dinámicos (Dynamic
Shared Object - DSO), cuyo original en inglés se distribuye con la documentación de
Apache.
vi
Apéndice D. Configuración por defecto del servidor Apache: más de la mitad de la memoria
se ocupa de explicar temas de configuración de Apache, y generalmente se presentan trozos
de código. Incluir un archivo de configuración completo ayuda a ubicar cada trozo en su
sitio. Además está lleno de buenos comentarios (en inglés).
Líneas de lectura
Aunque para obtener una mejor visión global del tema tratado en este proyecto lo más
recomendable es leer la memoria completa y en orden, también pueden consultarse los capítulos
que se consideren más interesantes de forma independiente. Además existen algunas líneas de
lectura bastante claras, que relacionan capítulos, destacar:
Capítulos 10, 11, 20: instalación y configuración básica de un servidor Web Apache, visión
general de otras tecnologías relacionadas.
Capítulos 5, 16, 18, 28: conceptos teóricos sobre las tecnologías que aportan seguridad a las
transferencias de datos sobre Web. Métodos de instalación, configuración y ejemplo.
Capítulos 6, 7, 17, 25: conceptos teóricos sobre las tecnologías basadas en XML relacionadas
con la Web, gestión de recursos remotos con WebDAV. Instalación, configuración y ejemplo.
Capítulos 8, 26: teoría básica y métodos de instalación de las tecnologías de acceso a bases de
datos más usadas en Internet. Teoría y ejemplo de un buscador, uno de los servicios Web
que utilizan más ampliamente las BBDDs.
Capítulos 12, 21: teoría básica, métodos de instalación y un ejemplo real del uso de servidores
virtuales en Apache.
Capítulos 3, 4, 13, 14, 15, 22, 23, 24, 27: Conceptos teóricos sobre las tecnologías que permiten
programar de manera externa o mediante código embebido sobre la base de un servidor Web.
Métodos de instalación básica de un Apache con soporte a estas tecnologías y ejemplos de
utilización.
vii
Localización de contenidos
CD-ROM
A modo de resumen, comentar que entre el software pueden encontrarse varios servidores Web,
módulos para Apache, drivers de bases de datos, etc, y dentro de la documentación aparece el
original de esta memoria junto con copias de algunas de las especificaciones más importantes a
las que se hace referencia en este proyecto (HTTP, WebDAV, etc.).
Agradecimientos
Siempre hay personas a las que agradecer su colaboración, no me gustaría dejarme a nadie, pero
si es así espero que me perdone:
Al director y codirector de este proyecto, David Cabrero Souto y Pedro Cuesta Morales, por
prestarme algo de su tiempo en el difícil mes de agosto.
A esos otros que una vez leída esta memoria encuentren errores pero sepan disculparme.
A los que me proporcionaron libros para paliar los problemas provocados por una
“biblioteca cerrada por obras hasta el 17 de septiembre del 2001”.
Y por supuesto, a todo esa “pandilla” de amigos que me apoyó en todo momento. Ellos
saben quienes son.
Por último quiero recordar a todo el grupo humano que forma la Escuela Superior de
Ingeniería Informática de Ourense (bedeles, encargados de cafetería, etc.).
A todos, gracias.
viii
Índice General
I Conceptos teóricos:
El Web, servidores y tecnologías asociadas 1
1 Panorámica actual 3
1.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.5.1 Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.5.3 Enhydra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5.4 Jigsaw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5.9 Zeus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.6 Conclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
ix
x ÍNDICE GENERAL
2 El protocolo HTTP 19
2.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.1.1 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.1.2 Propiedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.3.4 Autenticación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.3.5 Proxy-caché . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.2 CGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.3 Servlets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.3.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.3.5 Un ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.2 SSI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.2.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.2.4 JSSI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.2.5 Un ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.3 JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.3.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.3.3 Un ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.4 PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.4.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.4.2 El lenguaje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.4.4 Un ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
4.5 ASP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
4.5.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
4.5.3 Implementaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.5.4 Un ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.7 Conclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
xii ÍNDICE GENERAL
5 HTTP seguro 77
5.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.2.6 HTTPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.3 S-HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.3.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.3.2 El protocolo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.3.3 Implementaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.2 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.2.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.3 XHTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
6.3.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
6.4 SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.4.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.4.2 Antecedentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
II Aplicación práctica 1:
Configuración de un servidor Web Apache 131
20.11Conclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
V Apéndices 359
Bibliografía 407
xxiv ÍNDICE GENERAL
Índice de Tablas
xxv
xxvi ÍNDICE DE TABLAS
1.4 Cuota de mercado en España para servidores Web. Julio de 2001, Security Space. 11
13.2 Error típico provocado por un problema de permisos en un script CGI. . . . . . . 235
xxvii
xxviii ÍNDICE DE FIGURAS
24.1 Apariencia de una página Web de marcadores generada con el Linkómetro. . . . . 325
8.1 Acceso a bases de datos MySQL desde un script cgi en Perl. . . . . . . . . . . . 116
8.2 Acceso a bases de datos MySQL desde una página ASP. . . . . . . . . . . . . . 118
8.3 Acceso a bases de datos MySQL desde una página JSP. . . . . . . . . . . . . . . 119
8.4 Acceso a bases de datos MySQL desde una página PHP. . . . . . . . . . . . . . 120
xxxi
xxxii ÍNDICE DE LISTADOS
Conceptos teóricos:
El Web, servidores y tecnologías
asociadas
1
Capítulo 1
Panorámica actual
1.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Servidores Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 Servidores de aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3.1 Servicios añadidos de los servidores de aplicaciones . . . . . . . . . . 7
1.3.2 Tecnologías para implementar servidores de aplicaciones . . . . . . . . 8
1.4 Mediciones de mercado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.5 Algunos ejemplos de servidores . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.5.1 Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.5.2 BEA Weblogic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5.3 Enhydra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5.4 Jigsaw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5.5 Macromedia-Allaire ColdFusion . . . . . . . . . . . . . . . . . . . . . 15
1.5.6 Microsoft IIS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.5.7 NCSA HTTPd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.5.8 Netscape-Sun iPlanet . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.5.9 Zeus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.5.10 Tabla comparativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.6 Conclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.1 Introducción
La idea de la World Wide Web (en adelante Web) nació en 1989, cuando Tim Berners-Lee del
Laboratorio Europeo de Física de Partículas (conocido como CERN) propuso las bases teóricas
de un proyecto que permitiría difundir investigaciones e ideas a través de la red. En 1990
3
4 CAPÍTULO 1. PANORÁMICA ACTUAL
apareció la primera implementación, que ya soportaba conceptos habituales hoy en día (hipertexto,
hiperenlaces, etc.). Desde ese momento la Web ha crecido mucho, su éxito se debe entre
otras cosas a la facilidad que ofrece para navegar por la información sin necesidad de aprender
comandos complicados, únicamente se necesita conocer el manejo de un entorno de ventanas y
del ratón.
Basándose en los principios básicos definidos por Berners-Lee, se han desarrollado multitud de
servicios. La mayor evolución ha tenido lugar en el lado del servidor. A lo largo de este proyecto
se hará una presentación de distintas tecnologías asociadas a los servidores Web.
Los servidores Web son la base en la que se apoya el funcionamiento de la World Wide Web. Pero
de un tiempo a esta parte también se escucha mucho el término servidores de aplicaciones. Existe
mucha confusión sobre el significado exacto de estas denominaciones, mucha gente piensa que
son lo mismo, mientras otros grupos defienden que son completamente diferentes.
Para aclarar un poco las ideas hagamos un poco de historia. Cuando se crearon los primeros
servidores de páginas Web (Web servers), su única misión era recuperar una página Web estática
de su disco duro y enviársela al cliente (navegador). Para cualquier otro tipo de información que
debiera generarse de manera dinámica (respuestas a búsquedas, etc.) el servidor tenía que ceder el
control a algún tipo de código externo mediante CGI.
Con el paso del tiempo el uso de servidores Web se generalizó y se hizo necesario incrementar
los servicios ofrecidos. El primer paso fue mejorar la eficiencia en el proceso de construcción de
información dinámica, y desde ahí han surgido multitud de tecnologías1 . Finalmente la evolución
ha llevado a crear un nuevo término: servidor de aplicaciones (Application server). Hay bastantes
intereses (y estrategias de marketing) que intentan hacer creer que esto es algo completamente
nuevo y que no tiene nada que ver con todo lo demás. En realidad, a un nivel básico, casi todos los
servidores Web actuales son también servidores de aplicaciones, ya que incluyen alguna tecnología
(CGI, PHP, JSP, etc.) que permite crear aplicaciones que generan contenido dinámico.
En las siguientes secciones se dará una visión general de los productos actuales y las tendencias
del mercado.
Hoy en día existen multitud de productos que funcionan como servidores Web3 . Se presenta a
continuación un breve listado con algunos de los más conocidos. Un listado más completo puede
encontrarse en el sitio http://www.serverwatch.com/webservers.html [114]:
Apache
Jigsaw
Microsoft IIS
Microsoft PWS
NCSA HTTPd
2 Los servidores Web más básicos sólo son capaces de recuperar archivos de disco duro.
3 Sus desarrolladores le dan este nombre, aunque en un sentido amplio, todos proveen algún soporte para ejecutar
aplicaciones y podrían ser “servidores de aplicaciones”.
6 CAPÍTULO 1. PANORÁMICA ACTUAL
Sambar Server
SimpleServer:WWW
Stronghold
Un servidor de aplicaciones no es más que un cambio de nombre, para algunos servidores Web
de nueva generación que proporcionan la lógica de negocio sobre la que construir aplicaciones.
Suelen asociarse con servidores de alto rendimiento pensados para dar servicio a sitios Web
(Web sites) con grandes necesidades: afluencia de visitas, movimiento de datos, atención de
transacciones hacia bases de datos, etc. Generalmente los fabricantes del sector tienen a
disposición del público un servidor Web básico y otro con multitud de extensiones fuertemente
integradas al que llaman servidor de aplicaciones.
Puede encontrarse un buen listado de servidores de aplicaciones4 en el sitio Web http://www.
serverwatch.com/appservers.html [114]. A modo de ejemplo se muestra un listado con los
productos de algunas empresas bien conocidas:
Borland AppServer
Allaire ColdFusion
Lotus Domino
IBM WebSphere
1. Presentación: una interfaz, generalmente gráfica que reside en los clientes. El ejemplo típico
es un navegador.
de aplicaciones.
1.3. SERVIDORES DE APLICACIONES 7
¿Cuáles son los servicios, que añadidos a un servidor Web, lo convierten en servidor de
aplicaciones?. En general se puede afirmar que cuantos más puntos de la siguiente lista
implemente un servidor, más “de aplicaciones” será.
Trabajo con bases de datos: existirán objetos que faciliten el acceso a bases de datos,
ocupándose de gestionar las conexiones y proporcionando un acceso uniforme. Otros
objetos se encargarán de la gestión de transacciones englobando diversas sentencias y
ocupándose de los commit o rollback.
a los datos del usuario mediante objetos de sesión (session). Elimina la necesidad de incluir
código en las aplicaciones para diferenciar las peticiones de distintos usuarios.
Lógica de negocio: la lógica de negocio propia de cada aplicación debe poder ser encapsulada en
componentes. A cada uno de ellos se le podrán asignar mecanismos propios de seguridad,
gestión de transacciones, ...
Seguridad: debe poseer características de seguridad que den soporte a aplicaciones seguras. Los
clientes deben autentificarse contra al servidor, y este es el responsable de darles acceso a
sus diferentes componentes, como puede ser una base de datos. La mayoría de servidores
disponen de un mecanismo para incorporar nuevos usuarios y grupos. El control de a que
partes del servidor puede acceder un usuario puede ser controlado por diversos métodos, por
ejemplo en un directorio LDAP (Lightweight Directory Access Protocol).
J2EE
La estrategia comercial de Sun con respecto a Java y a su nueva plataforma J2EE (Java 2
Enterprise Edition) [54] está teniendo mucho éxito en este sector. De hecho, a veces se utiliza
el término: servidores de aplicaciones Java para referirse a aquellos servidores de aplicaciones
que implementan adecuadamente las soluciones propuestas por J2EE..
J2EE es una especificación que propone un estándar para servidores de aplicaciones. Define
diferentes tecnologías e indica como deben trabajar juntas. Todos los servidores de aplicaciones
que quieran ser etiquetados como servidores de aplicaciones J2EE deben pasar un test de
compatibilidad, que garantiza la correcta implementación de las tecnologías Java.
Muchos grandes fabricantes (IBM, Sun Microsystems, Hewlett-Packard, Oracle, Sybase, etc.) y
empresas de nueva tecnología (BEA, etc.) se han subido a este tren. La razón más importante para
ello es que la infraestructura de Java parece ideal para obtener los servicios añadidos que se han
comentado en la sección anterior.
Pero las soluciones basadas en Java también tienen su parte negativa: la gran cantidad de recursos
(CPU y memoria) que consumen las aplicaciones, la lentitud de ejecución debido a la necesidad
de una máquina virtual que interprete el código de bytes, etc.
5 De manera sencilla se puede decir que un cluster es un conjunto de servidores que aparecen ante el usuario como
No-J2EE
Hoy en día prácticamente todos lo nuevo que aparece se basa en J2EE. Pero “había vida” antes
de J2EE, y alguna gente ya había invertido (tiempo y/o dinero) en desarrollar sus servidores de
aplicaciones. Estas soluciones generalmente están basadas en lenguajes propios de script, y tienen
la ventaja de que su aprendizaje es muy rápido.
Dos son los ejemplos más claros, por un lado PHP y por otro Coldfusion de Allaire-Macromedia.
PHP (PHP, Hypertext Preprocessor) [88] es un lenguaje potente que permite crear de
manera fácil aplicaciones Web. Es código abierto, aunque la empresa Zend Technologies
ofrece productos complementarios.
Microsoft
Como casi siempre, Microsoft va por libre. Si se opta por su servidor de aplicaciones, se está
obligado a utilizar la plataforma Microsoft completa.
Las primeras soluciones que ofreció esta empresa se basaban en el servidor Web IIS (Internet
Information Server), el lenguaje de script ASP (Active Server Pages) y la tecnología de objetos
distribuidos COM (Component Object Model). La nueva apuesta se llama .NET e incluye
ASP+, C#, mientras deja de lado las anteriores inversiones de Microsoft en Java (y programas
relacionados como Microsoft Visual J++).
Todas estas soluciones siguen la política habitual de Microsoft que tiende a apoyarse en las
entrañas de Windows y obviar estándares abiertos, pero hay alguna excepción, por ejemplo en
la plataforma .NET se incluye soporte a SOAP.
No es fácil saber cuantos servidores hay en Internet o cual es su cuota de mercado relativa, pero es
más difícil todavía obtener un listado de todos los servidores Web distintos que existen. Diversos
factores apoyan estas afirmaciones, entre ellos:
El echo de que cualquier equipo que responda a peticiones HTTP puede ser considerado
un servidor Web. Por ejemplo hay impresoras, programas antivirus, etc. que permiten su
configuración a través de la red, por medio de una solución propietaria basada en HTTP.
10 CAPÍTULO 1. PANORÁMICA ACTUAL
...
A continuación se presentan algunos de los datos que Netcraft ha publicado referidos al mes de
julio de 2001. Por un lado, un listado (tabla 1.1) de los servidores Web más usados6 , y por otro un
gráfico (figura 1.3) que recoge la evolución en cuota de mercado.
Tabla 1.1: Servidores Web más usados en julio de 2001, según Netcraft.
Otra empresa que realiza estudios de mercado, Security Space [112], es bien conocida y goza de
cierto prestigio. Básicamente ofrece los mismos servicios que Netcraft, esto permite comparar, y
el hecho es que ambas obtienen resultados bastante semejantes.
A continuación se muestra una medición que Netcraft no proporciona pero Security Space sí,
se trata de la cuota de mercado entre servidores españoles (figura 1.4) en julio del 2001. Para
información actualizada puede visitarse el sitio http://www.securityspace.com/.
Figura 1.4: Cuota de mercado en España para servidores Web. Julio de 2001, Security Space.
En las siguientes secciones se hará una breve descripción comparativa de las características de
algunos servidores. Se analizan no sólo los que poseen una mayor cuota absoluta de mercado,
también se tienen en cuenta aquellos que han avanzado mucho en cortos espacios de tiempo o
algunos que simplemente se considera necesario mencionar:
Apache
BEA Weblogic
Enhydra
Jigsaw
Macromedia-Allaire ColdFusion
Microsoft IIS
NCSA HTTPd
12 CAPÍTULO 1. PANORÁMICA ACTUAL
Netscape-Sun iPlanet
Zeus
1.5.1 Apache
Apache [14] es indiscutiblemente el servidor Web más extendido en el mercado. Nacido como un
conjunto de parches al servidor NCSA HTTPd, actualmente se distribuye para explotación en sus
versiones 1.3.X. Estas proporcionan multitud de características:
Actualmente se encuentra en desarrollo la nueva versión, Apache 2.0, que introduce una serie de
cambios estructurales en el código fuente, entre ellos:
Soporte más potente a módulos añadidos mediante una nueva API, llamada APR (Apache
Portable Run-Time), que acompañará a las distribuciones de Apache y permitirá a los
programadores de módulos externos trabajar con ella aislándose de las características
dependientes de la plataforma (como por ejemplo la creación de procesos).
Puede encontrar más información sobre Apache y tecnologías relacionadas en el sitio Web del
Apache Software Foundation [20] http://www.apache.org.
BEA [24] es una empresa independiente que se ha lanzado al mundo de los servidores de
aplicaciones con un producto llamado Weblogic. Su ascenso ha sido muy rápido, consiguiendo
una importante implantación en el mercado debido, entre otros, a los siguientes aspectos:
Weblogic ofrece el mejor soporte Java del mercado (JSP, Java Messaging Services,
Enterprise JavaBeans, drivers nativos de BBDDs,etc.).
Puede colaborar con los servidores Web más utilizados (Apache, IIS, iPlanet, etc.).
1.5.3 Enhydra
Enhydra XMLC: una herramienta que genera plantillas de objetos Java a partir de
documentos HTML o XML. Estos objetos podrán ser luego modificados desde la aplicación
generando documentos dinámicos.
Enhydra JDDI: una tecnología que permite la inclusión de Java en páginas HTML. Es una
aproximación estructurada muy parecida a los JSP.
Enhydra DODS: una herramienta gráfica que permite hacer correspondencias entre objetos
y bases de datos relacionales (Informix, SQL server, Oracle, PostgreSQL, Sybase).
Existen versiones para Windows, Linux/Unix y no supone ningún coste ya que es código abierto.
Para obtener información más reciente sobre el producto, puede visitar los sitios Web de Enhydra
http://www.enhydra.org o de la empresa consultora Lutris Technologies, que patrocina el
proyecto, http://www.lutris.com.
1.5.4 Jigsaw
Jigsaw 2.X [58], es un desarrollo del World Wide Web Consortium (W3C). No es un servidor
para explotación empresarial (por ejemplo, no soporta hosts virtuales), sino una implementación
que demuestra nuevas tecnologías (por ejemplo Jigsaw es uno de los pocos servidores que
implementan totalmente el protocolo HTTP/1.1).
Robustez: el desarrollo ha llegado a ser más robusto que la mayoría de los servidores Web
del mercado.
Soporte WebDAV.
Las versiones anteriores a ColdFusion 4.0 no apostaban claramente por la plataforma J2EE, si no
que preferían apoyarse en tecnologías propietarias como el lenguaje CFML (ColdFusion Markup
Language) que puede ser embebido en páginas HTML.
En las últimas fechas ha aparecido la versión 5.0, fruto del cambio de orientación que se le ha dado
al producto tras la fusión de Allaire con Macromedia. Las principales novedades son el soporte
integrado a generación y manejo de datos en formato FLASH 10 y el intento de unirse a la corriente
de servidores compatibles con J2EE.
Actualmente existen versiones disponibles para Windows, Linux, Solaris y HP-UX, con precios
desde 260.000 pts. por servidor aproximadamente. Más información en la Web http://www.
macromedia.com/software/coldfusion/.
Internet Information Server (IIS) [66] es el servidor Web (y FTP) estrella de Microsoft. La versión
4.0 está completamente integrada con el Windows NT Server 4.0 (hasta el punto de usar la misma
BBDDs del usuarios que maneja el sistema) y con todo un conjunto de tecnologías que se incluyen
en el Windows NT 4.0 Option Pack, entre ellas:
Active Server Pages (ASP): lenguaje script que permite crear páginas HTML dinámicas.
...
En los nuevos Windows 2000, se incluye el IIS 5 que añade algunas mejoras como el soporte a
WebDAV (la base a los Web folders Microsoft), mayor velocidad de arranque y parada, etc.
IIS se ha hecho rápidamente con un importante sector del mercado (quizá por que se distribuye
como parte de los sistemas operativos Microsoft) y ha demostrado ser una solución muy cómoda
de instalar y configurar, capaz de funcionar a buen rendimiento.
Los principales problemas son la falta de una distribución para Unix (debido a que no sólo habría
que portar IIS, sino también el conjunto completo de tecnologías Microsoft con las que se integra),
los conocidos problemas de seguridad y su precio (desde 20.000 pts. aproximadamente11 ).
Aunque el desarrollo de NCSA HTTPd se detuvo en 1998, fue uno de los primeros servidores
Web de altas capacidades que se extendieron por Internet, y supuso la base para muchos productos
posteriores como Apache o Zeus.
NCSA HTTPd [79] tuvo un desarrollo muy dinámico y daba soporte inmediato a casi todas las
tecnologías relacionadas con la Web que iban apareciendo (HTTP/1.0, autentificación básica y
digest, CGI, etc.).
Es un servidor bastante confiable y eficiente, y podría utilizarse hoy en día12 , pero hay que tener
en cuenta que su desarrollo finalizó en 1998 y por tanto no da soporte a las nuevas tecnologías
como HTTP/1.1, SSL, ...
NCSA HTTPd es un producto gratuito cuya versión inicial trabajaba en entornos Unix/Linux,
aunque posteriormente fue portado al mundo Windows. Más información sobre este producto en
el sitio Web http://hoohoo.ncsa.uiuc.edu/.
iPlanet [50] es un servidor Web de altas prestaciones que ha surgido como fruto de la alianza entre
Netscape y Sun. Por un lado Netscape ha aportado su tecnología en servidores Web (derivada de
los Netscape Enterprise Web Servers) y Sun las implementaciones más actuales de su plataforma
J2EE (Servlets, JSP, una JVM nativa, JavaScript). Precisamente una de las mayores ventajas y a la
11 Es uno de los servidores comerciales más económicos, aunque para instalarlo también se necesita comprar todo el
resto de soluciones de Microsoft y esto aumenta el precio considerablemente.
12 De hecho según Netcraft aún existe una base importante de servidores usándolo (figura 1.3).
1.5. ALGUNOS EJEMPLOS DE SERVIDORES 17
1.5.9 Zeus
El servidor Zeus [133] es un servidor comercial, ofrecido por una compañía independiente
(Zeus Technology). Las primeras versiones estaban diseñadas para ofrecer una gran velocidad
de respuesta incluso ante grandes demandas de trabajo. En muchos aspectos mantenía la
compatibilidad con el servidor NCSA HTTPd, por ejemplo en la administración (soporta archivos
.htacess, etc.).
Las versiones posteriores siguen manejando eficientemente grandes volúmenes de trabajo, y
además añaden soporte a características avanzadas como clustering, escalabilidad en alojamiento
masivo de hosts virtuales, etc.
En el lado negativo, encontramos dos problemas: el precio (340.000 pts. aproximadamente), y su
disponibilidad sólo para plataformas Linux/Unix. Para más información puede dirigirse al sitio
Web de Zeus Technology http://www.zeustechnology.com/.
A modo de resumen se incluye una pequeña comparativa (tabla 1.2) de disponibilidad y precio para
los servidores presentados en esta sección. Para un análisis en profundidad de otras características
(soporte de tecnologías, etc.) puede consultarse alguno de los sitios Web de la siguiente lista:
1.6 Conclusión
La competencia es feroz en el campo de los servidores Web y de aplicaciones. Muchas son las
similitudes y algunas las diferencias entre los distintos productos. Elegir no siempre es fácil,
se deben tener en cuenta cuestiones como precio, soporte técnico, implantación en el mercado,
soporte a características específicas, escalabilidad, extensibilidad, rapidez en paso a explotación,
etc.
Para la mayor parte de los casos Apache puede ser una buena elección: tiene un buen precio,
soporta prácticamente todas las características imaginables, es fácilmente extensible mediante
módulos, está muy implantado en el mercado, etc. Pero el tema es complejo y una empresa quizá
esté más interesada en aspectos como el soporte técnico o la rapidez de desarrollo de aplicaciones
y paso a explotación.
Capítulo 2
El protocolo HTTP
2.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.1.1 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.1.2 Propiedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.2 Comunicación HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.2.1 Formato de mensajes . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.2.2 Peticiones (Request) HTTP, métodos de petición . . . . . . . . . . . . 22
2.2.3 Respuestas (Response) HTTP, códigos de estado . . . . . . . . . . . . 24
2.2.4 Líneas de encabezado HTTP . . . . . . . . . . . . . . . . . . . . . . . 25
2.2.5 Tipos MIME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.2.6 Esquema de una comunicación . . . . . . . . . . . . . . . . . . . . . . 29
2.3 Características avanzadas del protocolo . . . . . . . . . . . . . . . . . . . . 30
2.3.1 Negociación de contenido . . . . . . . . . . . . . . . . . . . . . . . . 30
2.3.2 Conexiones persistentes (Keep-Alive) . . . . . . . . . . . . . . . . . . 31
2.3.3 Servidores virtuales (Virtual hosts) . . . . . . . . . . . . . . . . . . . . 31
2.3.4 Autenticación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.3.5 Proxy-caché . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.4 Mejoras del servicio ofrecido a través de HTTP . . . . . . . . . . . . . . . . 33
2.1 Introducción
19
20 CAPÍTULO 2. EL PROTOCOLO HTTP
y distribuidos. Sobre HTTP suelen distribuirse documentos con formato HTML, aunque es un
protocolo independiente y lo suficientemente genérico como para ser utilizado en tareas más allá
de la simple distribución de hipertexto1 , por medio de extensiones en sus cabeceras (headers),
métodos de petición (request methods) y códigos de error.
En las siguientes secciones se hace un breve repaso sobre este protocolo. Información adicional
tanto de HTTP como de cualquier especificación relacionada con el Web, puede encontrarse en el
sitio del Consorcio Web [127].
2.1.1 Historia
HTTP/1.0, definido en el RFC2 1945 [97]. La mejora más destacada fue el uso de cabeceras
(headers) con metainformación de los datos que se transmiten. HTTP/1.0 no constituyó
un estándar, simplemente fue considerado como RFC informativo, de todas maneras se
implementó en una gran cantidad de servidores Web. Los problemas de HTTP/1.0 dieron
lugar a la aparición de nuevos RFCs que intentaban solucionarlos:
HTTP/1.1, fue definido en el RFC 2616 [107], integra en una sola especificación al
anterior HTTP/1.0 con los añadidos definidos en los RFCs 2109, 2145 y 2617 (indicados
anteriormente), además de otras mejoras. Las características más importantes de esta nueva
versión del protocolo son:
– Soporte a host virtuales basados en nombre. Para ello se obliga a que las peticiones
HTTP/1.1 incluyan un nuevo campo de encabezado llamado Host.
– Negociación de contenido. Clientes y servidores pueden, mediante intercambio de
cabeceras, negociar características comunes. Cuando el servidor ofrece la información
en diversas representaciones, el cliente puede seleccionar la que más le interesa. El
ejemplo típico es tener un servidor con la información en varios idiomas y un cliente
solicita el contenido según su idioma de preferencia.
– Nuevos métodos de petición (OPTIONS, TRACE, DELETE, PUT, CONNECT).
Actualmente HTTP/1.1 es una especificación estable que consigue el objetivo de ser un estándar
que soluciona las debilidades de versiones anteriores. El W3C ha dado por cerrada la actividad
de desarrollo de este protocolo, sin embargo se siguen realizando esfuerzos en temas relacionados
con HTTP. Ejemplos de nuevas líneas de investigación son Jigsaw (vea la sección 1.5.4 en la
página 14) y nuevos protocolos que ligan el HTTP con XML como SOAP (vea la sección 6.4 en la
página 96).
2.1.2 Propiedades
Destacar:
Localización universal: El protocolo usa referencias dadas por URI3 (Universal Resource
Identifier). Una URI es una manera de identificar de forma única recursos, este concepto
esta definido en el RFC 2396 [105].
Sin estado: de una petición a la siguiente no se conserva ningún tipo de información, cada
conexión es independiente y en principio no hay una memoria de conexiones del cliente.
Pero sólo en principio ya que se pueden utilizar trucos como las cookies5 o programas
externos CGI6 para implementar el concepto de sesión.
Representación de datos: HTTP usa tipos MIME (Multipart Internet Mail Extension) que
proporcionan una representación de los datos extensible y permiten que la comunicación
entre clientes y servidores esté abierta a negociación.
3 Posiblemente el tipo de URI más conocido sea el URL (Uniform Resource Locator) que identifica una localización.
También hay otras tipos como el URN (Uniform Resource Name) que identifica un nombre.
4 Pero también puede funcionar sobre otros protocolos confiables a nivel de transporte.
5 Sólo en las últimas versiones del protocolo y si los clientes las aceptan.
6 Que almacenen información de sesión en un fichero o BBDD.
22 CAPÍTULO 2. EL PROTOCOLO HTTP
Cada transacción HTTP es una comunicación distinta. En cada una de ellas se intercambian
mensajes. Según la especificación del protocolo, un mensaje es “la unidad básica de la
comunicación HTTP y consiste de una secuencia estructurada de octetos ordenados con formato
válido y transmitidos por la conexión.”
Hay dos tipos de mensajes, petición o solicitud (Request) y respuesta (Response), cada uno con su
estructura, pero a groso modo el formato de un mensaje genérico sería el siguiente:
El método le indica al servidor que hacer con el URI, por último la versión simplemente indica
el número de versión del protocolo que el cliente entiende. Una petición habitual utiliza el método
GET para pedirle al servidor que devuelva el URI solicitado:
De entre los tres parámetros el más importante es el método. HTTP/1.1 incorpora ocho métodos
(tabla 2.1), aunque sólo obliga a implementar GET y HEAD, siendo todos los demás opcionales.
En cualquier caso, los servidores que implementen alguno de los métodos adicionales, deben
atenerse a la especificación de los mismos. Existe también la posibilidad de implementar métodos
extendidos, a los que la especificación no pone ningún límite.
En HTTP/1.0 sólo se especificaban tres métodos, GET, POST y HEAD. Estos son, con diferencia,
los tres más extendidos y utilizados, por ello se comentan un poco más ampliamente.
2.2. COMUNICACIÓN HTTP 23
Método Significado
GET Devuelve el recurso identificado en la URL pedida.
HEAD Funciona como el GET, pero sin que el servidor devuelva
el cuerpo del mensaje. Es decir, sólo se devuelve la
información de cabecera.
POST Indica al servidor que se prepare para recibir información
del cliente. Suele usarse para enviar información desde
formularios.
PUT Envía el recurso identificado en la URL desde el cliente
hacia el servidor.
OPTIONS Pide información sobre las características de
comunicación proporcionadas por el servidor. Le permite
al cliente negociar los parámetros de comunicación.
TRACE Inicia un ciclo de mensajes de petición. Se usa para
depuración y permite al cliente ver lo que el servidor
recibe en el otro lado.
DELETE Solicita al servidor que borre el recurso identificado con
el URL.
CONNECT Este método se reserva para uso con proxys. Permitirá
que un proxy pueda dinámicamente convertirse en un
túnel. Por ejemplo para comunicaciones con SSL.
El método GET
Se usa para pedir un documento específico, por ejemplo, cuando se sigue un enlace de una página
Web, se está usando el método GET.
El método HEAD
menos información. Es generalmente usada por clientes que usan caché para ver si el documento
ha cambiado desde la última vez que accedieron a él. Si no cambió, la copia local puede usarse
nuevamente; de otra forma, la versión actualizada debe recuperarse con GET.
Este método puede ser usado para testear la validez, accesibilidad y reciente modificación de
enlaces, sin tener que descargar los documentos en sí.
El método POST
Es usado para transferir datos del cliente al servidor. Los datos del cuerpo de la solicitud se
enviarán al URI especificado. Este URI será una referencia a un manipulador que procesará los
datos de alguna forma, típicamente será un programa CGI.
Las respuestas al método POST no serán guardadas en caché salvo que en la propia respuesta se
incluyan encabezados de control de caché adecuados.
La sintaxis de una respuesta HTTP es, en su formato más básico una línea de estado y tiene una
sintaxis como la siguiente:
Incluye la versión de protocolo, un código de éxito o error y el texto explicativo al código anterior.
Un ejemplo bastante común es:
HTTP/1.1 200 Ok
Los posibles códigos de estado se identifican con números de tres cifras y se clasifican en cinco
grupos:
2. Números del estilo 2XX que indican que se completó satisfactoriamente la solicitud del
cliente.
3. Números del estilo 3XX que indican que la solicitud fue redirigida.
4. Números del estilo 4XX que indican un error en la solicitud del cliente.
5. Números del estilo 5XX que indican un error en el lado del servidor.
Código Significado
200 OK La solicitud del cliente fue satisfactoria y el servidor ha
devuelto la información solicitada.
204 No Content El cuerpo de la respuesta no tiene contenido. Esto puede
indicar, por ejemplo, un problema con un CGI que no
devuelve datos.
301 Moved Permanently El URI solicitado no está disponible en el servidor. Ha
sido movido a otra ubicación. Las solicitudes futuras
deberán hacerse a esa ubicación.
400 Bad Request Hay un error de sintaxis en la solicitud del cliente. Por
ejemplo mandar una solicitud indicando que el cliente
soporta HTTP/1.1 y no enviar el encabezado de Host.
404 Not Found Este es junto con el 200 OK, el código más habitual.
Indica que el documento solicitado no está disponible,
probablemente el URI haya sido mal escrito.
500 Internal Server Error Este mensaje indica que algo ha ido mal en el servidor,
casi siempre tiene que ver con problemas en programas
CGI.
Dentro de un mensaje HTTP los encabezados son muy importantes. Definen en gran parte la
información que se intercambia entre clientes y servidores dándole flexibilidad al protocolo. Estas
líneas permiten que se envíe información descriptiva en la propia transacción, permitiendo cosas
como la autenticación o identificación de usuarios.
La sintaxis de una línea simple de encabezado es la siguiente:
Nombre-de-Encabezado: Valor
Los encabezados pueden clasificarse en grupos, para cada uno de ellos se incluye una tabla con
los más importantes7 :
Generales: manejan información que puede ser utilizada tanto por clientes como por servidores,
ya que se aplican a una sesión completa de comunicación (tabla 2.3).
De solicitud: los utiliza el cliente para enviar (en sus peticiones de servicio) información
adicional al servidor (tabla 2.4).
De respuesta: los utiliza el servidor para enviar información adicional al cliente (tabla 2.5).
Encabezado Significado
Cache-Control Permite especificar distintas directivas para controlar la caché, tanto
del cliente como de servidores proxy.
Connection Especifica opciones de la conexión de red.
Date Envía una fecha en la representación estándar definida en el
protocolo.
Pragma Transporta información no HTTP a un receptor que sea capaz de
entenderla.
Trailer Indica que ciertas cabeceras HTTP pueden encontrarse en el final de
un mensaje con múltiples partes (multipart).
Upgrade Información sobre protocolos adicionales soportados por el cliente.
Via Añadidos al mensaje de proxys o gateways para indicar que pasó por
ellos.
Warning Información adicional sobre un estado o transformación de un
documento que podría no estar reflejado en el cuerpo del mismo. Por
ejemplo, transformaciones que se hacen en servidores caché.
Encabezado Significado
Accept Listado de tipos
MIME que el cliente soporta. Hay otros encabezados relacionados
como Accept-Charset, Accept-Encoding, Accept-Language.
Authorization Indica las credenciales de acceso a un recurso que presenta el usuario.
Expect Indica que comportamiento del servidor necesita el cliente.
From Dirección de correo que controla el cliente (navegador).
Host Nombre o IP del host desde donde se conecta el cliente.
If-Match Un cliente que tiene recursos en cache puede verificar si están
actualizados incluyendo este encabezado. Hay otros encabezados
que también tienen que ver con la caché. If-Modified-Since,
If-None-Match, If-Range, If-Unmodified-Since.
Max-Forwards Cuantas veces la petición del cliente puede ser reenviada por proxys.
Proxy- Indica las credenciales de acceso a un proxy que presenta el usuario.
Authoritation
Range Indica que porción de recurso (rango de bytes) recuperar.
Referer Es el URI del recurso desde donde la petición se ha realizado
(generalmente por provenir de un enlace HTML).
TE Que codificaciones de transferencia está dispuesto a recibir el cliente.
User-Agent Información sobre el agente de usuario (generalmente navegador)
que origina la petición.
Encabezado Significado
Accept-Ranges Indica las unidades en las que el servidor acepta peticiones de rangos.
Age Tiempo estimado por el servidor para cumplir la petición.
Etag Valor actual de la etiqueta de entidad solicitada.
Location Contiene un URI al que el cliente debe ser redireccionado.
Proxy- Indica el esquema de autentificación que acepta un servidor proxy.
Authenticate
Retry-After Cuanto tiempo se espera que el servicio no esté disponible.
Server Información del software servidor.
Vary Indica que un recurso tiene múltiples fuentes que pueden variar de
acuerdo a la lista de encabezados de petición.
WWW- Indica que el recurso solicitado necesita de credenciales de
Authenticate autorización.
Encabezado Significado
Allow Informa al cliente de los métodos válidos asociados con el recurso.
Content-Type Indica el tipo MIME de los contenidos. Hay otros encabezados muy
relacionados
como Content-Language, Content-Length, Content-Location,
Content-MD5, Content-Range o Content-Encoding.
Expires Indica la fecha y hora en la que el recurso se considerará obsoleto.
Last-Modified Indica la fecha y hora en la que el recurso original fue modificado
por última vez.
Nuevas extensiones: existe un grupo de trabajo que intenta estandarizar la forma en que las
nuevas extensiones al protocolo HTTP deben ser reflejadas en los encabezados HTTP.
Los tipos MIME (Multipart Internet Mail Extension) fueron definidos en los RFC 2045 [99],
2046 [100], 2047 [101], 2048 [102], 2049 [103] y otros. Son una forma abierta y extensible de
representar el contenido de los datos. Como su nombre indica fueron en un primer momento
utilizados para extender las características del correo electrónico, hoy su uso se ha generalizado
también puede llamárseles IMT (Internet Media Types).
Los MIME se componen de un tipo y un subtipo, como ejemplo, un archivo que es un documento
de texto y que ha sido escrito en HTML, tendrá como tipo MIME:
text/html
El registro de los tipos MIME los controla la IANA (Internet Asigned Numbers Authority) según
lo especificado en el RFC 2048 [102], y en su sitio Web podemos obtener la lista completa y
actualizada de los tipos registrados. Es importante el registro de tipos MIME, esto asegura que
dos tipos de contenido distintos no acaban con el mismo nombre. El prefijo especial x- queda
reservado para tipos experimentales (desplegados sin que haya terminado el proceso de registro)
o tipos de uso interno de organizaciones, por ejemplo:
image/x-fwf
El protocolo HTTP usa tipos MIME en sus encabezados, por ejemplo para:
Informar al cliente el tipo de datos que está recibiendo del servidor. Esto se hace con el
encabezado Content-Type. Por ejemplo, un navegador típico puede manejar los datos de
tres maneras distintas según el tipo MIME indicado en Content-Type:
Permitir la negociación de contenido. El cliente, en su petición incluye los tipos MIME que
acepta. Por ejemplo, un navegador puede soportar documentos de tipo application/zip,
lo indicará con el encabezado HTTP:
Allow: application/zip
2.2. COMUNICACIÓN HTTP 29
Encapsular una o más entidades dentro del cuerpo de mensaje, mediante los tipos MIME
multipart (definidos en el RFC 2046 [100]). Quizá el ejemplo más conocido sea el tipo:
multipart/form-data
El tipo multipart/form-data ha sido definido en el RFC 1867 [96] para encapsular los
datos de un formulario en su envío hacia el servidor mediante el método POST.
2. El cliente envía una petición (vea la sección 2.2.2) indicando el método, URI a la que
pretende acceder y versión del protocolo. Además se pueden enviar diversos encabezados
HTTP (tabla 2.4). Un ejemplo simple de petición8 es el siguiente:
3. El servidor responde con una línea de estado (vea la sección 2.2.3), que incluye la versión
de protocolo, un código de éxito o error y el texto explicativo al código. Además se
enviarán varios encabezados HTTP adicionales (tabla 2.5). Finalmente, dentro del cuerpo
del mensaje aparecerán los datos solicitados. Un ejemplo simple de respuesta es el siguiente:
175
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
...
Una forma de conocer más a fondo el esquema de comunicación es utilizar un cliente de telnet para
conectarse a un servidor HTTP y enviar “a mano” los comandos necesarios. El servidor responderá
en texto plano. Por ejemplo, desde un shell Linux puede teclearse: telnet localhost 80 para
comenzar la comunicación.
8 En una petición donde se usa el método es GET, el cuerpo del mensaje no se utiliza. Para otros métodos como
A continuación se analizan de una manera un poco más profunda una serie de características
avanzadas del protocolo HTTP:
Negociación de contenido.
Autenticación.
Proxy-caché.
Un recurso se define como una entidad que puede ser identificada por un URL. Suele ser un
fichero o directorio. Un recurso dado puede aparecer en varias representaciones o variantes.
Las diferentes representaciones suelen identificarse por la metainformación proporcionada por
los tipos MIME. Por ejemplo, un recurso fichero, puede tener varias representaciones9
fichero.html, fichero.pdf, ...
Negociación transparente: es una forma que combina las dos anteriores. Ocurre cuando existe
una caché intermedia. Esta será capaz de usar la negociación dirigida por el cliente (siendo
la caché el cliente) hacia el servidor origen. A su vez actuará de cara al cliente realizando
una selección dirigida por el servidor (siendo la caché el servidor).
9 No es simplemente una negociación de formato, por que distintas representaciones pueden tener el mismo tipo
Antes de que esta característica existiese, se necesitaba una conexión TCP separada para cada
petición. Cuando un documento utilizaba enlaces a otros ficheros externos, la transmisión era
extremadamente ineficiente.
Se abren menos conexiones TCP, lo que ahora recursos (CPU, memoria, etc.).
Con los clientes que soportan HTTP/1.0, las conexiones Keep-Alive sólo pueden ser utilizadas
cuando son específicamente pedidas por el cliente, además están limitadas a documentos en los
que se conoce la longitud de antemano10 .
Para clientes con soporte a HTTP/1.1, las conexiones son persistentes por defecto y existen
métodos de envío de documentos de longitud no conocida.
El término servidor virtual (Virtual Host) hace referencia al hecho de simular más de un servidor
ejecutándose en una sola máquina. Pese a que en un mismo equipo estarán alojados diversos
servidores, cada uno de ellos será independiente y contendrá su propios recursos.
En las primeras versiones de HTTP cada host virtual necesita una dirección IP distinta, esta era
la única manera que permitía distinguir entre ellos. Esta dependencia de la disponibilidad de
direcciones IP puede limitar el número de servidores virtuales que se pueden ejecutar.
Es de fácil configuración y uso. Siempre es más cómodo usar nombres que números.
La principal desventaja es el soporte del protocolo por parte del cliente. Clientes antiguos, con
soporte al protocolo HTTP anterior a HTTP/1.0 pueden causar problemas.
2.3.4 Autenticación
Existe otra posibilidad que se apoya en técnicas criptográficas. La autenticación de acceso por
medio de resumen (Digest Access Authentication) verifica que ambas partes de la comunicación
conocen una clave secreta compartida. Se basa en el paradigma de reto-respuesta y utiliza el
algoritmo MD5 para generar el resumen (hash). Al contrario que la comunicación básica, puede
ser utilizada sin enviar la clave en claro por la red.
2.3.5 Proxy-caché
Proxy
Un servidor proxy actúa como intermediario entre clientes y servidores Web. Generalmente el
proxy suele ubicarse en una red local y se usa para controlar el tráfico hacia redes externas como
Internet. De esta manera un sólo equipo tiene acceso a la red externa y actúa como una versión
muy básica de cortafuegos (firewall) con varias utilidades:
Centralizar el acceso a una red pública (Internet) desde otra privada (Intranet).
Filtrar las URLs externas a las que tienen acceso los usuarios internos.
Mayor vulnerabilidad a fallos, al estar todo el acceso centralizado en un sólo equipo. Puede
solucionarse añadiendo varios proxys.
Reducción de la velocidad de acceso, al tener que pasar todas las peticiones por un servidor
proxy intermedio.
2.4. MEJORAS DEL SERVICIO OFRECIDO A TRAVÉS DE HTTP 33
La especificación insta a que los desarrolladores de proxys HTTP pongan especial cuidado en la
implementación de las propiedades de la cabecera Connection y la característica Keep-Alive.
Caché
Un servidor caché aparte de funcionar como proxy, es capaz de almacenar copias de las URLs
que han pasado a través de él. Cuando una solicitud llega al servidor proxy, este consulta si
el documento seleccionado forma parte de su copia local, si es así lo devuelve. Esta forma de
funcionar incrementa drásticamente el rendimiento en el acceso a Internet. En Intranets de tamaño
medio/grande a veces también se utilizan jerarquías de servidores proxys-cachés, para incrementar
el rendimiento.
El principal problema del uso de cachés es la gran cantidad de contenidos que no son susceptibles
de ser almacenados. Por ejemplo: los recursos que dependen de cookies, de la negociación de
contenidos según preferencias de cliente, de la autenticación de usuario, etc.
El protocolo HTTP/1.1 incluye diversas características para optimizar el trabajo de las cachés.
Hay dos métodos básicos de control de caché:
Eliminar la necesidad de enviar peticiones completas a cada momento por medio de diversas
cabeceras para validar la caché (If-Range, If-Match, etc.)
Sobre el funcionamiento básico de HTTP que se ha definido en las secciones anteriores, han
surgido multitud de tecnologías. Estas permiten desde la gestión remota de recursos en el
servidor (WebDav) o el establecimiento de una plataforma de objetos distribuidos (SOAP), hasta
la generación de contenido dinámico. Algunas de ellas integran los últimos avances en campos
clásicos, por ejemplo pueden utilizar XML para la representación de datos o proporcionar acceso
cómodo a las bases de datos más potentes. Se analizarán estas nuevas posibilidades en capítulos
posteriores.
34 CAPÍTULO 2. EL PROTOCOLO HTTP
Capítulo 3
3.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.2 CGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.2.1 La especificación CGI . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.2.2 Datos de entrada al programa CGI . . . . . . . . . . . . . . . . . . . . 37
3.2.3 Proceso de los datos de entrada . . . . . . . . . . . . . . . . . . . . . 39
3.2.4 Datos de salida del script CGI . . . . . . . . . . . . . . . . . . . . . . 41
3.2.5 Un ejemplo de script muy simple . . . . . . . . . . . . . . . . . . . . 42
3.3 Servlets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.3.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.3.2 Esquema de ejecución de un Servlet . . . . . . . . . . . . . . . . . . . 44
3.3.3 Resumen del API Java Servlet . . . . . . . . . . . . . . . . . . . . . . 45
3.3.4 Esquema general de un Servlet . . . . . . . . . . . . . . . . . . . . . . 45
3.3.5 Un ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.4 Otras opciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.1 Introducción
Una de las extensiones que más ha hecho avanzar al Web es la capacidad del servidor para
ejecutar programas externos. Con ello se gana en dinamismo, dando la posibilidad de crear
páginas interactivas según el contexto de cada petición. Un usuario puede introducir datos que
son añadidos a la petición, estos datos adicionales son recuperados por un programa externo que
creará la respuesta en función de ellos. Ejemplos en los que se necesita interactividad son:
Cuando la página Web debe estar basada en datos enviados por el usuario. El caso más
común son las páginas resultado de los motores de búsqueda.
35
36 CAPÍTULO 3. EJECUCIÓN DE PROGRAMAS EXTERNOS
Cuando los contenidos cambian frecuentemente. Como por ejemplo, páginas de periódicos
digitales, información del tiempo, ...
Cualquier página con acceso a bases de datos. El típico ejemplo, son las tiendas virtuales.
En este capítulo se comentan de manera concisa varias tecnologías que permiten la ejecución
de programas externos (CGI, Servlets, etc.). Las explicaciones se centran principalmente en la
especificación CGI, que fue la primera solución y es la más comúnmente implementada en los
servidores actuales.
3.2 CGI
La interface CGI [39] (Common Gateway Interface, o en español, Interface de pasarela común)
es la especificación de un protocolo que permite al servidor Web comunicarse con programas o
scripts1 externos.
Los programas CGI trabajan en el servidor Web y pueden implementarse utilizando diferentes
lenguajes de programación (COBOL, C, Perl, etc.) siempre y cuando respeten las convenciones
definidas en la especificación.
Para que el usuario recupere un documento dinámico HTML a través de CGI, generalmente se
sigue la siguiente secuencia básica (figura 3.1).
1 Generalmente un programa es código compilado y un script interpretado. En esta memoria no se atiende a esta
diferencia y abusando del lenguaje se utilizan ambos términos con el mismo significado.
3.2. CGI 37
(a) Determina el método HTTP para el envío3 según el valor del atributo del formulario
method.
(b) Identifica los campos del formulario.
(c) Construye el conjunto de datos como pares: nombre del control / valor asociado.
(d) El conjunto de datos se codifica según el valor seleccionado en el atributo del
formulario enctype.
2. El navegador realiza una solicitud HTTP al servidor Web, enviando el conjunto de datos del
formulario para que sea procesado por el programa especificado en el atributo del formulario
action.
5. El servidor recibe el resultado de proceso CGI y prepara una respuesta HTTP válida
(anexando alguna cabecera) que se le envía al cliente.
El servidor Web se encarga de proporcionar varios datos de entrada al programa CGI, entre ellos:
La propia entrada que se incluye en la solicitud HTTP. Generalmente habrá sido introducida
desde formularios Web.
Algunos detalles sobre cómo el servidor Web transfiere los datos al programa CGI dependen de si
el navegador utiliza el método GET o POST:
Método GET
Cuando se utiliza el método GET se pueden recibir los datos de entrada de dos formas:
A través de argumentos en la línea de órdenes. La petición será todo lo que sigue al signo
de interrogación en una URL. Por ejemplo para la siguiente URL:
http://www.ei.universidad.es/cgi-bin/test-cgi?uno+dos+tres
http://www.ei.uvigo.es/cgi-bin/test-cgi?entrada=uno+dos+tres
el programa CGI podrá conocer sus datos de entrada consultando la variable QUERY_STRING:
QUERY_STRING:entrada=uno+dos+tres
El valor de la variable de entorno estará disponible durante todo el tiempo de vida del script
CGI.
Método POST
Cuando se utiliza el método POST en un formulario HTML, el servidor Web envía los datos a la
entrada estándar. En otras palabras, un programa CGI debe leer la entrada estándar (stdin) para
aceptar los datos enviados.
La variable de entorno CONTENT_LENGTH indica el número total de bytes a leer. El tipo MIME
en el que están codificados los datos de entrada estará almacenado en la variable de entorno
CONTENT_TYPE. A no ser que se especifique un método de codificación diferente a través de la
etiqueta <form enctype=”...” ...>, esta variable tendrá el valor application/x-www-form-
urlencoded.
3.2. CGI 39
Variables de entorno
Tanto si se usa el método GET como el POST, el servidor utiliza variables de entorno (tabla 3.1)
para transferir información útil al programa CGI. Una variable de entorno no es nada más que un
nombre asociado a una cadena. Por ejemplo, en un sistema UNIX, puede definirse una variable
EDITOR desde la línea de órdenes con:
EDITOR=/usr/local/bin/emacs
La cadena situada a la derecha del signo igual es el valor de la variable, el significado de la misma
depende del programa que la utiliza. Por ejemplo, y por convenio, la variable de entorno EDITOR
contiene la ruta hasta el editor de texto predeterminado.
Para ver el valor de una variable de entorno en una shell UNIX (el intérprete de órdenes de UNIX),
se puede usar el comando echo seguido del nombre de la variable con un símbolo del dólar ($)
prefijo. Así, para obtener el valor de la variable EDITOR, teclee el siguiente comando:
# echo $EDITOR
/usr/local/bin/emacs
Los programas CGI pueden obtener y establecer el valor de las variables de entorno a través de
ciertas funciones implementadas. Por lo tanto, este es un mecanismo apropiado para transferir
información entre el servidor Web y los programas CGI.
Independientemente de la tarea que ejecute el programa CGI, la primera tarea a realizar suele
ser interpretar los datos que llegan codificados. Un script CGI recibe la información de manera
distinta dependiendo del método de la solicitud (GET o POST). Sabiendo esto se puede diseñar el
programa para que analice la entrada adecuadamente. Los pasos básicos serían los siguientes:
2. Si se trata del método GET, se usa el valor de la variable de entorno QUERY_STRING como
entrada. Se comprueba también cualquier nueva información sobre la ruta en la variable de
entorno PATH_INFO.
3. Si se trata del método POST, se obtiene la longitud de la entrada (en número de bytes)
a partir de la variable de entorno CONTENT_LENGTH. Después se lee ese número de bytes
desde de la entrada estándar.
Variable Descripción
AUTH_TYPE Nombre del método de verificación para validar el
usuario.
CONTENT_LENGTH Número de bytes de datos enviados (con el método
POST).
CONTENT_TYPE El tipo MIME en el que están codificados los datos de
entrada (con el método POST).
GATEWAY_INTERFACE Nombre y número de versión de la interfaz de pasarela
(normalmente CGI/1.1).
HTTP_ACCEPT Tipos MIME que acepta el navegador Web (como
image.gif, image/x-xbitmap, image/jpeg y */*).
HTTP_REFERER URL del documento desde el que parte la solicitud.
HTTP_USER_AGENT Nombre y número de versión del navegador Web que
realiza la solicitud.
PATH_INFO Cualquier otro nombre de ruta que sigue al nombre del
programa CGI en el URL.
PATH_TRANSLATED PATH_INFO anexado al directorio raíz del documento
del servidor.
QUERY_STRING Todo lo que sigue al signo de interrogación (?) en el URL
(así recibe el programa CGI los datos desde un formulario
HTML que utiliza el método GET).
REMOTE_ADDR Dirección IP del sistema desde el que parte la solicitud.
REMOTE_HOST Nombre del host del sistema que realiza la solicitud (este
es el sistema donde el usuario ejecuta el navegador Web).
REMOTE_USER Nombre de verificación del usuario (si el programa CGI
está protegido con una contraseña, éste es el nombre del
usuario con el que se accede al programa).
REQUEST_METHOD Método usado para la transmisión de datos (GET o
POST).
SCRIPT_NAME Ruta del script CGI que se ejecutará.
SERVER_NAME Nombre del host o dirección IP del sistema donde se
ejecuta el servidor Web.
SERVER_PORT Número de puerto en el que se recibe la solicitud (por
defecto 80).
SERVER_PROTOCOL Nombre y número de versión del protocolo usado para la
solicitud (por ejemplo, HTTP/1.0).
SERVER_SOFTWARE Nombre y número de versión del software del servidor
Web (como Apache/1.3.20).
(a) Extraer los pares nombre=valor dividiendo la entrada a la altura del signo &.
(b) En cada par nombre=valor, convertir todas las secuencias %xx en caracteres ASCII
(aquí, xx representa un par de dígitos hexadecimales).
(c) En cada par nombre=valor, convertir todos los signos más + en espacios.
5. Guardar los pares nombre=valor que representen valores de campos para su posterior uso.
Después de descodificar la entrada y encontrar los valores de todos los campos, ya se puede
trabajar con ellos para conseguir que el script CGI haga lo que debe.
Content-type: le indica al servidor el tipo MIME del contenido que se está devolviendo. Por
ejemplo, lo más habitual es devolver una página Web:
Content-type: text/html
Content-type: image-gif
Location: se le indica al servidor que no debe devolver contenido, sólo hacer una solicitud
de redirección a otra URL. Por ejemplo:
Location: /novedades/index.htm
Status: le proporciona al servidor una línea de estado HTTP (vea la sección 2.2.3 en la
página 24) para que sea enviada al cliente:
Es importante recordar que la última línea de un bloque de cabecera debe terminar con una línea
de espacios en blanco. Después de marcar el final de la cabecera puede empezar la salida del
programa CGI. El servidor acepta la salida del script, anexa algunos encabezados HTTP, y envía
el resultado al navegador.
Por convenio a todo script cuyo nombre empiece por nph se le permite comunicarse directamente
con el cliente (los encabezados HTTP que produce no los analiza ni cambia el servidor). Este tipo
de scripts permiten que el servidor vaya enviando datos al cliente según el CGI los va escribiendo
en la salida estándar. Los scripts no nph usan una memoria intermedia en su paso de datos al
servidor, de manera que hasta que no acaba el proceso del script, el servidor no envía resultado
alguno.
Por ejemplo en un sistema que ejecute un servidor Apache, existen algunos scripts de prueba que
permiten observar las variables de entorno. A continuación se muestra uno de ellos codificado en
el propio lenguaje shell de Unix. El listado, aunque corto, conforma un script CGI completo que
mantiene la estructura básica mínima:
#!/bin/sh
3.3 Servlets
3.3.1 Introducción
Los Servlets son pequeños programas Java que producen como salida contenido para la Web.
Son la respuesta de la tecnología Java a los problemas de la programación CGI. Se enumeran a
continuación las soluciones aportadas por los Servlets frente a los CGIs:
Eficiencia: un CGI tradicional, se arranca como un nuevo proceso para cada solicitud HTTP.
Esta sobrecarga puede ser inaceptable cuando el script CGI se ejecuta frecuentemente. Con
los Servlets, la máquina Virtual Java (JVM) permanece corriendo concurrentemente con el
servidor Web, y es capaz de manejar cada nueva petición con un hilo (thread) Java. Los hilos
tienen peso ligero6 , frente a los pesados procesos del sistema operativo como por ejemplo
los scripts CGI.
Para aclarar el concepto, puede pensarse en que pasaría si en un momento se tienen varias
peticiones (por ejemplo X) simultáneas para el mismo programa CGI. En este caso el código
del script se cargará X veces en memoria. Sin embargo, con los Servlets, habrá X threads
pero sólo una copia de la clase Servlet.
Portable: al estar escritos en Java, los Servlets siguen un API bien estandarizado. Un
Servlet debería ser capaz de funcionar de la misma manera en diferentes plataformas
hardware/software (por ejemplo un Servlet que corre en una plataforma Microsoft Windows
2000 con Internet Information Server, debe funcionar exactamente igual en un Linux con
Apache + Tomcat). Los Servlets son soportados por la mayoría de los servidores Web, bien
directamente (por ejemplo Jigsaw) o mediante un módulo adicional (por ejemplo Apache).
La portabilidad de programas CGI, aunque posible, es menos evidente.
6 EL termino “peso” se asocia con la sobrecarga que se provoca en el sistema.
44 CAPÍTULO 3. EJECUCIÓN DE PROGRAMAS EXTERNOS
Conveniencia: los Servlets tienen una gran infraestructura apoyada en la estrategia comercial de
Sun. Existen multitud de clases ya implementadas (decodificación de datos de formularios
HTML, manejo de cabeceras HTTP, cookies, sesiones, etc.). Aunque existen librerías para
hacer todas estas cosas en la mayoría de los lenguajes habituales para manejo de CGIs, su
forma de uso, en muchos casos, no es tan fácil.
Potencia: los Servlets Java permiten hacer muchas cosas que son más difíciles con CGIs
normales. Por ejemplo pueden compartir datos entre ellos (cada petición es un hilo Java,
y todos ellos tienen el mismo “padre”), simplificar el seguimiento de sesiones, utilizar
automáticamente una caché de cálculos anteriores, ...
Los Servlets se ejecutan dentro de un contenedor de Servlets (Servlets container), que no es más
que una JVM (Java Virtual Machine) que funciona complementando al servidor Web (figura 3.2).
1. Al igual que en scripts CGI, el usuario cumplimenta los campos de un formulario HTML y
pulsa el botón de envío. El navegador prepara los datos para su envío y con ellos realiza una
solicitud HTTP al servidor Web.
3.3. SERVLETS 45
3. El Servlet se ejecuta y genera una respuesta que es enviada de nuevo al servidor Web (el
hilo muere).
4. El servidor recibe el resultado del Servlet y se encarga de enviar la respuesta, para ello
prepara una respuesta HTTP válida (anexando alguna cabecera) que será lo que se envía al
cliente.
El API propuesta por SUN para su tecnología de Servlets es muy amplia, en esta sección se tratan
de resumir las características principales de la última versión (API Java Servlet 2.2) [23]:
import java.io.*;
import javax.servlet.*;
7 Internet Service Provider, o en español, Proveedor de servicios Internet.
8 Existen muchos buenos libros sobre el tema [5] [2]
46 CAPÍTULO 3. EJECUCIÓN DE PROGRAMAS EXTERNOS
import javax.servlet.http.*;
out.println("...");
}
}
En cualquier programa en Java se deben importar las clases necesarias. En un Servlet como
mínimo se utilizan los siguientes paquetes:
Cualquier Servlet debería extender la clase HttpServlet y sobreescribir los métodos doGet y/o
doPost, dependiendo de si los datos están siendo enviados mediante GET y/o POST. Además
estos métodos lanzan excepciones y es necesario incluirlas en la declaración. doGet y doPost
toman dos argumentos:
Un último comentario, en un Servlet sencillo casi todo el contenido son sentencias println que
generan la página deseada.
3.3. SERVLETS 47
3.3.5 Un ejemplo
¿Cuáles son los pasos necesarios para poner un Servlet en explotación?. Se enumeran basándose
en un Servlet de ejemplo que procesa peticiones GET para leer y mostrar los datos de un
formulario9 :
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
out.println("</body></html>");
}
}
Listado 3.3 Recuperar y presentar los datos de un formulario con un Servlet. Formulario.java.
9 Las peticiones GET son las más habituales que recibe el servidor (cuando se escribe una URL en la línea de
Al igual que un programa CGI, una de las primeras cosas que debe hacer un Servlet es descodificar
los datos de entrada. La clase request proporciona el método getParameter para obtener los
valores de los campos de un formulario. A modo de ejemplo se utiliza el siguiente formulario:
<HTML>
<HEAD>
<TITLE>Un formulario simple</TITLE>
</HEAD>
<BODY>
<FORM ACTION="/examples/servlet/Formulario">
N tarjeta: <INPUT TYPE="TEXT" NAME="ntarjeta"><BR>
Banco: <INPUT TYPE="TEXT" NAME="banco">
<INPUT TYPE="SUBMIT" VALUE="Enviar" NAME="Enviar">
</FORM>
</BODY>
</HTML>
Para ofrecer la salida en HTML el Servlet debe además incluir código para:
Informar al navegador de que le está devolviendo código HTML. Se usa un método especial
setContentType para este propósito.
CGI es la interface estándar que permite la ejecución de programas externos, prácticamente todos
los servidores del mercado lo soportan. El principal problema es la eficiencia, un CGI tradicional
se arranca como un nuevo proceso (con toda su sobrecarga asociada) para cada solicitud HTTP.
Los Servlets, discutidos en la sección anterior, son quizá la solución más utilizada hoy en día,
aunque no es la única. A continuación se enumeran otras posibilidades:
FastCGI: [41] es una extensión al CGI independiente del lenguaje y escalable que proporciona
un mejor rendimiento. Básicamente FastCGI permite que un programa CGI ligeramente
modificado se cargue una sola vez y permanezca residente en memoria para atender a las
siguientes peticiones.
3.4. OTRAS OPCIONES 49
Existen implementaciones disponibles para los principales servidores Web del mercado
(Apache, Netscape, IIS, Zeus) y bibliotecas para su utilización con los principales lenguajes
(C, C++, Perl, Java, Python, etc.). Más información en http://www.fastcgi.com.
ISAPI/NSAPI: [64] [80] son APIs propietarias que se proponen como alternativas de ejecución
más rápida que CGI. Permiten la creación de módulos binarios que son cargados
dinámicamente por el servidor Web cuando se inicia, se mantienen residentes en memoria y
no provocan la sobrecarga de iniciar procesos separados.
ISAPI se incluyen en los servidores de Microsoft (IIS, etc.). Los programas escritos usando
la interfaz ISAPI son compilados como bibliotecas DLL (Dynamic Link Library). Más
información en http://www.microsoft.com.
NSAPI es la API propuesta por Netscape para extender la funcionalidad de sus servidores.
Más información en http://www.netscape.com.
mod_perl: [86] la ejecución de scripts Perl es lenta, tanto por ser un lenguaje interpretado como
por la necesidad de arrancar un proceso nuevo para cada petición. mod_perl es un módulo
de Apache que elimina estos problemas, para ello:
Enlaza las bibliotecas de ejecución de Perl dentro del servidor Web, dándole a cada
instancia de Apache su propio intérprete Perl. De esta manera se elimina la necesidad
de lanzar un nuevo interprete para cada petición, por que se tiene uno ejecutándose
permanentemente con el propio servidor.
mod_perl sólo está disponible para Apache y puede obtenerse su código fuente en cualquier
mirror del CPAN, por ejemplo http://www.perl.com/CPAN/modules/by-module/
CPAN/.
50 CAPÍTULO 3. EJECUCIÓN DE PROGRAMAS EXTERNOS
Capítulo 4
4.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.2 SSI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.2.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.2.2 XSSI de Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.2.3 Hotwired XSSI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.2.4 JSSI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.2.5 Un ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.3 JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.3.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.3.2 El lenguaje JSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.3.3 Un ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.4 PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.4.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.4.2 El lenguaje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.4.3 Potencia de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.4.4 Un ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
4.5 ASP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
4.5.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
4.5.2 Componentes ASP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
4.5.3 Implementaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.5.4 Un ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.6 Otras posibilidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.7 Conclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
51
52 CAPÍTULO 4. CÓDIGO EMBEBIDO EN HTML
4.1 Introducción
Todas las aproximaciones al código embebido funcionan de manera similar (figura 4.1):
2. El servidor se da cuenta de que el recurso solicitado es una página con código embebido,
por lo que le transfiere el control al manejador correspondiente, enviándole el archivo con
etiquetas embebidas necesario.
1 Escrito en algún lenguaje que no es HTML. Existen múltiples posibilidades Java, Perl, PHP, etc.
4.2. SSI 53
3. El manejador recibe la petición, compila (ASP, JSP, PHP, etc.) o interpreta (SSI, PHP, etc.)
el código, y devuelve el resultado.
Las alternativas de código embebido que se discuten en este capítulo, son ejecutadas en el servidor.
Un cliente solamente recibe el resultado de esta ejecución, sin tener la posibilidad de determinar
que código lo ha producido.
También existen algunas alternativas de código embebido en el lado cliente, la más conocida es
Client Side Javascript [80], pero queda fuera del alcance del proyecto. Si necesita más información
sobre este tema puede visitar la página de manuales de Netscape http://developer.netscape.
com/docs/manuals/.
4.2 SSI
4.2.1 Introducción
SSI (Server Side Includes) es la opción más básica para usar código embebido y ofrece un modo
sencillo de obtener contenido dinámico en la Web.
Para funciones simples como incluir fechas de actualización de documentos, SSI es probablemente
la opción más eficiente; de todas formas no es lo suficientemente potente para reemplazar
un lenguaje de programación, que puede ofrecer características avanzadas como por ejemplo
funciones de acceso a BBDD.
La implementación inicial de SSI se hizo en el servidor NCSA HTTPd, que definía directivas con
la siguiente sintaxis:
Se puede observar que no son más que comentarios HTML, de forma que si por algún motivo
falla el parser2 SSI, el cliente las ignora. Casi todas las directivas tienen al menos un par
atributo=”valor”, si bien en algunas no es necesario. Hay que tener en cuenta dos consideraciones
importantes para no dar lugar a posibles confusiones del parser:
XSSI (eXtended Server Side Includes) de Apache: se puede decir que es la implementación
estándar de facto.
XSSI (eXtended Server Side Includes) implementa las directivas básicas que ya tenía el servidor
NCSA HTTPd (config, include, echo, fsize, flastmod, exec), así como algunas características
añadidas. A continuación se realiza una descripción de las mismas.
Directivas básicas
La directiva <!--#config -->: Controla distintos aspectos del "parsing". Acepta tres posibles
atributos:
errmsg: el valor es el mensaje que se enviará como resultado si al procesar una directiva,
esta devuelve un error. Por ejemplo cuando se quiere incluir un fichero que no está en el
lugar indicado se produce un error.
sizefmt: el valor configura el formato en el que se muestra el tamaño de los ficheros, y será
uno de estos tres (bytes|Kb|Mb). Esta configuración sólo tiene efecto en la directiva <!-
-#fsize -->.
timefmt: el valor es una cadena de formato (al estilo de la función C strftime()) utilizada
al mostrar fechas y horas.
Ejemplo: Personalizar el mensaje de error, indicar que los tamaños de los ficheros deben aparecer
en KiloBytes y definir un formato de fechas del estilo día/mes/año - hora:minuto:segundo:
Variable Contenido
DATE_GMT Fecha actual del sistema según el meridiano de Greenwich.
DATE_LOCAL Fecha actual del sistema en tiempo local.
DOCUMENT_NAME Nombre del fichero SSI pedido por el usuario.
DOCUMENT_URI Camino URL del documento pedido por el usuario.
LAST_MODIFIED Última fecha de modificación del documento SSI pedido por el
usuario.
La directiva <!--#exec -->: Esta directiva permite realizar llamadas a un comando de shell o a
un programa CGI. Es potencialmente peligrosa y puede deshabilitarse completamente utilizando
la opción Option IncludesNOEXEC dentro de la configuración de Apache. Sus atributos válidos
son:
cgi: el valor especifica una URL relativa a la ruta de los scripts CGI (si comienza con /), o
bien relativa al documento actual (si no comienza con /). Si el script devuelve una cabecera
Location esta es traducida a un enlace HTML.
Existe un posible riesgo de seguridad, sería posible que ejecutar ficheros CGI que en realidad
no deberían tener permiso.3
Ejemplo: Ejecuta un comando de shell que devuelve información sobre la máquina actual.
file: el valor es la ruta relativa desde el documento actual hasta el fichero (no se admite ../).
3 Se aconseja usar <!--#include virtual="..."--> en vez de <!--#exec cgi="..."-->, para asegurar que sólo se ejecutan
scripts CGI estándar a los que se puede acceder desde una URL aceptada por Apache.
4 Este parámetro está sujeto a la configuración dada por la directiva <!--#config sizefmt="..."-->
56 CAPÍTULO 4. CÓDIGO EMBEBIDO EN HTML
file: el valor es la ruta desde el documento actual hasta el fichero (no se admite ../).
La directiva <!--#include -->: Esta directiva inserta el texto de otro fichero (o el resultado de
la ejecución de un programa) en el documento que está siendo analizado. Los ficheros incluidos
están sujetos a las restricciones de acceso habituales (por ejemplo con la directiva de Apache
Option IncludesNOEXEC).
Una característica importante es que se permite anidamiento, es decir, un fichero SSI puede incluir
otro fichero con directivas SSI y así sucesivamente. Dos son los atributos posibles:
file: el valor es la ruta relativa al directorio que contiene el documento que se está analizando
actualmente. No es posible acceder a rutas que comiencen por “/” o por “../”
virtual: el valor es una URL relativa al documento que está siendo analizado. Esta URL no
puede contener nada más que un camino (ni protocolo “http://, etc.”, ni nombres de host) y
opcionalmente un QUERY_STRING (si comienza con “/” será relativo al DocumentRoot).
Este es el modo preferido de utilizar la directiva <!--#include -->, ya que hacen el código
lo más independiente de la plataforma posible al usar URLs y no rutas.
Ejemplo:
<!--#printenv -->
La directiva <!--#set -->: Establece el valor de una variable, creándola si no existe. Sus
atributos son:
Sustitución de variables
Flujo de control
SSI implementa una forma muy básica de flujo de control, la sintaxis de la única expresión
permitida es:
Sintaxis Semántica
string Verdadero si la cadena no está vacía.
string1 = string2 Verdadero si las cadenas son iguales.
string1 != string2 Verdadero si las cadenas son distintas.
string1 < string2 Verdadero si string1 es alfabéticamente menor que
string2.
string1 <= string2 Verdadero si string1 es alfabéticamente menor o
igual que string2.
string1 > string2 Verdadero si string1 es alfabéticamente mayor que
string2.
string1 >= string2 Verdadero si string1 es alfabéticamente mayor o
igual que string2.
condición1 && condición2 AND lógico, verdadero si ambas condiciones son
ciertas.
condición1 || condición2 OR lógico, verdadero si alguna condición es cierta.
Las condiciones de test son casi siempre operaciones de comparación sobre cadenas, aunque si la
string2 tiene la forma /string/ entonces es comparada como una expresión regular al estilo del
comando egrep de Unix (vea el apéndice C en la página 373).
Ejemplo: Testear la variable de entorno que se refiere a la dirección del remitente y según el
resultado mostrar un texto y el valor de una variable definida anteriormente.
Hotwired XSSI [45] es una implementación que proporciona una versión extendida al XSSI que
se incluye en Apache. Las características añadidas más importantes son:
Añade una nueva directiva <!--#parse_form ... --> que es capaz de analizar una
entrada desde el cliente codificada según el método GET (vea la sección 2.2.2 en la página
23) y transformarla en en un conjunto de variables listas para ser usadas por otras directivas
SSI.
4.3. JSP 59
Añade una nueva directiva <!--#random ... --> que es capaz de generar un número
aleatorio y asignárselo a una variable, que al igual que antes puede ser luego utilizada en
otras expresiones SSI.
Extiende la directiva <!--#echo ... --> de manera que se pueden asignar cadenas de
código HTML a variables y luego elegir si se desea que echo las imprima como tales o
escapadas (aparecen como un texto más de la página Web).
4.2.4 JSSI
JSSI es un Servlet que proporciona parsing SSI sobre archivos con extensión jhtml. Tiene algunas
limitaciones y también características adicionales:
1. Posibilidad de incluir en una página HTML la salida dinámica de otros Servlets mediante la
etiqueta <servlet> ... </servlet>.
2. Es compatible con sesiones mediante una directiva que reescribe URLs (no necesita cookies
en el cliente).
3. Incluye directivas (experimentales) para comprimir la salida que devuelve el servidor si esta
excede la longitud máxima que acepta el navegador.
4.2.5 Un ejemplo
Un buen ejemplo que utiliza todas las directivas, se muestra como parte del ejemplo final de este
proyecto (vea la sección 22.2.2 en la página 313).
4.3 JSP
4.3.1 Introducción
Frente a los Servlets que no son más que pequeños programas Java que producen como salida
contenido para la Web, existe una tecnología de código embebido basada en Java llamada JSP
(Java Server Pages). Los JSP combinan HTML con fragmentos de Java para producir páginas
Web dinámicas. Este nuevo enfoque permite al programador un manejo más cómodo de las
6 El objetivo del proyecto Jakarta es proporcionar soluciones servidor de calidad comercial basadas en plataforma
partes estáticas en HTML, mezclando código Java cuando sea necesario para generar el contenido
dinámico. Incluso existen etiquetas que interaccionan con objetos Java del servidor, sin necesidad
de aparezca código fuente en la página.
Los JSP no están completamente aparte de los Servlets, de hecho ambas tecnologías se
complementan. Por un lado los JSP se traducen a Servlets antes de su ejecución y por otro los
Servlets puede usar plantillas JSP.
Funcionamiento
Cuando un cliente pide una página JSP del sitio Web, la página es inicialmente pasada al motor
de JSP, el cual compila la página convirtiéndola en Servlet7 , la ejecuta dentro del contenedor de
Servlets y devuelve el contenido de los resultados al cliente.
Características
Destacar:
Mejor rendimiento: heredado de los beneficios que proporcionaba el contenedor Servlet (vea la
sección 3.3 en la página 43).
División del trabajo: los diseñadores maquetan y crean el código de visualización HTML,
mientras los programadores se centran en la lógica del programa.
Extensiones de etiqueta: la última versión del API permite a los programadores implementar
etiquetas JSP propias que engloban áreas de funcionalidad. De esta forma se puede
mantener lo más separada posible la presentación y la lógica de negocio.
JSP ofrece un nuevo conjunto de etiquetas que pueden incluirse en páginas HTML8 :
1. Directivas.
2. Elementos de script.
7 La
compilación de la página sólo tiene lugar la primera vez que se invoca al JSP.
8 Unadescripción exhaustiva se aparta del objetivo de este proyecto, para más información puede consultarse algún
libro sobre el tema [2].
4.3. JSP 61
3. Acciones.
4. Comentarios.
Directivas
Contienen instrucciones para el contenedor JSP con información acerca de la página en la que se
encuentran. No producen ninguna salida visible. Su sintaxis general es:
Pueden especificarse diversos atributos, que indican desde en que lenguaje se escribe el
código de la página (por ejemplo language="java") hasta si la página maneja contenidos
de error (isErrorPage="true|false").
Elementos de script
Encapsulan código Java que formará parte del Servlet resultado de la conversión de la página JSP.
Existen tres tipos de elementos de script:
Declaraciones: una declaración JSP será una definición de variables y métodos a nivel de
clase que son usadas en la página. Un bloque de declaraciones típico sería:
Scripts JSP (scriptlets): son bloques de código Java, aparecerán dentro de la etiqueta:
Objeto Descripción
request Encapsula una petición del cliente, normalmente es una subclase de
la case HttpServletRequest.
response Es la página JSP de respuesta, subclase de HttpServletResponse.
pageContext Para permitir que se pueda compilar una página JSP, los atributos y
los objetos implícitos a la misma deben ser accesibles a través del
API.
session El objeto de sesión HTTP asociado a la petición.
application Lo que devuelve el Servlet cuando se llama a
getServletConfig().getContext().
out El objeto que representa la salida de texto por pantalla.
config El objeto ServletConfig de la página.
page Es la forma que tiene la página para referirse a si misma. Se usa
como alternativa al objeto this.
exception Es una subclase Throwable que es pasada a la página que maneja los
errores.
Desde el código Java embebido puede accederse a cualquier variable o Bean que haya sido
declarado. También hay algunos objetos implícitos disponibles desde el entorno del Servlet
(tabla 4.3).
Expresiones: JSP puede manejar expresiones9 , para ello se usa la siguiente etiqueta:
Cualquier cosa que aparezca dentro de la etiqueta será evaluado, convertido a cadena de
manera automática y mostrado en pantalla como parte del resultado.
Acciones
Forward: transfiere el control desde una página JSP realizando una redirección a otra URL.
<jsp:forward page="otraURL.html"/>
Comentarios
Comentarios JSP: son propios de la página JSP original, están ahí como ayuda al
programador. La sintaxis es la siguiente:
Comentarios del lenguaje de script: permiten realizar comentarios dentro de los scriptlets.
En este caso la sintaxis es:
4.3.3 Un ejemplo
Uno de las operaciones más realizadas desde cualquier lenguaje embebido es leer los datos de un
formulario y presentarlos en una página Web, a continuación se presenta un pequeño código de
ejemplo:
<html>
<head>
<title>Ver datos enviados desde un formulario</title>
</head>
<body>
64 CAPÍTULO 4. CÓDIGO EMBEBIDO EN HTML
</body>
</html>
4.4 PHP
4.4.1 Introducción
PHP (PHP: Hypertext Preprocessor) [88] es un lenguaje interpretado de alto nivel embebido en
páginas HTML y ejecutado en el servidor. Es uno de los lenguajes embebidos más ampliamente
utilizados ya que puede integrarse con prácticamente todos los servidores Web del mercado, posee
un conjunto de opciones muy amplio, buen rendimiento y sobre todo conectividad con un gran
número de bases de datos.
PHP fue concebido a finales de 1994 por un programador independiente (Rasmus Lerdorf) para
uso personal. La primera versión estuvo disponible al público a principios de 1995. Se le llamó
herramientas para paginas Web personales (Personal Home Page Tools). Utilizaba un analizador
sintáctico simple y proporcionaba una serie de utilidades comunes (libro de visitas, contador, etc.).
organizado. El analizador sintáctico fue totalmente reescrito (y mucho código en PHP/FI también)
y se establecieron las bases para PHP versión 3.
La versión actual es PHP 4.X y tras el acuerdo con la empresa Zend Technologies Ltd. (http:
//www.zend.com) ya no es completamente código libre. La llegada de Zend Technologies
[132] ha revolucionado el funcionamiento interno de PHP, mediante una gran cantidad de nuevas
herramientas. Algunas se distribuyen de forma libre:
Zend Optimizer: nueva herramienta capaz de interpretar el código PHP y optimizarlo hasta
doblar su rendimiento.
Zend Compiler: un componente que funciona al estilo del javac de Java, es decir, es
capaz de compilar el código PHP en código de bytes más adecuado para el despliegue de
aplicaciones.
...
Funcionamiento
Cuando un cliente pide una página PHP esta es inicialmente pasada al motor PHP. Este puede
actuar de distintas formas antes de devolver el resultado al servidor Web:
Si se dispone de la herramienta Zend compiler, las páginas pueden ser también compiladas
al estilo de JSP o ASP, para su posterior ejecución.
4.4.2 El lenguaje
Esta sección sólo pretende ser una pequeña introducción a las características del lenguaje, puede
ampliarse información en el manual [88] on-line en la página Web de PHP http://www.php.net.
Sintaxis básica
Como en todo lenguaje, en PHP hay una serie de cuestiones de sintaxis que es fundamental conocer
antes de comenzar a programar:
66 CAPÍTULO 4. CÓDIGO EMBEBIDO EN HTML
Etiquetas PHP: hay cuatro formas de marcar que se está escribiendo código PHP dentro de
un documento HTML.
<?
echo "Hola"; // Comentario tipo c++ para una línea
/* Comentario multilínea
segunda línea de comentario
...
*/
Tipos de datos
– array
– entero
– real
4.4. PHP 67
– objeto
– cadena
Variables
En PHP las variables se representan como un signo de dólar seguido por el nombre de la variable.
Este nombre de la variable es sensible a minúsculas y mayúsculas. Es importante recordar
que el carácter “punto” (.) no es válido en una variable, y será tomado como el operador de
concatenación. En PHP 4 pueden asignarse variables por valor o referencia, algunos ejemplos
son:
<?
# A la variable se le asigna el "valor" Hola
$variable = "Hola";
# Referencia a $variable vía $variable2
$variable2 = &$variable;
?>
Variables predefinidas: existen una gran cantidad de variables predefinidas a las que PHP
puede acceder10 , entre ellas variables de Apache, variables de entorno, variables específicas
de PHP (para manejo de cookies, datos de formularios, etc.).
Constantes
Se pueden definir constantes usando la función define(), también existen constantes predefinidas
(por ejemplo TRUE y FALSE). Como se pude esperar, las constantes no pueden ser redefinidas
más tarde con otro valor.
10 Una buena manera de ver la mayoría de estas variables es utilizando la función phpinfo().
68 CAPÍTULO 4. CÓDIGO EMBEBIDO EN HTML
<?php
define("MICONSTANTE", "Ejemplo versión 1.0");
echo CONSTANTE; //Presenta el valor de la constante
?>
Expresiones
En PHP una definición simple de una expresión es “cualquier cosa que tiene un valor”. Esto es
literalmente así, en PHP casi todo son expresiones:
Expresiones de comparación.
...
Operadores
Existen tres tipos principales de operadores; aritméticos, lógicos y relacionales. Se puede decir que
a grandes rasgos coinciden con los del lenguaje C. Se presentan a continuación algunos operadores
que suelen ser bastante cómodos:
(?) este es el operador condicional ternario, que permite expresar una condición de manera
muy abreviada.
Estructuras de control
Un archivo PHP se compone de una serie de sentencias, podemos controlar la lógica del programa
con diversas combinaciones de estructuras de control:
Bucles: se permiten varios tipos de bucles como while , do...while, for y foreach.
Además también existen las instrucciones break y continue que proporcionan un control
más avanzado de las iteraciones.
Funciones
PHP es un lenguaje modular que permite al usuario declarar nuevas funciones. Una función se
define con la siguiente sintaxis:
<?php
?>
El cuerpo de una función está delimitado entre llaves y puede contener cualquier instrucción
válida de PHP. No es posible la sobrecarga de funciones, y tampoco redefinir u ocultar funciones
previamente declaradas. PHP 4 soporta un número variable de parámetros, paso de parámetros
por valor o referencia, y valores devueltos de cualquier tipo (arrays, objetos, etc.).
Clases y objetos
Una clase es una colección de variables y de funciones que acceden a esas variables. Un ejemplo
de clase que define una lista muy sencilla es:
70 CAPÍTULO 4. CÓDIGO EMBEBIDO EN HTML
<?php
class Lista {
var $items; // Array de items en la lista
Una vez definida la clase se creará una variable del tipo deseado con el operador new. Tal y como
indica la teoría clásica de objetos, las clases en PHP pueden declararse como extensiones de otras
clases, si bien la herencia múltiple no es soportada.
Entre funciones de una clase, la variable $this hace referencia al propio objeto. Debe usarse esta
variable para acceder a una variable o método del objeto actual.
Una función se convierte en constructor cuando tiene el mismo nombre que la clase.
PHP puede hacer cualquier cosa que se pueda hacer con un script CGI, como procesar la
información de formularios, generar páginas con contenidos dinámicos, o mandar y recibir
cookies. Además ofrece características avanzadas muy interesantes como el soporte a diversos
protocolos como el propio HTTP, protocolos de correo (IMAP, POP3, etc.), de news (NNTP),
interfaces con COM y CORBA ...
Pero quizá lo más destacado de PHP es que ofrece soporte a una gran cantidad de bases de datos.
Esta amplia cobertura es una de las características que han hecho a muchos desarrolladores utilizar
PHP, sobre todo en los últimos años, donde se ha producido el boom del comercio electrónico y
con él la necesidad de almacenar ingentes cantidades de datos. En la actualidad se ofrece soporte
a:
4.4. PHP 71
4.4.4 Un ejemplo
Una de las características más potentes de PHP es su forma de manejar los formularios HTML. A
continuación se muestra un código básico para leer los datos de un formulario y presentarlos en
una página Web:
<html>
<head>
<title>Ver datos enviados desde un formulario</title>
</head>
<body>
<b>Número de tarjeta</b>:
<? print($ntarjeta); ?>
<br><b>Banco</b>:
<? print($banco); ?>
</body>
</html>
4.5 ASP
4.5.1 Introducción
Las páginas ASP (Active Server Pages) [10] son otro buen ejemplo de código script embebido
en archivos HTML. Esta tecnología ha sido creada por Microsoft y conforma uno de los pilares
básicos de los servidores Web de esta empresa (Internet Information Server, Personal Web Server).
El núcleo de ASP es un manejador externo que funciona como extensión del servidor11 . El
servidor Web asociará los archivos de tipo .asp con el programa manejador, de esta manera cuando
una página ASP es solicitada, la petición se le pasa al programa que interpreta y compila los scripts
embebidos antes de ejecutarlos12 .
Funcionamiento
Ficheros ASP: tienen la extensión .asp, básicamente son archivos de texto que contienen
combinaciones de HTML e instrucciones ASP13. Las instrucciones ASP se encierran entre
etiquetas especiales o también en secciones especiales de código script:
Objetos: hay una serie de objetos que se pueden utilizar directamente (sin instanciarlos) en las
páginas ASP. Se encargan de encapsular la información relacionada con el protocolo HTTP
(peticiones, respuestas, sesiones mediante cookies, etc.), facilitando su acceso desde el
lenguaje. Estos objetos integrados se presentan en una tabla (tabla 4.4).
11 En Windows, se implementa como una extensión ISAPI (asp.dll)
12 El proceso de compilar los scripts sólo se hace la primera vez.
13 Las instrucciones ASP pueden escribirse en distintos lenguajes, por defecto VBScript, aunque también se permite
Jscript y PerlScript.
4.5. ASP 73
Objeto Significado
Application Se utiliza para almacenar información referente a una aplicación
dada, que puede ser compartida entre los usuarios de la misma.
Request Provee el acceso a la información que acompaña a las peticiones
HTTP (método, valores de formularios, etc.).
Response Controla la información de la respuesta HTTP que es enviada al
usuario (páginas HTML, información de redirección, valores de
cookies, etc.).
Server Encapsula el acceso a métodos y propiedades del servidor
(codificación URL, creación de instancias de objetos ActiveX, etc.).
Session HTTP es un protocolo sin estados, ASP implementa en este objeto
el soporte que permite almacenar información para crear sesiones de
usuario.
ObjectContext Se utiliza para confirmar o anular una transacción iniciada para una
secuencia de instrucciones.
Componentes ActiveX: encapsulan tareas relacionadas con distintos aspectos (envío de correo,
etc.). Quizá los más destacados sean los objetos ADO (Active Data Objects), que facilitan
el acceso al sistema de ficheros, bases de datos, ...
4.5.3 Implementaciones
Microsoft, como creador de esta tecnología, tiene implementaciones de la misma disponibles para
sus servidores Web. Estas implementaciones están fuertemente ligadas a las plataformas Windows.
Existen varios intentos de portar la tecnología ASP a otras plataformas y servidores. Se pueden
distinguir las opciones de código abierto de la comerciales.
Apache:ASP: [13] se trata de un módulo Perl que permite programar ASP, aunque sólo en
PerlScript. Más información en http://www.apache-asp.org/.
OpenASP: [83] intenta dar soporte a todos los lenguajes de script soportados por el ASP original
(VBScript, JScript), además de PerlScript, para hacer un poco más accesible el salto
hacia plataformas Linux/Unix de usuarios acostumbrados a tecnología Microsoft. Más
información es http://www.activescripting.org.
InstantASP: [49] es un producto comercial que necesita un servidor Web que soporte Servlets
para poder ejecutarse. Más información en http://www.halcyonsoft.com/.
74 CAPÍTULO 4. CÓDIGO EMBEBIDO EN HTML
Chili!Soft: [27] es quizá el producto que alardea de ser más compatible con el ASP original, se
integra con algunos de los servidores Web más conocidos como Apache, iPlanet, Zeus, etc,
y ofrece compatibilidad con:
Microsoft Active Server Pages 2.0 escritas en VBScript 3.2 o JScript 3.2: cualquier
aplicación que utilice estos estándares en un servidor IIS, debería funcionar
exactamente igual sobre un servidor con las extensiones que proporciona Chili!Soft.
Microsoft Active Data Objects (ADO) 2.0 : proporciona un amplio soporte a bases de
datos a través de objetos ActiveX, incluso ODBC.
Internationalization: Multi-byte.
Además ofrece valores añadidos como objetos propios de acceso a datos, conectividad con
Java y CORBA, herramientas de administración, ...
En la parte negativa se puede resaltar que necesita bastantes recursos (256 megas de
RAM y 200 megas de disco duro), y por su puesto, su precio. Más información en
http://www.chilisoft.com.
4.5.4 Un ejemplo
Quizá uno de los ejemplos más sencillos de código ASP es el que permite acceder a los valores de
los campos que fueron introducidos en un formulario:
<html>
<head>
<title>Ver datos enviados desde un formulario</title>
</head>
<body>
<!-- El formulario sería de este estilo -->
<h1>Formulario</h1>
<form method="POST" action="formulario.asp">
N tarjeta: <input type="text" name="ntarjeta"></br>
Banco: <input type="text" name="banco"></br>
<input type="submit" value="Enviar" name="Enviar">
</form>
response.write unvalor&"="&request.form(unvalor)(i)&"<br>"
next%>
</body>
</html>
Existen una gran cantidad de proyectos que permiten embeber código fuente de distintos lenguajes
en páginas HTML. De hecho para los lenguajes más conocidos (como Perl o C) se puede elegir
entre varias implementaciones distintas. A modo de ejemplo se pueden citar los siguientes:
SSJS (Server Side JavaScript): [80] JavaScript es un lenguaje script orientado a objetos
desarrollado por Netscape. Existen dos versiones: una orientada a ser ejecutada en el
navegador Client Side JavaScript, y otra para utilizarse en el lado servidor Server Side
JavaScript. Aunque ambas comparten la misma funcionalidad básica (objetos, arrays, etc.),
la versión del lado servidor ofrece características avanzadas como:
– Gestión de sesiones.
– Tecnología LiveWire de acceso a BBDDs.
– Tecnología LiveConnect para comunicación entre Javascript y Java.
– Acceso a servicios CORBA.
– ...
Perl embebido: existen distintos módulos de Perl [87] [68] que permiten introducir
instrucciones en plantillas HTML. La idea se deriva de otras tecnologías muy conocidas
como JSP y el funcionamiento es muy parecido. Pueden ejecutarse en cualquier servidor
que soporte CGI con PERL, aunque por eficiencia se recomienda su ejecución dentro del
marco de un servidor Apache con mod_perl. Hay dos implementaciones importantes:
C/C++: [25] [26] existen multitud de implementaciones que permiten embeber C o C++
en HTML, la mayoría son módulos para Apache. Algunos ejemplos pueden encontrarse
en http://linux.medyatext.com.tr/apache/cint.html o http://d-000631-pp.
dhcp.fnal.gov/~onuchin/Carrot/.
Haskell, Prolog, Python, etc.: también tienen sus versiones embebidas que funcionan como
módulos de Apache, más información en http://modules.apache.org.
4.7 Conclusión
Embeber algún lenguaje de programación dentro del código HTML es una forma muy cómoda y
rápida de trabajar. En un entorno que cambia a la velocidad del Web, esto es algo importante. En
este capítulo se presentan algunas de las opciones disponibles. ¿Cuál es la mejor?, la respuesta es
depende de los criterios de comparación. Hoy en día PHP, JSP y ASP ofrecen un gran abanico
de funcionalidades, mucha documentación, integración con varios servidores Web y una amplia
implantación en el mercado.
Pero también es posible elegir alguna de las opciones “minoritarias”, por ejemplo habrá personas
a las que no les interesa aprender un nuevo lenguaje de programación y prefieran utilizar alguno
de los que ya conocen como C, Prolog, etc.
Si la decisión se complica siempre es posible añadir nuevos criterios que faciliten la criba
(precio, disponibilidad para el sistema operativo, etc.), o simplemente instalar todas las opciones
interesantes (ya que no son excluyentes) y dejar la elección para otro momento.
Capítulo 5
HTTP seguro
5.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.2 HTTP + SSL = HTTPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.2.1 Introducción al protocolo SSL . . . . . . . . . . . . . . . . . . . . . . 78
5.2.2 Características de SSL v3 . . . . . . . . . . . . . . . . . . . . . . . . 79
5.2.3 Cuestiones de rendimiento . . . . . . . . . . . . . . . . . . . . . . . . 80
5.2.4 Pasos del algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.2.5 Implementaciones de SSL . . . . . . . . . . . . . . . . . . . . . . . . 82
5.2.6 HTTPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.3 S-HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.3.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.3.2 El protocolo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.3.3 Implementaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.1 Introducción
1. Poner de manifiesto los fallos en la seguridad realizando sin permiso algún cambio en el
sitio Web de una organización. Por ejemplo, fue muy sonado el caso de la página Web de
La Moncloa (http://www.lamoncloa.es). Estos ataques, aparte de la mala imagen no
suelen tener otras consecuencias.
77
78 CAPÍTULO 5. HTTP SEGURO
2. Robar información sensible, como pueden ser los datos personales o información de tarjetas
de crédito. Como ejemplo, los fallos de seguridad en Hotmail (http://www.hotmail.com)
que daban acceso a las bases de datos de usuarios.
Aún considerando que es muy complejo garantizar la seguridad en una red como Internet, se
ha trabajado en varios protocolos que hacen un poco más segura la transferencia de datos sobre
HTTP. Lo más utilizado es HTTP sobre una capa de sockets seguros con SSL, aunque existen
otras aproximaciones como S-HTTP. Ambas se apoyan en técnicas criptográficas (encriptación
simétrica y asimétrica, firmas y certificados digitales, etc.). Una explicación en profundidad de
estas técnicas se aparta del objetivo de este proyecto1 . En las siguientes secciones simplemente se
dará un vistazo general a HTTP sobre SSL y a S-HTTP.
El protocolo SSL (Secure Sockets Layer) es un protocolo de comunicación que se ubica en la pila
de protocolos sobre TCP/IP2 . SSL proporciona servicios de comunicación “segura”3 entre cliente
y servidor, como por ejemplo autenticación (usando certificados), integridad (mediante firmas
digitales), y privacidad (mediante encriptación).
Hay varias versiones del protocolo, la primera, SSL v1 fue creada por Netscape Corporation
y nunca tuvo uso público. La versión 2 ya formaba parte del las primeras versiones del
navegador Netscape Navigator. Actualmente la versión que incluyen todos los navegadores de
última generación es SSL v3. El nuevo paso se llama TLS (Transport Layer Security), este
nuevo protocolo ha sido diseñado por el IETF (Internet Engeneering Task Force) [47] como una
ampliación de SSL v3 con mejoras en la forma de realizar la autenticación. Por último y muy
relacionado con el anterior ha surgido WTLS (Wireless Transport Layer Security) que implementa
un TLS para comunicaciones inalámbricas.
1 Los interesados en el tema pueden consultar algún buen libro, como por ejemplo Cryptography and network
a conexión.
3 “Segura”, entre comillas, porque nada está completamente seguro en la red. En esta memoria se abusa del término
Autenticación con base en certificados: se utilizan certificados X.509 para la autenticación. Los
certificados de servidores son obligatorios, mientras que los de cliente son opcionales.
Independiente de protocolos: aunque SSL se diseño para funcionar sobre TCP/IP, puede hacerlo
sobre cualquier protocolo confiable orientado a conexiones (por ejemplo X.25). En cambio
no funcionará sobre un protocolo no confiable, como por ejemplo UDP (User Datagram
Protocol).
Soporte a algoritmos heterogéneos: aunque depende de las implementaciones, SSL suele dar
soporte a diversos algoritmos:
de integridad.
80 CAPÍTULO 5. HTTP SEGURO
Soporte de compresión: SSL permite comprimir los datos del usuario antes de ser encriptados
mediante múltiples algoritmos de compresión.
Compatibilidad hacia atrás con SSL v2: los servidores de SSL v3 pueden recibir conexiones
de clientes SSL v2 y manejar el mensaje de manera automática.
En el lado cliente, si se utiliza un ordenador relativamente rápido (Pemtium II) y una conexión de
red relativamente lenta6 , el tiempo invertido para operaciones de SSL es insignificante.
En el lado servidor, si lo habitual es atender varias peticiones de HTTP sobre SSL en cortos
espacios de tiempo, hay que pensar en obtener un equipo suficientemente rápido en las operaciones
de clave pública. Muchas organizaciones transmiten la mayor parte de su información en forma
clara y utilizan SSL solo para encriptar información realmente sensible. Esto reduce la necesidad
de potencia del servidor pero también es menos seguro, ya que durante su trayecto del cliente al
servidor, el HTML no encriptado puede ser modificado por algún atacante.
Se muestra a continuación un resumen del esquema básico del algoritmo, y una figura (figura
5.1) que ubica los distintos protocolos relacionados en una torre general. Si se necesita más
información puede consultarse la especificación de SSL [116].
2. Se inicia la fase de saludo (protocolo handshake). El cliente envía un mensaje que contiene
el número de versión del protocolo SSL que utiliza, los métodos criptográficos soportados
y un flujo de bytes aleatorio.
3. El servidor responde al saludo, envía el número de versión del protocolo SSL que utiliza, el
método criptográfico seleccionado, un identificador de sesión y un flujo de bytes aleatorios.
5. Opcionalmente puede ser que el servidor requiera la autentificación por parte del cliente
(que debe disponer de su propio certificado X.509).
7. El cliente genera una clave secreta previa que se enviada encriptada con la clave pública del
servidor (conocida gracias al certificado).
9. El cliente y el servidor usan la clave secreta previa para determinar una clave maestra
(secreta) de sesión.
10. Se intercambian mensajes para especificar los métodos de cifrado (protocolo de cipher
method). Deberá llegarse a un acuerdo sobre que algoritmos utilizar para intercambio de
claves, cifrado para transferencia de datos y compendio de mensajes. Además se indica
que todos los mensajes posteriores deberán utilizar la clave maestra de sesión.
11. Finaliza la fase de saludo. Se intercambia un mensaje encriptado con la clave de sesión que
indica el comienzo de la comunicación “segura”. A partir de este momento se utiliza el
register protocol que encapsula los datos y los transfiere a través del protocolo de la capa
inferior.
Como se ha visto la sesión de SSL se establece siguiendo una serie de pasos de saludo
(handshaking) entre el cliente y servidor. Esta sucesión puede variar, dependiendo de si el
servidor se configura para pedir certificados de cliente. Además existen algunos casos en donde
se requieren pasos de saludo adicionales para el manejo de condiciones especiales (protocolo de
condiciones de advertencia o error).
Una vez una sesión de SSL se ha establecido puede reutilizarse, evitando así la penalización de
repetir los pasos necesarios durante la fase de saludo. El servidor asigna un identificador único a
82 CAPÍTULO 5. HTTP SEGURO
cada sesión de SSL que debe ser guardada de modo seguro para que el cliente pueda utilizarla en
próximas conexiones (hasta que el identificador de la sesión caduque).
Secure Sockets Layer fue creado en julio de 1994, desde entonces (y en orden cronológico) han
surgido varias implementaciones:
Posteriormente, Netscape produjo una implementación de referencia de SSL 2.0 (SSLRef), que se
publicó en abril de 1995. Para su uso legal en EEUU debía obtenerse licencia de Netscape.
Era una implementación limitada que no incluía algoritmos de encriptación como RC2, RC4 y
RSA. Curiosamente, muchos programas que utilizan SSL, como Navigator de Netscape, sólo
contenían tales algoritmos. Por ello, para que un programa basado en SSLRef fuese compatible
con un programa como Navigator, era necesario obtener una licencia en forma independiente de
tales algoritmos7 .
SSLeay
SSLeay es una implementación independiente de SSL 3.0 desarrollada por Eric Young, un
programador australiano. Está disponible en forma gratuita en todo el mundo en varios sitios
de FTP anónimo.
SSLeay utiliza implementaciones de RC2 y RC4 basadas en los algoritmos publicados de forma
anónima en el grupo de discusión sci.crypt.
Además de RC2 y RC4, SSLeay también incluye IDEA, DES y Triple DES. Young sugiere a los
programadores utilizar Triple DES siempre que sea posible. A diferencia de los algoritmos IDEA,
RC2 y RC4, Triple DES se ha estudiado durante más de 20 años y se cree que es seguro.
7 RC2, RC4 y RSA necesitaban una licencia expedida por el propietario (RSA)
5.2. HTTP + SSL = HTTPS 83
OpenSSL
OpenSSL [84] es un conjunto de herramientas (basado en SSLeay) que implementa tanto los
protocolos SSL v2/v3 y TLS v1 como los estándares criptográficos relacionados y requeridos por
ellos. El programa openssl es una herramienta de shell que permite usar las diversas funciones
de la librería criptográfica. Puede ser utilizado para:
Encriptación y des-encriptación.
SSLJava
La rápida expansión de Java, ha hecho que se implementen multitud de APIs. En relación con SSL,
se ha desarrollado la JSSE (Java Secure Socket Extension) [60], extensiones de sockets seguros
sobre Java.
JSSE es un paquete de Java que implementa el soporte de los protocolos SSL v3 y TLS v1. La
versión de JSSE puede usarse de forma libre como parte de las aplicaciones comerciales.
5.2.6 HTTPS
SSL puede utilizarse para asegurar la comunicación de la mayoría de los protocolos a nivel de
aplicación. La versión “segura” del protocolo suele añadir la letra (S) a su nombre. Así por
ejemplo:
...
Pero el protocolo que aquí interesa es HTTPS, muchos servidores actuales ya lo implementan, y
suelen reservar para él el puerto 443. Por tanto un servidor Web escuchando en el puerto 443 será
capaz de responder a peticiones del estilo:
84 CAPÍTULO 5. HTTP SEGURO
https://www.miservidorwebseguro.com/
Para dar soporte HTTPS los desarrolladores de servidores Web pueden programar el protocolo
SSL de forma nativa (por ejemplo iPlanet) o bien apoyarse en alguna implementación de terceras
partes (por ejemplo mod_ssl + openssl).
5.3 S-HTTP
5.3.1 Introducción
S-HTTP (secure HTTP) fue descrito en el RFC 2660 [109]. Secure HTTP no es HTTPS, se basa
en negociar la seguridad a través de extensiones a las cabeceras HTTP, no en un protocolo seguro
subyacente como SSL. Define la sintaxis para asegurar el envío de mensajes utilizando HTTP y
proporciona servicios de seguridad aplicables independientemente para:
Confidencialidad de transacciones.
Autenticación e integridad.
No repudiación.
También maneja negociación entre las partes para maximizar la flexibilidad en la elección de:
Políticas de seguridad.
Algoritmos criptográficos.
5.3.2 El protocolo
Un mensaje S-HTTP es una cabecera de petición (request) o una línea de estado, seguida de un
conjunto de otras cabeceras y algún contenido. Este contenido puede ser texto plano, mensajes
seguros o simplemente mensajes HTTP. Una petición segura mediante S-HTTP, puede tener el
aspecto:
Secure * Secure-HTTP/1.4
...
Secure-HTTP/1.4 200 OK
...
5.3. S-HTTP 85
Presentar aquí el resto de la sintaxis S-HTTP, puede resultar algo crudo, simplemente
enumeraremos algunas de las características más importantes:
Integrable con HTTP: ha sido diseñado para integrarse con HTTP de una manera fácil, a
través de extensiones de las cabeceras HTTP.
Compatible con HTTP: añade extensiones a las cabeceras, pero mantiene todas las
funcionalidades básicas.
No requiere certificados digitales o claves públicas del lado cliente. Puede trabajar sólo
con algoritmos de clave simétrica y aunque puede aprovecharse de las infraestructuras de
entidades certificadoras, en realidad no las necesita.
5.3.3 Implementaciones
Parece que S-HTTP no ha tenido mucha aceptación, pueden haber influido varios aspectos como
el apoyo de los grandes fabricantes a la solución basada en SSL (SSL fue creado por Netscape),
o una conocida debilidad en el intercambio de claves, que puede provocar que un usuario no
experimentado sea vulnerable a ataques [117].
De todas maneras existe algún servidor que sí ofrece soporte a este protocolo, aunque la lista no
es demasiado extensa y los productos que aparecen en ella no son especialmente conocidos:
Alibaba: http://www.csm-usa.com/
WebTen: http://www.tenon.com/
El listado de clientes que soportan S-HTTP es aún más pequeño, de hecho sólo un navegador
bastante antiguo (Secure Mosaic) parece haber implementado una versión de este protocolo.
Capítulo 6
6.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.2 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.2.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.2.2 Características de XML . . . . . . . . . . . . . . . . . . . . . . . . . 89
6.2.3 Definición de la estructura de un documento XML . . . . . . . . . . . 89
6.2.4 La sintaxis de XML . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
6.2.5 Otras especificaciones y tecnologías desarrolladas en torno a XML . . . 92
6.3 XHTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
6.3.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
6.3.2 Principales diferencias entre XHTML y HTML 4.X . . . . . . . . . . . 94
6.3.3 Un ejemplo sencillo de XHTML . . . . . . . . . . . . . . . . . . . . . 94
6.4 SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.4.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.4.2 Antecedentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.4.3 Estructura de funcionamiento SOAP sobre HTTP . . . . . . . . . . . . 97
6.5 Otras aplicaciones relacionados con XML y la Web . . . . . . . . . . . . . 99
6.1 Introducción
87
88 CAPÍTULO 6. RELACIÓN ENTRE WEB Y XML
Una pregunta muy frecuente es ¿XML es simplemente el sustituto de HTML?. La respuesta es no.
Básicamente XML no ha sido creado para una aplicación exclusiva en la Web, aunque hay líneas
de trabajo en este sentido (XHTML, etc.).
Este capítulo se tratan los conceptos básicos de XML y de algunas de sus aplicaciones más
importantes a la World Wide Web.
6.2 XML
6.2.1 Introducción
XML (eXtensible Markup Language) [130] [131] [129] es un lenguaje a nivel de aplicación para
intercambio de información estructurada, dicho de forma muy sencilla, es un nuevo formato de
datos. La versión 1.0 del lenguaje es una recomendación del W3C [127] desde febrero de 1998.
Desde esa fecha XML ha crecido exponencialmente (tanto en uso real en aplicaciones, como en
las veces que se oye hablar de él).
Historia
XML tiene su punto de partida en los lenguajes de marcado. Hasta la aparición de XML dos eran
los más utilizados:
XML está a medio camino (figura 6.1) entre la sencillez de uso y posibilidades de HTML y la
potencia de SGML. Su objetivo básico es dotar a los datos de semántica y a los documentos de
estructura. A continuación se muestra un ejemplo sencillo donde se puede observar como XML
proporciona semántica y estructura:
<?xml version="1.0"?>
<producto>
<nombre>Carpeta anillas</nombre>
<fabricante>Carpetas monfortinas S.A</fabricante>
<precio unidad="euro">3</precio>
</producto>
Aunque hoy día XML aún no está tan extendido como HTML, su uso futuro en la Web
mejorará la eficiencia de las búsquedas, al proporcionar cada documento XML metadatos
sobre sí mismo.
Permite proporcionar diferentes vistas sobre los datos (HTML, PDF, voz, etc.), dependiendo
de quién sea el cliente.
Facilita la integración desde fuentes de datos heterogéneas, por ejemplo, páginas Web,
distintas bases de datos, ...
Los documentos tienen una estructura que los hace legibles e inteligibles no sólo para los
ordenadores, si no también para los humanos.
Las aplicaciones de XML son fácilmente extensibles mediante definiciones de nuevos tipos
de documento (DTD).
A lo largo del tiempo han surgido distintas formas de definir la estructura de un documento XML:
DTD (Document Type Definition): define la semántica del tipo de documento que se está
creando (los elementos disponibles, las relaciones entre ellos, los atributos, posibles valores,
etc.). Representa la estructura de una clase concreta de documentos XML. La definición
del DTD es la parte más compleja de la construcción del documento, aunque existen
repositorios con DTDs ya definidos que pueden ser reutilizados.
90 CAPÍTULO 6. RELACIÓN ENTRE WEB Y XML
XML SCHEMA: aunque el objetivo es el mismo que en los DTD, los XML SCHEMAs son
en sí mismos documentos XML, de esta manera se pueden utilizar las mismas herramientas
para crear las semánticas y los documentos propiamente dichos.
RDF (Resource Description Framework): esta siendo desarrollado como un proyecto del
W3C. El objetivo es manejar grandes cantidades de documentos HTML o XML. RDF crea
metadatos para un conjunto de documentos, de manera que estos pueden ser encontrados
más tarde.
De acuerdo a las reglas que cumplen los documentos respecto a la especificación XML y a la
definición de su estructura, se pueden distinguir estos dos tipos:
Bien formados: todos aquellos documentos que cumplen las especificaciones del lenguaje
en lo que se refiere a las reglas sintácticas. Un documento bien formado podrá ser analizado
por un parser genérico.
Válidos: además de bien formados responden a la estructura semántica definida por su DTD.
Un analizador sintáctico (en inglés parser) lee el documento XML y al menos verifica que está
bien formado, aunque algunos también comprueban que el código XML sea válido. El parser es
la herramienta principal de cualquier aplicación XML, permite reconocer las distintas partes de un
documento, trabajar con ellas, modificarlas, ...
Cuando un programa maneja datos en XML, debe incluir un parser. Por ejemplo los navegadores
de última generación incluyen uno. Para programadores que deseen crear sus propias aplicaciones
existen parsers ya implementados y disponibles públicamente como JAXP [55] para Java, Expat
para C [40], etc. Generalmente estos utilizan un API estándar que permite trabajar con ellos. Dos
son las APIs más utilizadas, DOM y SAX:
El API DOM (Document Object Model) [37] fue definida por el W3C, y la versión actual
es DOM level 3. Para cada documento analizado se proporciona una estructura en árbol de
objetos. El modelo de objetos completo se ubica en memoria donde puede ser accedido y
manipulado por el usuario.
El API SAX (Simple API for XML) [111] fue definida por el grupo XML-DEV, siendo la
versión actual SAX 2.0. Es un API basada en eventos, durante el análisis informa a la
6.2. XML 91
aplicación cuando ocurren eventos que considera relevantes (por ejemplo el comienzo o fin
de un elemento XML). No se construye ningún árbol explícito de documento, debe ser la
propia aplicación la que implemente la forma de tratar los diferentes eventos.
Construir un DOM requiere la lectura de toda al estructura XML y mantener el árbol de objetos
en memoria, lo que significa un mayor consumo de recursos. Mientras, SAX es más complejo de
manejar pero optimiza el uso de memoria al mantener en ella sólo lo estrictamente necesario.
De una manera muy general, un documento XML se compone de las siguientes partes:
Prólogo y declaración de tipo de documento: los documentos XML deben comenzar con
una línea de prólogo que describa la versión de XML, el tipo de documento, etc. Además
también puede existir una segunda línea de declaración de tipo de documento XML que
define el tipo de documento que se está creando. Generalmente esta segunda línea indica la
ubicación de un fichero que contiene el DTD. A veces esta línea es sustituida por un DTD
“inline”, es decir, definido en el propio documento.
Por ejemplo, un prólogo y una línea de declaración de tipo de documento podría ser:
...
<!-- Etiqueta de comentario -->
<linea>Una línea</linea>
<linea>Otra línea</linea>
</parrafo>
...
A continuación se muestra una lista (agrupada por áreas afines) de los distintos trabajos que está
desarrollando el W3C sobre la base de XML1 .
Transformación de documentos
XSL (Extensible Stylesheet Language) es un lenguaje para componer hojas de estilo. Una hoja de
estilo XSL especifica como se obtiene la presentación de una clase de documentos XML. Consta
de tres partes:
XPath: un lenguaje de expresiones usado por XSLT2 para acceder o referirse a las partes de
un documento XML.
XSL Formatting Objects: un vocabulario XML para especificar la semántica del formateo.
XML POINTER: define el lenguaje XPointer (XML Pointer Language), que puede
ser utilizado para establecer referencias a fragmentos de recursos de tipo text/xml o
application/xml. Soporta el direccionamiento dentro de las estructuras internas de un
documento XML. Permite referencias internas a propiedades, tipos de elementos, ...
XML BASE: especifica la sintaxis para definir la BASE que se utiliza en los documentos
para resolver URIs relativas.
XML LINKING: define el lenguaje XLink (XML Linking Language), que permite que
ciertos elementos de un documento se utilicen para crear y describir enlaces entre recursos.
Es posible establecer no sólo enlaces unidireccionales (los tradicionales en HTML) si no
también estructuras más complejas.
1 Puede obtenerse más información en el sitio Web del W3C http://www.w3c.org
2Y por otras especificaciones como XML Linking.
6.3. XHTML 93
Temas de seguridad
Existen grupos de trabajo que se están ocupando de temas de seguridad relacionados con XML. Por
ejemplo como representar documentación encriptada (XML Encryption), firmas digitales (XML
signature) o mecanismos de autenticación y autorización mediante una sintaxis XML.
EL grupo de trabajo XML Query está estudiando como proporcionar facilidades de búsqueda y
extracción de datos desde documentos en la Web. Intenta proporcionar un medio de comunicación
entre las bases de datos y la Web, siendo el objetivo último poder acceder a colecciones de
documentos XML como si fuesen una base de datos.
En la W3C existen otras líneas de trabajo muy interesantes relacionadas con la Web, que se
analizan en más profundidad en las secciones posteriores:
6.3 XHTML
6.3.1 Introducción
XHTML [128] es una especificación del W3C, la última versión XHTML1.1 fue publicada el día
31 de mayo de 2001. Define un HTML escrito de forma que cumple las normas sintácticas del
XML. Esta transformación permite que el nuevo lenguaje sea extensible en dos sentidos:
Por un lado los desarrolladores están constantemente introduciendo nuevos métodos para
expresar sus ideas. Para ello introducen etiquetas diferentes. En XML es relativamente fácil
introducir nuevos elementos o atributos. XHTML está diseñado para acomodarse a estas
extensiones utilizando módulos [75].
Por otro lado, los métodos de acceso a Internet están cambiando, ordenadores, móviles,
PDA, etc. XHTML se ha diseñado para proporcionar interoperabilidad con agentes de
usuario generales.
94 CAPÍTULO 6. RELACIÓN ENTRE WEB Y XML
Las principales diferencias se deben al hecho de que XHTML es una aplicación XML, mientras
que HTML 4.X no lo es. Para conseguir la transformación de documentos HTML 4.X a XHTML
deben seguirse unas normas:
Los nombres de las etiquetas de elementos y de los atributos tienen que estar en minúscula.
Los valores de los atributos tienen que estar entre comillas dobles (") o simples (’).
Todos los elementos tienen que estar cerrados, ya tengan contenido (<p>...</p>) o no
(<br/>).
Los valores de pares atributo=valor iguales no pueden ser simplificados, por ejemplo <dl
compact=’compact’> no se puede expresar como <dl compact>.
Se debe incluir una declaración de tipo de documento. Existen tres posibles tipos de
documentos válidos en XHTML:
– strict: se utiliza cuando se da formato a los textos a través de CSS (Cascading Style
Sheets).
– transational: se utiliza cuando no se describe la presentación de los documentos por
medio de hojas de estilo en cascada, prefiriendo la descripción a base de etiquetas. Este
sistema es adecuado cuando se desea facilitar el acceso a usuarios con navegadores sin
posibilidades de tratamiento de CSS.
– frameset: se usa en documentos que incorporan frames.
Si dentro del código se describen elementos que incluyen listados en lenguajes diferentes,
como ocurre con los elementos <script> o <style>, XHTML exige que se acoten los guiones
en una sección CDATA. Las secciones CDATA ignoran el significado de los caracteres que
incluyen, evitando problemas con entidades que puedan confundirse.
A continuación se muestra un sencillo código de ejemplo. Se trata de un archivo con dos enlaces
a programas gratuitos muy útiles para el trabajo con XHTML:
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"xhtml1-strict.dtd">
Servidor: cualquiera funcionará adecuadamente una vez se haya hecho un pequeño cambio
96 CAPÍTULO 6. RELACIÓN ENTRE WEB Y XML
en la configuración. Se trata de incluir la extensión .xhtml dentro de los tipos MIME que
el servidor Web es capaz de manejar.
Cliente: los navegadores más actuales ya incluyen soporte a XHTML. Por ejemplo un
Netscape Navigator 6.0 mostraría el resultado de la figura (figura 6.2).
6.4 SOAP
6.4.1 Introducción
SOAP (Simple Object Access Protocol) [118] es un protocolo ligero para intercambio de
información en un entorno distribuido. Se basa en XML, siendo la versión actual SOAP 1.2,
en ella se definen en cuatro partes:
Una convención que indica como representar las llamadas a procedimientos remotos y las
respuestas de estos.
6.4.2 Antecedentes
SOAP no intenta solucionar un problema nuevo, hace ya bastantes años que surgió la necesidad
de obtener acceso distribuido a objetos y realizar llamadas a procedimientos remotos. Una de
las soluciones clásicas es RPC (Remote Procedure Call), pero no es la única. Muchas otras
tecnologías han abordado este problema proporcionando buenas soluciones, pero casi todas pecan
de ser cerradas, es decir, específicas para un lenguaje o plataforma. Dos son los ejemplos más
conocidos:
Pero también se ha trabajado en soluciones capaces de posibilitar la comunicación sea cual sea
la plataforma o el lenguaje, por ejemplo CORBA. CORBA (Commom Object Request Broker
Arquitecture) es una tecnología que está ampliamente disponible y proporciona tanto capacidad
de comunicación como interoperabilidad. En el lado negativo, CORBA es bastante complejo y
pesado, requiriendo de un período de aprendizaje alto que desanima a muchos programadores.
Llegados a este punto se constata la necesidad de alguna tecnología que sea a la vez útil y
que solucione los problemas de protocolos cerrados y/o complejos. Se busca que la creación
de aplicaciones distribuidas sea lo más sencilla posible, y que se permita la interoperabilidad
independientemente de lenguajes y plataformas.
El primer intento, XML-RPC, proporciona un mecanismo simple para realizar llamadas a
procedimientos remotos apoyándose en datos codificados con XML y transmitidos sobre HTTP.
Aunque la idea era buena, pronto surgió una gran limitación, XML-RPC no podía manejar
estructuras de datos complejas. SOAP surge como una segunda respuesta. La idea de
SOAP apareció en el mundo empresarial (grandes marcas como Microsoft, IBM, etc.), pero ha
evolucionado hasta llegar a ser un proyecto del W3C. Su desarrollo le ha sido asignado a un grupo
de trabajo (XML Protocol), lo que le da el caracter de protocolo abierto y a la vez un fuerte impulso.
SOAP parte de una idea simple, garantizar la comunicación entre equipos heterogéneos, basándose
en protocolos preexistentes, muy extendidos e implementados (como HTTP y XML).
HTTP fue tratado en profundidad en un capítulo anterior (vea el capítulo 2 en la página 19),
pero se pueden recordar algunas características relevantes. HTTP es básicamente un protocolo
sin estados que funciona bajo el paradigma cliente/servidor. Proporciona una comunicación
basada en mensajes de petición y respuesta. Estos mensajes están formados por dos partes
diferenciadas (cabeceras y cuerpo). Añadiendo nuevas cabeceras pueden desarrollarse nuevos
protocolos especializados. SOAP se aprovecha de esto para su implementación sobre HTTP.
98 CAPÍTULO 6. RELACIÓN ENTRE WEB Y XML
De XML ya se han comentado algunos aspectos en las secciones anteriores, simplemente recordar
que es un lenguaje muy extensible. SOAP utiliza esta característica y maneja una serie de mensajes
en XML. Los mensajes SOAP tienen dos partes, una cabecera opcional y un cuerpo, dispuestos
dentro de una envoltura (envelope).
Se analizan a continuación los pasos para una comunicación simple sobre HTTP y SOAP (figura
6.3).
El cliente SOAP quiere invocar un método en un objeto particular del servidor. El método y los
parámetros asociados se codifican en el cuerpo de un documento XML. Por ejemplo:
El cliente envía una solicitud HTTP que incluye una nueva cabecera (SOAPAction), y el
documento XML anterior. Por ejemplo:
El servidor Web recibe la petición. A veces al servidor Web se le llama proxy SOAP, ya que no
procesa por si mismo la petición, sólo actúa de intermediario para un nodo SOAP3 .
3 Programa capaz de procesar los mensajes SOAP según lo definido en la especificación.
6.5. OTRAS APLICACIONES RELACIONADOS CON XML Y LA WEB 99
La cabecera HTTP SOAPAction suele estar asociada con el nombre del objeto al que se está
invocando. Por ejemplo, SOAPAction: "http://example.org/2001/06/quotes" se refiere
al objeto quotes.
El nodo SOAP recibe la petición en XML, la interpreta e invoca la ejecución del método solicitado.
Los resultados de la ejecución son encapsulados en un mensaje SOAP de respuesta.
Respuesta HTTP
El servidor Web se hace con el control para enviar la respuesta recibida del nodo SOAP, en un
mensaje HTTP. Por ejemplo:
HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
El cliente recibe la respuesta del servidor Web, para procesar correctamente la misma es necesario
que incorpore capacidades de análisis XML.
A parte de los proyectos iniciados directamente por el W3C, existen incontables aplicaciones que
relacionan el Web con XML.
100 CAPÍTULO 6. RELACIÓN ENTRE WEB Y XML
Cada día hay más implementaciones de parsers, procesadores de hojas de estilo, protocolos como
SOAP, etc. Incluso importantes organizaciones como la Apache Software Foundation ha creado
un grupo (Apache XML [129]) que se ocupa de la construcción de herramientas basadas en XML
con calidad comercial, respetando los estándares y de código abierto. Algunos de los proyectos
actuales son:
Xang, una herramienta de desarrollo rápido de aplicaciones del lado servidor basada en
HTTP, XML, y JavaScript.
...
Otra aplicación relacionada muy interesante, es WebDAV, una especificación del W3C que
extiende al HTTP e intercambia mensajes en XML. Se trata más en detalle en el siguiente capítulo.
Capítulo 7
7.1 Introducción
En los comienzos del Web (en 1990), Tim Berners-Lee desarrolló un primer prototipo de
navegador con capacidades de lectura y escritura1 . Más adelante, NCSA Mosaic se convirtió en el
navegador de referencia y la capacidad de escritura pasó a un segundo plano, no siendo utilizada
durante bastante tiempo.
Fue en 1995, cuando aparecen nuevas tecnologías (como FrontPage) capaces de utilizar
propiedades de escritura sobre la base del protocolo HTTP. Desde ese momento, más y más
herramientas (procesadores de texto, manipuladores de imágenes, etc.) han ido ofreciendo soporte
para publicar en servidores Web.
101
102 CAPÍTULO 7. GESTIÓN DE RECURSOS REMOTOS
En las siguientes secciones se analizan estas dos soluciones para proporcionar la gestión de
recursos remotos. Se hará más hincapié en WebDAV, ya que es un estándar del W3C y actualmente
incluso Microsoft (propietario de FrontPage) le está dando su apoyo.
7.2 FrontPage
La contrapartida en el lado servidor son una serie de herramientas llamadas extensiones FrontPage.
Estas extensiones implementan un conjunto de mejoras basadas en los métodos PUT y DELETE
definidos por HTTP. Se definen también mecanismos para gestión de bloqueos y autenticación.
7.3 WebDav
7.3.1 Introducción
WebDAV (Web Distributed Authoring and Versioning) que ha sido descrito en el RFC 2518 [106],
es un protocolo de red que extiende a HTTP. Los programas clientes que soportan WebDAV
hacen fácil que personas dispersas geográficamente puedan trabajar de manera conjunta sobre
documentos alojados en un servidor Web (imágenes, páginas Web, documentos Microsoft Office,
etc.).
Muchas aplicaciones bien conocidas integran ya soporte WebDAV, incluso las nuevas versiones de
sistemas operativos Windows utilizan Web Folders, que no son más que clientes de WebDAV.
El protocolo ha sido desarrollado por el WebDAV Working Group del IETF, y proporciona una
infraestructura abierta y basada en estándares para la creación y mantenimiento de documentos de
manera distribuida.
Hay muchas situaciones en las que WebDAV puede ser muy útil (figura 7.1). Todas ellas tienen
en común la necesidad de crear páginas Web (u otros documentos) de manera remota. Como
ejemplos de estas posibles situaciones:
7.3. WEBDAV 103
Un usuario particular, con pocos conocimientos sobre Internet (FTP, etc.) pero que desea
crear un sitio Web. WebDAV es una solución muy cómoda en este caso, ya que es probable
que este usuario conozca alguna aplicación de uso común (como Microsoft Word) que
proporcionan soporte DAV.
Un ISP (proveedor de servicios Internet) que aloja páginas, ofrece acceso mediante
WebDAV evitando así los problemas de seguridad inherentes a ofrecer cuentas de acceso
FTP o shell.
Un sitio Web corporativo que necesita aceptar contribuciones a sus contenidos desde varias
unidades de negocio de la empresa que se encuentran distribuidas geográficamente.
7.3.3 Características
El protocolo WebDAV extiende las capacidades de HTTP con seis nuevas características:
trabajando con un bloqueo, perder la conexión de red, y luego reconectarse para terminar
las actualizaciones.
Gestión del espacio de nombres: es posible copiar, mover y borrar recursos dentro de los
espacios de nombres del servidor. También se puede crear nuevas colecciones y listar sus
contenidos. Estas operaciones podrían compararse con las que se realizan en un sistema de
ficheros.
Colecciones avanzadas: las colecciones avanzadas de recursos pueden ser tanto referencias,
como colecciones ordenadas por el cliente. Proporcionan un mecanismo para la
organización jerárquica de recursos en la red.
Las referencias a recursos actúan como enlaces simbólicos que pueden ser reutilizados en
múltiples colecciones, también permiten que la colección contenga recursos no HTTP.
Las colecciones ordenadas según lo establecido por el cliente también pueden ser útiles.
Por ejemplo en colecciones que se ordenan para mejor comprensión por parte de un lector
humano (como los capítulo de un libro).
Control de acceso: limita los derechos de acceso a un determinado recurso. WebDAV asume que
todas las aplicaciones WebDAV soportan el protocolo de autenticación sobre HTTP basado
en resúmenes (HTTP Digest Authentication)[108].
Se presentan a continuación tres tablas con listas de aplicaciones con soporte DAV. La primera
(tabla 7.1) presenta un listado de servidores, la segunda (tabla 7.2) es un listado de aplicaciones
para creación de documentos y la tercera (tabla 7.3) recoge aplicaciones que emulan el
funcionamiento de gestores de ficheros. La información para construir estas tablas ha sido
obtenida de la página Web http://www.webdav.org y no pretende ser completa.
8.1 Introducción
Casi cualquier aplicación basada en Web necesita manejar algunos datos. Aunque existen muchas
maneras de almacenar la información (desde el propio sistema de ficheros, hasta los servidores de
directorio), lo más extendido es utilizar BBDDs (bases de datos). Cuestiones como la eficiencia
de actualización y búsqueda llevan a esta elección.
107
108 CAPÍTULO 8. BASES DE DATOS Y BÚSQUEDA EN LA WEB
En este capítulo se cubren varios aspectos relacionados con la BBDDs. Por un lado se da una
visión general de algunos de los SGBD (sistemas gestores de bases de datos) más extendidos y se
comentan tecnologías que permiten a una aplicación Web utilizarlos. Por el otro lado se incluye
una sección donde se describen los aspectos teóricos de un buscador, una de las aplicaciones Web
que hace un uso más intensivo de los sistemas de bases de datos.
Una BBDDs es un conjunto de datos con relación lógica. Un SGBD es un programa capaz
de gestionar adecuadamente las BBDDs. Actualmente casi todos los SGBD implementan los
conceptos descritos en la teoría relacional. Un SGBDR (sistema gestor de bases de datos
relacional) almacena la información en tablas organizadas lógicamente que se enlazan definiendo
relaciones y contienen datos. El lenguaje de consulta SQL (Structured Query Language), que ha
sido estandarizado por la ISO [51], proporciona la recuperación y gestión de estos datos.
Generalmente las BBDDs1 manejan transacciones, que deben cumplir una serie de propiedades.
Se les suele llamar propiedades ACID (Atomicity, Consistency, Isolation, Durability):
Consistency (consistencia): surge como una necesidad cuando hay muchos usuarios
accediendo a la base de datos de manera concurrente. La consistencia garantiza que en
estos casos se mantiene la integridad de la información.
Durability (durabilidad): garantiza que una transacción que finaliza correctamente (commit)
queda adecuadamente reflejada. Independientemente de fallos físicos (como por ejemplo
en el disco duro), el sistema será capaz de recordar todas la transacciones que han sido
realizadas.
Los SGBDR suelen incluir herramientas de administración que permiten ajustar el rendimiento en
función de las necesidades particulares. Este no es un trabajo trivial, de hecho el administrador
de BBDDs debería ser un profesional muy bien formado. Muchas empresas cuentan son sus
propios administradores de bases de datos, pero también hay muchas otras que no, en ellas lo
más probable es que el Webmaster termine administrando también las BBDDs. En estos casos le
será muy necesario tener algún conocimiento sobre el tema, por eso. en las siguientes secciones
se presentan algunos de los sistemas gestores de bases de datos más utilizadas en las aplicaciones
Web.
1 A veces, como en este capítulo, se abusa del lenguaje y se utiliza este término para referirse indistintamente al
8.2.1 MySql
MySQL [8] [78], es una de las bases de datos relacional de código abierto más popular en Internet.
Existen distribuciones para distintas plataformas (Win32/NT, Unix/Linux), y en muchas de ellas
se instala por defecto (por ejemplo en los Red Hat Linux). Actualmente es propiedad de MySQL
AB (una empresa sueca), que se encarga de su desarrollo y ofrece servicios auxiliares (consultoría,
soporte técnico, etc.). Aunque el software es gratuito, su uso en según que aplicaciones está sujeto
a licencia de pago.
Características:
Aunque MySQL se basa en el estándar ANSI/ISO SQL 92, existen algunas diferencias. Como es
lógico un sistema que utilice alguna de estas, dejará de ser portable a otros SGBDs compatibles
con SQL 92. Las diferencias más importantes de describen en la siguiente lista:
Se incluyen ciertas extensiones a SQL 92. Por ejemplo Like puede ser utilizado en campos
numéricos.
Además hay ciertas partes de SQL 92 que directamente no se implementan; para ellas la
documentación de MySQL proporcionan diversas alternativas. Quizá el caso más relevante
sea la falta de soporte a transacciones. MySQL tomó la decisión de utilizar otro paradigma,
llamado operaciones atómicas. Los desarrolladores de MySQL consideran que este sistema
garantiza la integridad sobre la BBDDs, a la vez que proporciona un mejor rendimiento. De
2 Frente a las soluciones comerciales disponibles en el mercado, que suelen ser complejas e incluso lentas
110 CAPÍTULO 8. BASES DE DATOS Y BÚSQUEDA EN LA WEB
Para la descarga del software u obtención de más información puede visitar el sitio Web sobre
MySQL (http://www.mysql.com/).
8.2.2 mSQL
mSQL [77] (Mini SQL) es un gestor de bases de datos ligero, diseñado para proporcionar acceso
rápido a conjuntos relativamente pequeños de datos almacenados en sistemas con poca memoria.
Implementa un subconjunto de SQL e inicialmente fue desarrollado como un proyecto académico
en código abierto. Actualmente las últimas versiones estables son las numeradas como mSQL
2.X, aunque ya existen versiones Beta del nuevo mSQL 3.0.
Las primeras versiones de mSQL (msql 1.X) alcanzaron sus objetivos, son motores muy rápidos
sobre conjuntos de datos pequeños. Debido a ello y a su carácter de código abierto, se
popularizaron rápidamente en Internet. Pero estaban muy limitados y no son la elección adecuada
si se deben manejar aplicaciones con fuertes cargas de datos (más de 1 millón de registros) o que
necesiten de consultas SQL complejas.
Las nuevas versiones (de 2.X en adelante) tratan de conseguir los siguientes objetivos:
Conseguir acceso rápido a bases de datos con gran cantidad de datos o accedidas mediante
operaciones complejas.
El servidor de mSQL 2.X es capaz de servir múltiples peticiones simultáneas, para ello se utiliza
un esquema basado en un proceso principal y varios procesos hijos. El proceso principal es capaz
de aceptar conexiones de clientes, gestionar la distribución de trabajo entre los procesos hijos
y realizar otras tareas de administración. mSQL 2.0 implementa bloqueos a nivel de tabla, que
permiten lecturas compartidas y escritura exclusiva. El uso de bloqueos es el primer paso hacia el
soporte de transacciones, pero hoy por hoy mSQL aún no soporta transacciones.
El desarrollo de mSQL continúa, aunque parece que el producto ha perdido algo de fuerza con
respecto a su más directo competidor MySQL; es posible que haya influido el cambio en las
condiciones de licencia, ahora para un uso comercial del software se exige el pago de licencia.
Para conseguir una versión del software, documentación, comprobar las condiciones de licencia,
etc, puede visitarse el sitio de mSQL (http://www.hughes.com.au).
8.2. SISTEMAS GESTORES DE BASES DE DATOS 111
8.2.3 PostgreSQL
PostgreSQL [90] es un gestor de bases de datos Relacional-Objetual. Es uno de los SGBDR Open-
Source con más “solera”, la primera versión es de 1985 y actualmente se distribuye PostgreSQL
7.X. Está muy extendido, sobre todo en el mundo Unix/Linux (muchas distribuciones Linux, como
Red Hat lo instalan por defecto), aunque existen versiones para plataformas Windows. Entre sus
ventajas comentar:
Soporta casi todas las construcciones SQL, incluso extensiones orientadas a objetos (como
por ejemplo la posibilidad de definir tablas mediante herencia), en este sentido es el motor
de BBDDs en código abierto más avanzado. Entre las construcciones soportadas se pueden
destacar:
– Transacciones.
– Vistas.
– Triggers.
– ...
– C, C++ y C embebido
– Perl (perl5)
– Python (PyGreSQL)
– TCL (libpgtcl)
– PHP
– JDBC y ODBC
– ...
El mayor problema que se le achaca es su lentitud frente a otras opciones en código libre
como mSQL o MySQL. Para más información puede visitarse el sitio Web de PostgreSQL
http://www.postgresql.org/.
112 CAPÍTULO 8. BASES DE DATOS Y BÚSQUEDA EN LA WEB
Desde que la tecnología de las bases de datos vio la luz, hace ya bastantes años, han surgido
múltiples soluciones comerciales3 . Una de las tendencias más claras en la Web actual es
integrar fuertemente el acceso a datos en los servidores de aplicaciones. Esta tendencia llevada
a sus extremos hace que casi todos los fabricantes de SGBDs comerciales ofrezcan sus propios
servidores de aplicaciones que se integran a bajo nivel con los productos de bases de datos de la
misma empresa. Como ejemplos Sybase Enterprise Server y Oracle Application Server. Pero el
campo de los servidores de aplicaciones ya fue tratado en un capítulo anterior (vea la sección 1.3
en la página 6), ahora nos centraremos en los sistemas gestores de bases de datos:
Informix: [48] los productos de Informix han sido líderes en el mercado durante mucho
tiempo, actualmente esta empresa es propiedad de IBM. Más información en http://www.
informix.com.
Microsoft SQL Server: [67] es el SGBD más potente que ofrece Microsoft (frente a otros
productos de escritorio como Access). Se integra fuertemente en la nueva plataforma .NET
y funciona sobre Windows NT/2000. Más información en http://www.microsoft.com/
sql/default.asp.
Sybase Adaptative Server: [120] proporciona una plataforma diseñada para soportar
aplicaciones que utilizan transacciones de manera intensiva. Más información en http:
//www.sybase.com.
Pero quizás sean los sistemas gestores de bases de datos de la compañía Oracle [85] los que
tienen mayor presencia en la Web actual. Estos sistemas alardean de ser poderosos, configurables,
escalables y confiables. Proporcionan bastantes funcionalidades, muchas de ellas no soportadas
por los SGBD de código libre. Por ejemplo los productos de Oracle ofrecen soporte completo a:
Transacciones.
Concurrencia y consistencia.
Replicación y confiabilidad.
Ejecución paralela.
Redo logs.
DataMining
3 Este campo mueve mucho dinero, de hecho el dueño de Oracle (una conocida marca de software dedicada a las
BBDDs) es hoy en día uno de los hombre más ricos del mundo.
8.3. ACCESO A DATOS 113
...
No son gratuitos.
...
Pero con sus pros y sus contras los sistemas gestores de bases de datos de Oracle siguen siendo de
los más extendidos en el mercado y pueden ser una buena solución si realmente se necesita trabajar
en BBDDs muy grandes (Tbytes de datos) a unas velocidades aceptables. Más información sobre
los productos de Oracle en el sitio Web http://www.oracle.com.
Muchos servidores de BBDDs utilizan protocolos específicos de la marca, lo que obliga a aprender
un lenguaje nuevo para trabajar con cada uno de ellos. Pero es posible “limar” las diferencias
mediante alguna interface de alto nivel (figura 8.1).
...
Diversas son las tecnologías que abstraen las complejidades subyacentes de cada producto y
proporcionan una interface común (basada en SQL) para el acceso homogéneo a los datos. A
continuación se comentan algunas de las más importantes:
ODBC: [65] Microsoft estableció una norma común para comunicarse con las bases de datos,
llamada ODBC (Open DataBase Conectivity). Se apoya en un amplio conjunto de drivers
ODBC. Estos drivers entienden una serie de funciones que permiten utilizar el lenguaje
SQL estándar y las traduce a la base de datos subyacente. ODBC permite la conexión fácil
desde varios lenguajes de programación, y tiene mucha aceptación, sobre todo en entornos
Windows. En plataformas Linux/Unix su uso no es tan cómodo y suelen utilizarse otras
alternativas. Sobre ODBC Microsoft está construyendo sus extensiones de “acceso universal
a datos” (Ole DB, ADO, etc.). La versión actual es ODBC 3.0 y se puede encontrar más
información en http://www.microsoft.com/data/.
Perl:DBI: [32] Perl es uno de los lenguajes más utilizados para programación en la Web y
proporciona su propia interface de acceso a datos, llamada DBI (DataBase Interface). Es
especialmente utilizado bajo plataformas Linux/Unix, solucionando las complejidades de
ODBC en estos sistemas. DBI actúa como una abstracción para un conjunto de módulos
DBD (DataBase Driver). Cada módulo DBD actúa como manejador de un sistema gestor
de base de datos distinto. Existen módulos para prácticamente cualquier SGBD (Oracle,
Informix, MySQL, etc.) y puentes hacia otras tecnologías como ADO, JDBC ...
Actualmente algunas distribuciones de Perl se acompañan con el DBI y los drivers más
habituales, aunque en otras no (como por ejemplo Red Hat). Pueden descargarse en
cualquier mirror del CPAN (Comprehensive Perl Archive Network) http://www.cpan.
org/.
JDBC: [57] Java intenta proporcionar una plataforma segura, flexible y completa para desarrollo
de aplicaciones en Internet. En ella no podía faltar una solución a la conectividad con bases
de datos, JDBC4 . JDBC es el estándar para la conectividad entre el lenguaje Java y un
amplio rango de sistemas gestores de BBDDs. Hay diversos tipos de controladores JDBC:
Controladores Java parcialmente nativos: usan tanto código Java como binario
específico de cada plataforma.
La versión actual del API es JDBC 3.0. Puede encontrarse más información sobre ella en el
sitio de SUN http://java.sun.com/products/jdbc/.
Prácticamente todas las tecnologías que extienden la funcionalidad del servidor Web implementan
algún tipo de pasarela que proporciona el acceso a datos. En esta sección se ilustra como acceder
a una base de datos MySQL con algunas de ellas. Se utilizará una sola tabla (clientes) con varios
campos (Nombre, Apellidos, Dni, Teléfono, Email). El ejemplo consistirá en recuperar todos los
datos de esta tabla y mostrarlos en una página HTML.
La primera opción para acceder a las bases de datos es programar scripts CGI. Para ello se puede
utilizar cualquier lenguaje, siempre y cuando el SGBD proporcione alguna biblioteca de acceso.
Pero este acceso directo esconde bastantes complejidades para el programador (mantenimiento de
sesiones, etc.). Existen algunos proyectos que intentan hacer más cómodo el trabajo. Una de las
soluciones más difundidas es utilizar Perl junto con DBI.
Para que el ejemplo propuesto funcione, antes de nada, se debe conseguir una versión del DBI y
un driver DBD para MySQL5 . Una vez instalados puede probarse el siguiente código:
#!/usr/bin/perl
use DBI;
use CGI;
use strict;
my ($clave) = "";
my ($basedatoss) = "ejemplo";
# Cadena de conexion
my ($dsn) = "DBI:mysql:$basedatos:$host";
print $cgi->header;
# Preparar consulta
$sth = $dbh->prepare ("SELECT * FROM clientes");
$sth->execute ();
# Presentar resultados
while (@datos = $sth->fetchrow_array ()){
print join ("\t", @datos), "\n";
}
$sth->finish;
$dbh->disconnect ();
exit (0);
Listado 8.1 Acceso a bases de datos MySQL desde un script cgi en Perl.
ASP
ASP proporciona acceso a datos apoyándose en los objetos ADO (ActiveX Data Objects) y
ODBC6 . El uso de la interface ODBC le permite a ASP trabajar sobre cualquier sistema gestor
de bases de datos que proporcione un driver (MySQL, SQL Server, Oracle, Informix, etc.).
Los objetos ADO, basados en la tecnología COM (Component Object Model)7 , ofrecen métodos
que encapsulan el acceso a datos para su utilización en páginas ASP (Connection, RecordSet,
6 Las nuevas versiones pueden apoyarse en OLE DB, que es la mejora a ODBC que se incluye en la nueva plataforma
.NET de Microsoft.
7 Y el nuevo DCOM de la plataforma .NET de Microsoft.
8.3. ACCESO A DATOS 117
Command, etc.).
Para el ejemplo propuesto, se puede utilizar ASP sobre un Internet Information Server
ejecutándose en un Windows NT Server 4.0. Antes de poder probar el ejemplo se necesita dar de
alta un DSN (Data Source Name) que asocia el SGBD (MySQL), el nombre de la fuente de datos
(ejemplo) y un driver ODBC para MySQL8 . Una vez hecho esto sólo queda probar el siguiente
código:
<html>
<head>
<title>Acceso a base de datos desde ASP</title>
</head>
<body>
<%
‘declaración de variables
Dim objConex, objRset, consulta
‘se crea una instancia de un objeto ADO de tipo Connection
Set objConex = Server.CreateObject("ADODB.Connection")
‘se utiliza el método Open del objeto Connection para enlazar
‘al objeto con base de datos
objConex.Open "ejemplo"
‘indicamos la consulta SQL que se va a ejecutar
consulta = "SELECT * FROM clientes"
‘se ejecuta la consulta y se devuelve el resultado en un
‘objeto ADO de tipo RecordSet
Set objRset = objConex.Execute (consulta)
%>
<table>
<tr>
<td>Nombre</td> <td>Apellidos</td> <td>DNI</td>
<td>Teléfono</td> <td>E-mail</td>
</tr>
<%
Do While Not objRset.Eof
‘mientras haya registros
%>
<tr>
<td><%=objRset("nombre")%></td>
<td><%=objRset("apellidos")%></td>
8 Disponible en el sitio Web de Mysql http://www.mysql.com.
118 CAPÍTULO 8. BASES DE DATOS Y BÚSQUEDA EN LA WEB
<td><%=objRset("dni")%></td>
<td><%=objRset("telefono")%></td>
<td><%=objRset("email")%></td>
</tr>
<%
‘salta al siguiente registro
objRset.MoveNext
Loop
%>
</body>
</html>
Listado 8.2 Acceso a bases de datos MySQL desde una página ASP.
JSP
El acceso a base de datos desde JSP, al igual que desde Servlets, se apoya en la tecnología JDBC de
Java. Para que todo funcione adecuadamente se necesita un driver [56] que proporcione el acceso
a la bases de datos subyacente (MySQL). La instalación es fácil, basta con poner el archivo .jar
del driver en el CLASSPATH del contenedor de Servlets. Para conseguir los objetivos planteados
en el ejemplo puede utilizarse el siguiente código JSP:
<html>
<head>
<title>Acceso a base de datos desde JSP</title>
</head>
<body>
<%
// Se indica donde está el driver JDBC adecuado a la BBDD
Class.forName("org.gjt.mm.mysql.Driver");
// Se crea la consulta
Statement st = con.createStatement();
String cons = "Select * From clientes";
</table>
</body>
</html>
Listado 8.3 Acceso a bases de datos MySQL desde una página JSP.
120 CAPÍTULO 8. BASES DE DATOS Y BÚSQUEDA EN LA WEB
PHP
PHP ofrece interfaces propias de acceso a multitud de fuentes de datos: BBDDs (MySQL,
mSQL, Oracle 8, etc.), servidores de directorio (LDAP), texto en XML, etc. Todas ellas están
documentadas en la página Web de PHP [88]. Para el ejemplo propuesto en esta sección, un
código PHP sencillo es el siguiente:
<html>
<head>
<title>Consulta a BD con PHP</title>
<? // Establecer conexión con BBDD
mysql_connect("localhost", "root", "");
// Preparar y ejecutar consulta
$result = mysql_db_query("ejemplo","SELECT * FROM clientes"); ?>
</head>
<body>
<h1>Resultados de la consulta</h1>
<table border=1>
<tr><td>Nombre</td><td>Apellidos</td>
<td>Dni</td><td>Tlf</td><td>E-mail</td>
</tr>
<? // Presentar resultados
while($row = mysql_fetch_object($result)) {
echo ’<tr><td>’; echo $row->nombre; echo ’</td>’;
echo ’<td>’; echo $row->apellidos; echo ’</td>’;
echo ’<td>’; echo $row->dni; echo ’</td>’;
echo ’<td>’; echo $row->telefono; echo ’</td>’;
echo ’<td>’; echo $row->email;
echo ’</td></tr>’;
}
?>
</table>
<? //Cerrar la conexión
mysql_close();
?>
</body>
</html>
Listado 8.4 Acceso a bases de datos MySQL desde una página PHP.
8.4. BÚSQUEDA EN LA WEB 121
8.4.1 Introducción
El crecimiento exponencial del número de documentos publicados en la World Wide Web han
hecho que una de las herramientas más utilizada en la actualidad sean los motores de búsqueda de
carácter general. Generalmente manejan ingentes cantidades de datos y se apoyan en algún SGBD
potente, probablemente alguno de los mencionados en las secciones anteriores. Esta tecnología ha
demostrado ser útil y está siendo adoptada para su uso en Intranets y sitios Web de mediano/gran
tamaño (empresas, universidades, etc).
Algunas de las grandes empresas de buscadores (Google, etc.) ofrecen sus servicios de indexación
y búsqueda a servidores particulares, reservando un espacio en sus bases de datos para la
información de ese servidor. Es una solución válida, pero en la actualidad los nuevos servidores
Web tienden a integrar las capacidades de búsqueda como un servicio más (por ejemplo Microsoft
IIS con Microsoft Index Server).
En este capítulo se da una introducción teórica a la tecnología sobre la que se apoyan las búsquedas
en la Web [123] [7].
Robot
Indexador
Motor de búsqueda
Interface
122 CAPÍTULO 8. BASES DE DATOS Y BÚSQUEDA EN LA WEB
8.4.3 Robot
Prácticamente todos los buscadores de Internet (Google, AllTheWeb, etc.) construyen sus
bases de datos usando robots (webcrawlers o spiders). Los robots son programas que recorren
automáticamente la Web recuperando documentos. En general comienzan con un listado de URLs
preseleccionadas y recurrentemente visitan los documentos que se referencian desde las mismas.
Una parte importante de los robots son los algoritmos utilizados para:
Seleccionar los enlaces a seguir. Se pueden utilizar desde los algoritmos clásicos de
búsqueda sin información (profundidad, anchura) hasta cualquier solución compleja basada
en heurísticas (popularidad9 , etc.).
Determinar la frecuencia entre visitas. Existen robots (por ejemplo Altavista) capaces de
“aprender” el intervalo de actualización de las páginas y así replanificar automáticamente
sus visitas.
META tags (etiquetas) HTML: muchas veces los usuarios no tienen permisos para crear un
fichero /robots.txt, pero desean controlar el acceso de los robots a sus páginas. En este
caso hay un nuevo estándar que permite usar META tags de HTML. Por ejemplo:
NOINDEX significa que la página no debe ser indexada y NOFOLLOW que no deben seguirse
los enlaces contenidos en la misma.
Mientras el uso del robots.txt está estandarizado y es utilizado por todos los robots importantes,
no sucede lo mismo con las META tags. De todas formas, hay que tener en cuenta que existen
miles de robots y muchos de ellos no respetan estas convenciones. Las instrucciones de restricción
de acceso sólo serán respetadas por aquellos que operen siguiendo la ética de la red.
8.4.4 Indexador
Un indexador es un programa que recibe las páginas recuperadas por un robot (muchas veces el
robot y el indexador son el mismo programa), extrae una representación interna de la misma y la
vuelca en forma de índice en una BBDD.
Existen varias técnicas para extraer la información del documento, algunos indexadores sencillos
almacenan los títulos HTML, otros los primeros párrafos, etc. Pero los más avanzados utilizan
técnicas complejas:
– Listas de parada: son listas de palabras muy habituales que no aportan significado y
que no deben aparecer en el vocabulario. Por ejemplo preposiciones, artículos, etc.
– Extracción de raíces: consigue un termino único para el vocabulario que representa
distintas palabras de significado parecido, por ejemplo plurales, tiempos verbales, etc.
...
Es un programa que se encarga de analizar una consulta de usuario y buscar en el índice los
documentos relacionados. Un buen motor de búsqueda será capaz de ordenar los resultados de
manera que aparezcan antes las páginas más relevantes atendiendo a varios indicadores, entre
otros:
124 CAPÍTULO 8. BASES DE DATOS Y BÚSQUEDA EN LA WEB
Localización: hace que dentro del resultado aparezcan antes aquellos documentos donde existen
ocurrencias de todas las palabras utilizadas en la consulta. La relevancia de los documentos
es mayor cuanto más al comienzo de los mismos aparecen las palabras buscadas. Por
ejemplo, si todas las palabras utilizadas en la consulta aparecen en el título del documento,
este será muy relevante y aparecerá antes en la respuesta que ofrece el motor de búsqueda.
Dinero: en buscadores comerciales, se están implantando servicios de pago que permiten que una
página aparezca antes en los resultados en función de la cantidad de dinero pagada.
Los motores de búsqueda suelen estar implementados mediante alguna de las tecnologías que
permiten a los programas interactuar con los datos enviados sobre HTTP, por ejemplo CGI,
Servlets, ASP, CFML, etc.
8.4.6 Interface
Formularios: el mecanismo de entrada de datos de las páginas Web son los formularios (vea la
sección A.3 en la página 362). Una interface de entrada simple se compone de un formulario
con una caja de texto y un botón de envío. El usuario introduce la palabra buscada y
pincha en el botón. Soluciones más avanzadas permiten introducir varias palabras, añadir
expresiones booleanas, buscar por proximidad, buscar en un idioma determinado, etc.
Páginas Web de resultado: los resultados se mostrarán en una página Web. Cada ítem de
respuesta contiene típicamente el enlace a la página, el contexto en el que se han encontrado
las palabras buscadas, la fecha de indexación, etc. Además, y en función de la complejidad
de la interface, pueden añadirse características avanzadas como la posibilidad de traducción
automática, extracción a texto desde formatos binarios como PDF o PPT, etc.
Capítulo 9
9.1 Introducción
El método básico para obtener información son los ficheros de registro almacenados en el
servidor. Existen formas para configurar estos ficheros atendiendo a necesidades particulares,
pero generalmente se utilizan dos ficheros estándar:
Otro método, las cookies, surgieron en la última versión de HTTP y permiten nuevas posibilidades
para recolectar información que es mantenida en el propio cliente. Por último, mediante añadidos
como programas externos y acceso a bases de datos, se pueden conseguir potentes sistemas de log.
125
126 CAPÍTULO 9. REGISTRO DE ACTIVIDAD, LOG O BITÁCORA
En este capítulo se da una introducción al uso de estos tres métodos de registro de actividad, así
como a algunas herramientas relacionadas.
Todos los servidores Web de calidad proporcionan un sistema para guardar registro de sus acciones
a fichero. Aunque es habitual disponer de directivas para personalizar estos ficheros (creando
un fichero individual para ciertos detalles de las peticiones, cambiando el formato de los datos
por defecto que se almacenan por cualquier otro formato personalizado, redirigiendo el log a un
proceso externo o base de datos, etc.), esta sección se centra en la configuración normal para los
ficheros de registro.
Además de los logs de acceso, es muy habitual controlar la actividad del propio servidor a través
de un fichero llamado error_log1 . Mediante los mensajes almacenados en este fichero se obtiene
información útil para:
Asegurar el servidor. Por ejemplo una gran cantidad de errores repetidos en la autenticación
de acceso a secciones reservadas, pueden revelar un intento de ataque por fuerza bruta.
Incluso el conocido gusano code red puede ser detectado analizando este fichero.
El fichero acces_log2 almacena una línea por cada petición HTTP. Todas las líneas siguen un
formato comúnmente aceptado, llamado common log format, que es el formato habitual que casi
todos los servidores Web entienden.
1 error.log en plataformas Windows.
2 access.log en plataformas Windows.
9.2. POSIBILIDADES PARA ALMACENAR INFORMACIÓN DE REGISTRO 127
A continuación se analiza campo a campo el contenido de una línea3 que se almacena con formato
Common log format:
-: un campo que permite una identificación más detallada del cliente [92], pero que no suele
ser utilizado (y por eso aparece un guión).
-: nombre de usuario que el servidor necesita cuando se está intentando acceder a una
sección protegida por password.
200: el código de estado HTTP que devolvió el servidor como parte de su respuesta.
Facilitar la construcción de herramientas de análisis de log. Hay que tener en cuenta que
el common log format carece de un delimitador común de campos de datos, lo que hace su
análisis innecesariamente complejo.
Añadir datos no estándar que pueden resultar interesantes (como por ejemplo el agente de
usuario utilizado).
Hay un formato personalizado que debido a su amplia aceptación es casi un estándar de facto.
Es el llamado combined_log. Se trata de un formato idéntico al common log format que añade
información sobre el agente de usuario y el remitente (referer). Un ejemplo de la información que
contendría una línea en un archivo combined_log es:
9.2.2 Cookies
Las cookies son otro mecanismo que permite almacenar información. De manera breve, una
cookie es un pedazo de información generada por el servidor Web y almacenada en el cliente,
generalmente se trata de un identificador que está asociado al contenido de alguna BBDD en el
servidor. Se introdujeron en la especificación de HTTP/1.1 e intentan modelar el concepto de
estado o sesión. El estado se puede definir como una operación de registro sobre la secuencia de
acciones que un usuario realiza contra un servidor.
Las técnicas basadas en cookies permiten conseguir información sobre los hábitos de cada usuario
(crear perfiles) y son muy populares para aplicaciones de comercio electrónico (como un carrito de
compra). Estas aplicaciones no pueden basarse simplemente en la dirección IP, ya que en muchos
casos no identifica de manera única a un usuario. Por ejemplo un equipo que puede ser usado por
varios usuarios (en un ciber, aula de libre acceso, etc.) o ordenadores situados detrás de un firewall
o proxy, que ocultan direcciones IPs.
Como se ha comentado que el uso de cookies permite que un protocolo sin estados como HTTP,
sea capaz de utilizar el concepto de sesión. Pero hay un problema, la mayoría de los navegadores
permiten deshabilitar el soporte para cookies, de esta forma, aunque el servidor permita cookies,
puede ser que el cliente no las acepte.
La alternativa es utilizar alguna herramienta externa (por ejemplo CGI) que facilite el proceso
de log hacia una BBDDs, o incluso módulos del propio servidor (por ejemplo mod_session en
Apache) que permita establecer sesiones a través de URLs. Por ejemplo:
http://www.servidor.es/pagina.html?id=usuario1...
Una vez se tienen los datos registrados, el administrador necesita extraer información relevante.
Desde luego no parece buena idea contratar a alguien para que revise línea a línea el log y prepare
informes. Para hacer ese tipo de trabajo sucio, existen multitud de paquetes de análisis4 . Con ellos
se pueden recopilar multitud de datos que pueden ser de gran ayuda, por ejemplo:
Número de visitas: fundamental para saber si el sitio está siendo utilizada o no.
4 Puedeobtenerse un buen listado (aunque no completo) en el directorio yahoo:
http://dir.yahoo.com/Computers_and_Internet/Software/Internet/World_Wide_Web/Servers/Log_
Analysis_Tools/.
9.3. UTILIDADES RELACIONADAS CON LOS DATOS DE REGISTRO 129
Páginas más visitadas: da una idea de cuales son los contenidos más demandados.
Clientes (navegadores) que acceden al sitio: permite orientar el perfil del usuario del sitio.
Informes sobre sistema operativo del cliente: es un buen indicador de como se mueve el
mercado de los sistemas operativos. Hoy en día las plataformas Windows se llevan la palma,
aunque Linux está teniendo un fuerte auge.
Datos de acceso divididos por franjas horarias: revelan los momentos de mayor y menor
sobrecarga del servidor. Pueden ayudar a decidir a que horas se deben lanzar procesos
costosos, como por ejemplo el propio análisis de los logs.
Informes de códigos de estado producidos por el servidor: ayudan a detectar errores, por
ejemplo cuando hay muchas solicitudes de una misma página y esta no se encuentra en el
servidor, quizá haya sido borrada accidentalmente.
...
De todos los analizadores, uno de los más utilizados es Analog [12], varias características invitan
a elegirlo sobre los demás:
3. Diversos formatos de salida: puede generarse la salida en formato texto o HTML, siendo
este último configurable mediante hojas de estilo y gráficos personalizados.
6. Capacidad gráfica: aunque Analog no tiene un gran potencial generando gráficas, mejora en
cada nueva versión e incluso existen paquetes adicionales que añaden nuevas posibilidades.
En un capítulo posterior se explica de manera detallada como usar Analog junto con los ficheros
de registro generados por Apache (vea la sección 19.5 en la página 286).
5 Naturalmente, Analog no inventa nada, la información debe estar de alguna manera reflejada en los ficheros de log.
6 Frente a otros analizadores comerciales, como por ejemplo Webtrends, cuyo precio puede ser superior al millón de
pesetas.
130 CAPÍTULO 9. REGISTRO DE ACTIVIDAD, LOG O BITÁCORA
Tarde o temprano, será necesario reiniciar los ficheros de log. Las razones que llevan a
hacerlo pueden ser diversas, entre ellas, que el registro haya crecido demasiado7 o contenga
mucha información antigua que ya no es necesaria. Un listado con algunas herramientas que
automatizan este proceso puede encontrarse en la siguiente dirección: http://www.cio.com/
forums/careers/site_mgmt_content.html#435
Algunas de las más conocidas son cronolog [34] (una utilidad de rotación de código libre) o
logrotate (la utilidad de rotación de logs que se distribuye con Apache).
7 Por ejemplo, access_log suele crecer 1Mb por cada 10.000 peticiones.
Parte II
Aplicación práctica 1:
Configuración de un servidor Web
Apache
131
Capítulo 10
10.1 Introducción
133
134 CAPÍTULO 10. INSTALANDO APACHE PARA LINUX/UNIX
código fuente.
Cualquiera con un conocimiento mínimo de manejo del sistema puede efectuar la instalación
básica de Apache, incluso eligiendo el método de instalación basado en código fuente, que en
teoría es el modo de instalación más duro. En este capítulo se presentan los pasos a seguir para
hacerlo.
No se necesita un equipo “último modelo” para que el servidor funcione, a decir verdad los
requisitos son más bien pocos. Un ordenador con procesador 486, 15 megas de espacio en disco
duro para espacio temporal durante la instalación son suficientes. Una vez instalado, el servidor
ocupa sobre 4 megas, y a partir de aqui el administrador deberá hacer cuentas sobre el espacio que
necesario para alojar sitios Web.
Para un uso comercial, desde luego, no es aconsejable usar un 486, lo lógico es usar un equipo
potente capaz de soportar altas cargas, con un disco duro grande y rápido, y la cantidad necesaria
de RAM para que no se produzca swapping.
Compilador ANSI C, como por ejemplo el gcc que se distribuye con Linux.
Interprete de Perl 5.003 o superior, para dar soporte a ciertos scripts de instalación escritos
en este lenguaje.
Hay varias formas de hacerse con una copia de Apache, (CDs de revistas, acompañando a
distribuciones Linux, etc.) pero la manera más cómoda de obtener la versión más actualizada
es visitar la zona de descarga (figura 10.1) de la página Web del Apache Group (http://httpd.
apache.org/dist), o alguno de sus mirrors a lo largo del mundo.
10.3. CONSEGUIR UNA COPIA 135
Se tiene un sistema operativo que soporta DSO, y toda la funcionalidad necesaria está
incluida en los módulos por defecto.
o se planea expandir el servidor con módulos de terceras partes que pueden ser
compilados como módulos DSO1 y añadidos a un servidor previamente instalado.
Estos nuevos módulos DSO pueden ser activados simplemente retocando el fichero
de configuración.
Distribución como código fuente: es la única opción disponible cuando se necesita incluir algún
módulo de terceras partes que necesitan “parchear” el código de Apache para funcionar (el
ejemplo más conocido es mod_ssl, que parchea el código incluyendo una API extendida
llamada EAPI). También es la opción a elegir si se desea ejecutar siempre la última versión
del servidor, ya que el código fuente está siempre disponible antes que cualquier versión
precompilada. Una ventaja de esta forma de distribución es que permite ajustar al máximo
los parámetros de optimización del compilador para que el código resultante se ejecute de
la forma más eficiente en nuestra máquina.
1 La mayoría de los módulos soportan este estilo de instalación.
136 CAPÍTULO 10. INSTALANDO APACHE PARA LINUX/UNIX
Se parte de una copia de la última versión estable del software en codigo fuente (a junio de
2001 apache_1.3.20.tar.gz). Es habitual utilizar un directorio estándar (/usr/src) para
desempaquetar los archivos de instalación, pero para los ejemplos de este proyecto se opta por
utilizar otro:
# cd /usr/local/proyecto/src
Se descomprime el archivo usando gzip y se extraen los ficheros que componen el árbol de
instalación con la utilidad tar.
Al compilar se transforman los ficheros de código fuente en código binario ejecutable que entiende
la máquina. En los sistemas tipo Unix/Linux la acción de compilar suele ser asistida por la utilidad
make. Esta es capaz de compilar adecuadamente un proyecto de código en función de un conjunto
de reglas. Las reglas se almacenan en ficheros llamados Makefile que especifican cosas como
el orden de compilación del código fuente, las dependencias, etc. En un Makefile también se
indican distintos objetivos, como crear todo el proyecto (all), limpiar árbol de código fuente
(clean) o instalar el ejecutable previamente compilado (install).
Apache hace uso de make, y además permite personalizar al máximo la configuración por medio
de dos métodos:
Configurar a mano.
Configurar a mano
Este es el método antiguo, era la única forma de hacer las cosas en las versiones anteriores a
Apache 1.3. Para usuarios que ya conociesen Apache quizá sea la manera más cómoda trabajar.
Para modificar la configuración manualmente, se deben seguir varios pasos:
3. Editar el fichero Configuration. Este está muy bien comentado y en el se pueden indicar
instrucciones específicas al compilador C, reglas para generar los Makefiles y módulos
que se van a construir y/o activar.
Usar APACI
Desde la versión 1.3 Apache incorpora el APACI, este es el sistema de instalación recomendado
por los desarrolladores del Apache Group. APACI proporciona un modo sencillo de configurar la
instalación. Se basa en el script ./configure3 al que se le proporcionan opciones en la línea de
comandos. Al ejecutarlo realiza dos acciones fundamentales:
Realiza ciertas comprobaciones sobre el hardware y el software del sistema que pueden
afectar al proceso de compilar Apache.
El ejemplo más sencillo es usar este sistema de configuración para variar la ruta base por defecto
para la instalación:
# ./configure --prefix=/usr/local/proyecto/apache1.3.20
Configuring for Apache, Version 1.3.20
+ using installation path layout: Apache (config.layout)
Creating Makefile
Creating Configuration.apaci in src
Creating Makefile in src
+ configured for Linux platform
+ setting C compiler to gcc
+ setting C pre-processor to gcc -E
+ checking for system header files
+ adding selected modules
+ checking sizeof various data types
+ doing sanity check on compiler and options
Creating Makefile in src/support
Creating Makefile in src/regex
Creating Makefile in src/os/unix
Creating Makefile in src/ap
Creating Makefile in src/main
Creating Makefile in src/lib/expat-lite
Creating Makefile in src/modules/standard
2 Configure con la primera “C” mayúscula, no confundir con el configure del método APACI.
3 Se puede encontrar en la raíz del árbol de instalación.
138 CAPÍTULO 10. INSTALANDO APACHE PARA LINUX/UNIX
Un ejemplo un poco más complejo permite habilitar los módulos que son utilizables
en todas las plataformas (--enable-module=most) y compilarlos como módulos DSO
(--enable-shared=max):
# ./configure --prefix=/usr/local/proyecto/apache1.3.20 \
> --enable-module=most \
> --enable-shared=max
Otra opción interesante es --show-layout que muestra cuales van a ser las ubicaciones
de los ficheros una vez se complete la instalación. Existe un fichero especial llamado
config.layout, en el que se definen varias combinaciones de rutas habituales (GNU, Solaris,
OpenBSD, Suse, RedHat, Apache por defecto, etc.) que pueden ser escogidas con la opción
--with-layout=NOMBRE_DE_LAYOUT.
# ./configure --show-layout
Configuring for Apache, Version 1.3.20
+ using installation path layout: Apache (config.layout)
Installation paths:
prefix: /usr/local/apache
exec_prefix: /usr/local/apache
bindir: /usr/local/apache/bin
# ./configure --with-layout=GNU
Son muchos los parámetros que se pueden pasar al script ./configure, para obtener un listado
completo puede ejecutarse:
# ./configure --help
Cada vez que se ejecuta ./configure se crea un nuevo fichero de nombre config.status4 .
Este fichero contiene la última línea de comando con la que se ejecutó ./configure. Si tiene los
permisos adecuados actúa como un script de shell que puede ejecutarse de nuevo e incluso acepta
nuevos parámetros. Por ejemplo, se puede repetir la configuración anterior pero deshabilitando un
módulo (por ejemplo mod_imap):
# ./config.status "--disable-module=mod_imap"
4 Es creado en el raíz del árbol de instalación.
10.4. INSTALACIÓN DESDE CÓDIGO FUENTE 139
Una vez acabada la configuración de manera correcta se habrán generado los ficheros Makefile
necesarios para que la herramienta make sepa como compilar el proyecto.
# make
===> src
make[1]: Cambiando a ‘/usr/local/proyecto/src/apache_1.3.20’
make[2]: Cambiando a ‘/usr/local/proyecto/src/apache_1.3.20/src’
===> src/regex
sh ./mkh -p regcomp.c >regcomp.ih
gcc -I. -I../os/unix -I../include -DLINUX=22 -DUSE_HSREGEX
-DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED ‘../apaci‘
-DPOSIX_MISTAKE
-c -o regcomp.o regcomp.c
gcc -I. -I../os/unix -I../include -DLINUX=22 -DUSE_HSREGEX
-DUSE_EXPAT -I../lib/expat-lite -DNO_DL_NEEDED ‘../apaci‘
-DPOSIX_MISTAKE
-c -o regexec.o regexec.c
Por último queda que el servidor recién compilado sea movido a su ubicación definitiva. Esta
ubicación habrá sido especificada durante el proceso de configuración:
La utilidad make permite rematar la instalación, para ello se le pasa el parámetro install. Durante
el proceso aparecerán algunos mensajes en pantalla siendo el más importante el último. En este
mensaje final se indica si la instalación ha concluido correctamente, como ejecutar el servidor y
donde está el fichero de configuración:
# make install
+--------------------------------------------------------+
140 CAPÍTULO 10. INSTALANDO APACHE PARA LINUX/UNIX
Si disponemos de una versión de Apache previamente construida con soporte a DSO, podremos
utilizar apxs5 . apxs (APache eXtenSion) es un script Perl que permite instalar un nuevo módulo
DSO sin necesidad de tener el código fuente de Apache. La idea es simple, cuando se instala
Apache, el proceso make install instala los ficheros C de cabecera de Apache y mete en apxs
los flags del compilador y enlazador dependientes de la plataforma para construir ficheros DSO. De
este modo el usuario puede usar apxs para compilar nuevos módulos del servidor sin la necesidad
de disponer del árbol de código fuente de Apache. El uso típico tendrá esta apariencia:
# apxs -i -a -c mod_foo.c
Más información puede obtenerse en las páginas man que se incluye con la distribución de Apache
(man apxs).
La instalación desde código fuente no es compleja, pero si para alguien supone algún problema,
siempre se puede recurrir a la versiones precompiladas. Existen varias posibilidades:
Distribución binaria.
Gestores de paquetes.
5 Desde la versión de Apache 1.3
10.5. INSTALACIÓN DESDE CÓDIGO PRECOMPILADO 141
Puede obtenerse una distribución binaria desde la zona de descarga del sitio web de Apache
Software Foundation (http://www.apache.org/dist/binaries). Existen distribuciones
binarias compiladas para un gran número de sistemas operativos y plataformas hardware. Los
nombres suelen ser explicativos, por ejemplo:
apache_1.3.20-i686-whatever-linux2.tar.gz
# uname -m
i686
Una vez obtenido el archivo de instalación necesario, se seguirán una serie de pasos. Estos pasos
se detallan en el fichero INSTALL que acompaña a la distribución. También se puede saber que
módulos se incluyen en la distribución consultando el fichero README:
1. Se descomprime (con gzip) y extraen los ficheros (con tar) para crear el árbol de
directorios de la instalación.
# cd apache_1.3.20
3. En este directorio se debe ejecutar el script de instalación que moverá los archivos binarios
a las localizaciones adecuadas:
# ./install-bindist.sh
Los gestores de paquetes son la manera de instalar programas que más se está popularizando en
los últimos tiempos.
142 CAPÍTULO 10. INSTALANDO APACHE PARA LINUX/UNIX
El gestor de paquetes de Red Hat es sin duda el más extendido, a ello ha contribuido su naturaleza
open-source. No sólo Red Hat, sino también muchas otras distribuciones de Linux como por
ejemplo Mandrake o Caldera, incluyen el gestor de paquetes rpm.
1. Casi todas las distribuciones de Linux traen un servidor Apache preinstalado, si este es el
caso, el primer paso debe ser desinstalarlo. Por ejemplo en un Red Hat 7 se incluye la
versión apache_1.3.12. Para comprobarlo se le indica al gestor rpm que liste todos los
paquetes instalados (rpm -qa) y que se quede con los que contengan la palabra apache (|
grep apache).
Una vez verificado que existía una versión previa, podemos eliminarla (rpm -e). El gestor
rpm nos indicará si es necesario borrar también algún paquete adicional:
# rpm -e apache-1.3.12-25
error: removing these packages would break dependencies:
apache = 1.3.12-25 is needed by mod_ssl-2.6.6-25
webserver is needed by mod_perl-1.24-4
webserver is needed by mod_dav-1.0.1-2
webserver is needed by mod_php-4.0.1pl2-9
webserver is needed by nut-cgi-0.44.0-4
# rpm -e mod_ssl-2.6.6-25
# rpm -e mod_perl-1.24-4
# rpm -e mod_dav-1.0.1-2
# rpm -e mod_php-4.0.1pl2-9
# rpm -e nut-cgi-0.44.0-4
# rpm -e apache-1.3.12-25
2. Ahora el sistema ya está preparado para recibir la nueva versión de Apache. Instalaremos el
paquere RPM con la opción -i:
# rpm -i apache-1.3.20_i386.rpm
10.5. INSTALACIÓN DESDE CÓDIGO PRECOMPILADO 143
3. Con esto el servidor está listo para su ejecución. Si se tienen dudas sobre que ficheros y en
que directorios ha sido instalado puede ejecutarse:
/usr/lib/apache/mod_vhost_alias.so
/usr/sbin/ab
/usr/sbin/httpd
/usr/sbin/logresolve
/usr/sbin/rotatelogs
/usr/sbin/suexec
/usr/share/man/man1/dbmmanage.1.gz
dpkg
Dpkg es el gestor de paquetes que se utiliza en la distribución Debian. Existen varios programas
que actúan como interface a este sistema, desde el propio dkpg, que permite manejar los paquetes
a bajo nivel y de manera poco agradable al usuario, hasta las utilidades Apt:
apt-cache search: lista los paquetes que contienen la palabra clave indicada, por ejemplo:
apt-get: proporciona un método simple y seguro para instalar o actualizar los paquetes. Por
defecto busca directamente en el fuente desde donde se instaló el sistema (HD, CD, http,
ftp, etc.). Con el parámetro install busca, recupera e instala el paquete seleccionado. Por
ejemplo:
Para más información de como instalar Apache con formato de paquete debian puede consultarse
el sitio http://www.debian.org/.
144 CAPÍTULO 10. INSTALANDO APACHE PARA LINUX/UNIX
Aunque el ejecutable del servidor Web es un fichero que se llama httpd, para el control del
servicio también suele utilizarse un script llamado apachectl. Debido a esto existen dos formas
de realizar las tareas de arranque y parada. Generalmente se automatizan estas tareas para que
tengan lugar con el arranque y parada general de la máquina. Todos los sistemas UNIX/Linux
proporcionan un método de arranque/parada automático. Este se suele basar en scripts que aceptan
los parámetros start para arrancar y stop para parar. Se puede escribir un script personalizado
(basado en httpd) o bien utilizar el propio apachectl.
10.6.1 Arranque
# /usr/local/proyecto/apache1.3.20/bin/httpd
o bien:
# /usr/local/proyecto/apache1.3.20/bin/apachectl start
Tras el primer arranque del servidor a veces se obtienen mensajes de error, generalmente son
pequeños problemas que tienen que ver con la configuración. Junto con el error, Apache suele
dar una buena explicación del motivo del mismo y como solucionarlo. Lo ideal sería no observar
ningún mensaje, eso indica que el servidor ha arrancado correctamente. Para verificarlo puede
utilizar el comando ps y buscar httpd entre los procesos que están ejecutándose actualmente:
10.6.2 Parada
Con el tiempo es probable que sea necesario parar el servidor, un cambio en los ficheros de
configuración es el motivo más habitual. ¿Cómo se hace?. También hay dos posibilidades, por un
lado se puede matar el proceso en función de su identificador numérico (almacenado en el fichero
httpd.pid ):
# /usr/local/proyecto/apache1.3.20/bin/apachectl stop
10.6. ARRANQUE Y PARADA 145
10.6.3 Rearranque
Aunque siempre es posible rearrancar el servidor en dos pasos, primero parar y luego arrancar,
existen otras formas de rearrancar en un sólo paso:
o bien
# /usr/local/proyecto/apache1.3.20/bin/apachectl restart
El motivo más habitual que fuerza al rearranque del servidor es un cambio en la configuración.
Pero, ¿es realmente necesario reiniciar el servidor?. La respuesta es no, llega con indicar a Apache
que vuelva a leer sus ficheros de configuración. Existen dos formas de hacerlo:
o bien
# /usr/local/proyecto/apache1.3.20/bin/apachectl graceful
Este programa proporciona algo más que el arranque del servicio Web. Para conocer todas sus
funcionalidades puede ejecutarse con el parámetro (-h):
# /usr/local/proyecto/apache1.3.20/bin/httpd -h
Usage: httpd [-D name] [-d directory] [-f file]
[-C "directive"] [-c "directive"]
[-v] [-V] [-h] [-l] [-L] [-S] [-t] [-T]
Options:
-D name : define a name for use in <IfDefine name> directives
-d directory : specify an alternate initial ServerRoot
-f file : specify an alternate ServerConfigFile
-C "direct." : process directive before reading config files
-c "direct." : process directive after reading config files
-v : show version number
-V : show compile settings
-h : list available command line options (this page)
146 CAPÍTULO 10. INSTALANDO APACHE PARA LINUX/UNIX
Algunos de los parámetros más interesantes son los que permiten obtener información sobre la
configuración:
httpd -V: muestra información del número de versión, fecha de compilación y todos los
valores por defecto compilados con el servidor. Por ejemplo:
./httpd -V
Server version: Apache/1.3.20 (Unix)
Server built: Aug 9 2001 19:14:48
Server’s Module Magic Number: 19990320:10
Server compiled with....
-D HAVE_MMAP
-D HAVE_SHMGET
-D USE_SHMGET_SCOREBOARD
-D USE_MMAP_FILES
-D USE_SYSVSEM_SERIALIZED_ACCEPT
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D HTTPD_ROOT="/usr/local/proyecto/apache1.3.20"
-D SUEXEC_BIN="/usr/local/proyecto/apache1.3.20/bin/suexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/httpd.scoreboard"
-D DEFAULT_LOCKFILE="logs/httpd.lock"
-D DEFAULT_XFERLOG="/usr/local/proyecto/logs/access_log"
-D DEFAULT_ERRORLOG="/usr/local/proyecto/logs/error_log"
-D TYPES_CONFIG_FILE="/usr/local/proyecto/conf/mime.types"
-D SERVER_CONFIG_FILE="/usr/local/proyecto/conf/httpd.conf"
-D ACCESS_CONFIG_FILE="/usr/local/proyecto/conf/access.conf"
-D RESOURCE_CONFIG_FILE="/usr/local/proyecto/conf/srm.conf"
httpd -l: muestra los módulos que se han compilado dentro del propio httpd (enlazados
estáticamente). Con este comando también puede verificarse que suEXEC6 ha quedado
correctamete instalado. Por ejemplo:
6 suEXEC es un wrapper de ejecución CGI que a veces se instala con el servidor.
10.6. ARRANQUE Y PARADA 147
# ./httpd -l
Compiled-in modules:
http_core.c
mod_so.c
suexec: enabled;
valid wrapper /usr/local/proyecto/apache1.3.20/bin/suexec
httpd -t: cada vez que se arranca el servidor se ejecuta implícitamente un chequeo de la
configuración. Si se necesita realizar un chequeo completo de los archivos de configuración,
pero no interesa que el servidor arranque, entonces se debe usar httpd -t. Por ejemplo:
# ./httpd -t
[Mon Aug 20 18:00:01 2001] [error] VirtualHost *:80 --
mixing * ports and non-* ports with a NameVirtualHost
address is not supported, proceeding with undefined results
Syntax OK
httpd -S: realiza un volcado de la configuración de los hosts virtuales tal y como Apache
la ha analizado. Por ejemplo:
# httpd -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:* is a NameVirtualHost
default server www.ei.universidad.es
(/usr/local/proyecto/conf/httpd.conf:1174)
port * namevhost www.ei.universidad.es
(/usr/local/proyecto/conf/httpd.conf:1174)
port 80 namevhost informatica.ei.universidad.es
(/usr/local/proyecto/conf/httpd.conf:1186)
port 80 namevhost matematicas.ei.universidad.es
(/usr/local/proyecto/conf/httpd.conf:1208)
Agiliza las acciones de control del servicio Web, se puede “levantar” o “tirar” el servidor,
comprobar el estado de ejecución o los archivos de configuración, etc. Un listado completo de
sus funcionalidades se obtiene al ejecutarlo con el parámetro (help).
# /usr/local/proyecto/apache1.3.20/bin/apachectl help
usage: /usr/local/proyecto/apache1.3.20/bin/apachectl (start|stop
|restart|fullstatus|status|graceful|configtest|help)
148 CAPÍTULO 10. INSTALANDO APACHE PARA LINUX/UNIX
149
150 CAPÍTULO 11. CONFIGURACIÓN BÁSICA DEL SERVIDOR
11.1 Introducción
Apache se configura mediante directivas que se escriben como texto plano y se pueden almacenar
en varios ficheros que generalmente residen en el directorio conf. El servidor se construye de
manera modular, cada nuevo módulo proporciona sus propias directivas de configuración.
En este capítulo se muestran cuales son los ficheros, directivas y módulos utilizados en una
configuración básica, además se comentan ciertos aspectos de seguridad relacionados y algunas
herramientas típicas de chequeo de la configuración.
11.2 Ficheros
Las directivas de configuración residen en ficheros de texto plano. Actualmente los desarrolladores
de Apache recomiendan centralizar todas las directivas en httpd.conf, aunque también es posible
distribuirlas entre una serie de ficheros estándar:
httpd.conf: es el fichero principal, donde se deben incluir todas las directivas. Tradicionalmente
en este fichero sólo se incluía la configuración del servidor principal y existían otros
dos ficheros (srm.conf y access.conf) donde se incluían otros tipos de directivas.
httpd.conf es analizado por Apache antes de cualquier otro archivo de configuración.
srm.conf: puede utilizarse para definir los recursos del servidor (como las asignaciones de
directorios o los iconos). En las distribuciones actuales todavía se incluye una copia de
este fichero, aunque el Apache Group recomienda que no se utilice. Si a pesar de ello se
opta por utilizarlo, debe indicarse su localización mediante la directiva ResourceConfig en
el fichero principal httpd.conf.
access.conf: puede utilizarse para definir los permisos de acceso a directorios y localizaciones.
Al igual que el caso anterior, en las distribuciones actuales todavía aparece una copia del
fichero, aunque el Apache Group recomienda que no se utilice. Si se quisiese utilizar debería
incluirse la directiva AccessConfig en el fichero principal httpd.conf.
otros ficheros globales: existen varios módulos que requieren ficheros de configuración
adicionales, por ejemplo, el módulo mod_mime_magic necesita un fichero llamado magic.
Y el módulo mod_mime utiliza un fichero llamado mime.types.
AccessFileName, directiva Apache
.htaccess: son unos ficheros especiales que permiten la gestión descentralizada de Apache.
El nombre .htaccess se ha elegido por convenio y puede modificarse con la directiva
152 CAPÍTULO 11. CONFIGURACIÓN BÁSICA DEL SERVIDOR
11.3 Módulos
Apache es un programa modular, esto quiere decir que sólo la funcionalidad más básica se incluye
en el núcleo2 del servidor. El resto de características pueden ser cargadas como módulos. Por
defecto se incluyen un conjunto básico de ellos cuando se compila el servidor. Si se ha compilado
con soporte a DSO (vea el apéndice B en la página 367), los módulos serán ficheros separados que
pueden ser añadidos en cualquier momento mediante la directiva LoadModule. Incluso puede
utilizarse una configuración con directivas condicionales, de manera que se pueda detectar la
presencia o no de los módulos mediante un bloque <IfModule>.
11.4 Directivas
Apache es configurado mediante directivas. Cada módulo ofrece las suyas, esto hace que exista
una gran cantidad. Actualmente se enumeran en la documentación de Apache 210 directivas (sin
contar las de muchos módulos de terceras partes). El número de directivas no debe asustar, en
realidad la configuración de un servidor básico puede realizarse sólo con unas pocas.
En el resto de este capítulo se van a hacer un repaso de las directivas más básicas. Pero, ¿cómo
se define una directiva? En la documentación de Apache se muestra cuál es el formato común de
descripción que todas las directivas de cualquier módulo deben seguir. La “ficha” de una directiva
típica incluye:
Context: lista_de_contextos.
Override: característica_sobreescritura.
Status: estado.
1 Esto puede ser un poco ineficiente en directorio muy visitados.
2 Traducción libre del inglés core.
11.4. DIRECTIVAS 153
Module: nombre_del_módulo.
Compatibility: notas_de_compatibilidad.
Para algunas directivas no es necesario incluir todos estos campos, de todas formas, es conveniente
conocer cuál es significado de cada uno. Para ello pueden consultarse los siguientes apartados.
Syntax (sintaxis)
Hay directivas que tienen un valor por defecto, es decir, que si no aparecen en el fichero de
configuración, el servidor Web procede considerando un valor predeterminado.
Context (contexto)
Context: lista_de_contextos
El contexto indica donde es válido aplicar una directiva. Si se intenta colocar una directiva fuera de
su contexto se obtiene un error de configuración y el servidor no arrancará. Si es correcto aplicar
la directiva en varios sitios, estos aparecen como una lista separada por comas. Los posibles
contextos son los siguientes:
server config: indica que la directiva puede ser utilizada en los ficheros de configuración
del servidor (httpd.conf, srm.conf y access.conf), pero no dentro de un host virtual
<VirtualHost>, directorio <Directory> o fichero .htaccess.
virtual host: indica que la directiva puede ser utilizada dentro del contenedor
<VirtualHost>.
directory: indica que la directiva puede ser utilizada dentro de los contenedores
<Directory>, <Location> y <Files>.
Override (sobreescribe)
Override: característica_sobreescritura
Este atributo indica que configuración de sobreescritura debe estar activa para que la directiva
sea procesada cuando aparece en un fichero .htaccess. La sobreescritura la maneja la directiva
AllowOverride, esta puede establecer distintos valores que indican el grado de sobreescritura
permitido.
Status (status)
Status: estado
El estado indica el grado de integración entre el módulo que contiene a la directiva y el servidor
Web Apache.
Core: la directiva forma parte del núcleo de Apache, y por tanto estará siempre disponible.
Base: la directiva es soportada por uno de los módulos estándar. Estos módulos se compilan
por defecto con el servidor, por tanto, si se ha hecho una instalación típica la directiva
debería estar disponible.
Extension: la directiva la proporciona un módulo que se distribuye con Apache, pero que
no es compilado por defecto. Para poder utilizar la funcionalidad de esta directiva se debe
recompilar el servidor habilitando el módulo en cuestión.
Module (módulo)
Module: nombre_del_módulo
Compatibility (compatibilidad)
Compatibility: notas_de_compatibilidad
Con objeto de proporcionar una visión global se presentarán en la siguiente sección algunas de
las directivas más importantes. Para cada una de ellas se incluye un ejemplo que no es más que
el “pedazo” de fichero httpd.conf por defecto donde aparece4 . Mostrar todas las directivas una
tras otra es poco didáctico (y además ya está hecho en la documentación on-line de Apache [16])
por ello se ha decidido presentarlas atendiendo a esta clasificación:
Estas directivas se usan para configurar el servidor en sí mismo (son válidas en el contexto server
config, y en algunos casos también en virtual host). Los valores de configuración a este nivel
son heredados por los hosts virtuales a no ser que sean específicamente sobreescritos. Al afectar al
servidor de manera global es muy importante establecer estas directivas con sus valores adecuados,
aunque en la mayoría de los casos la configuración por defecto de Apache puede ser capaz de
determinarlos por si mismo. Se puede hacer una subclasificación:
ServerAdmin
Estado: core
4 Si los hay, se incluyen los comentarios originales.
156 CAPÍTULO 11. CONFIGURACIÓN BÁSICA DEL SERVIDOR
Configura la dirección de correo que incluye el servidor en cualquier mensaje de error enviado al
cliente.
Un ejemplo sería:
ServerAdmin txapi@montsfortis.micasa.es
ServerName
Estado: core
Establece el nombre y dominio del host del servidor, que se utilizará para crear URLs absolutas.
Si no se incluye esta directiva, Apache intenta determinar este valor por si mismo. Es posible que
el nombre determinado no sea el adecuado5 y a veces simplemente no puede encontrar el nombre
porque no está disponible la resolución inversa de nombres. En estos casos, cuando se ejecuta el
servidor Web la primera vez, se obtiene un error:
Puede corregirse editando el fichero de configuración y estableciendo el valor correcto para esta
directiva. También se puede usar ServerName dentro de hosts virtuales, especificando el nombre
completamente cualificado de cada uno de ellos.
Un ejemplo sería:
ServerSignature
Estado: core
Permite la configuración del pie de página que aparece en ciertos mensajes generados por el
servidor (mensajes de error, salida de mod_info, etc.).
Si se utiliza ServerSignature On, se añade una línea con el número de versión de Apache, el
nombre del servidor ServerName, y el email del responsable ServerAdmin. Un ejemplo sería:
AccessFileName
Estado: core
Establece el nombre del fichero, que contenido en un directorio, obliga al servidor a buscar
en él posibles restricciones de acceso. Este comportamiento es regulado por la directiva
AllowOverride.
<Directory />
AllowOverride None
</Directory>
/.htaccess
/usr/.htaccess
/usr/local/.htaccess
/usr/local/apache/.htaccess
/usr/local/apache/htdocs/.htaccess
Un ejemplo sería:
AddModule
Estado: core
El servidor puede tener módulos compilados, pero no en uso. Con esta directiva poden habilitarse.
Un ejemplo sería:
AddModule mod_vhost_alias.c
AddModule mod_env.c
---- Omitimos varias líneas ----
ClearModuleList
Sintaxis: ClearModuleList
Estado: core
El servidor trae una lista preconstruida de módulos activos. Esta directiva limpia la lista. Se asume
que luego la lista de módulos va a ser reconstruída usando directivas AddModule.
Un ejemplo sería:
DocumentRoot
Estado: core
Establece el directorio desde el que se sirven los ficheros. A menos que la petición corresponda a
un Alias, el servidor usa esta directiva para determinar la ubicación absoluta del fichero solicitado.
Un ejemplo sería:
<IfModule>
Defecto: None
Contexto: all
Estado: core
La directiva <IfModule test>...</IfModule> define una sección que se usa para marcar una serie
de directivas condicionales. Dentro de esta sección las directivas sólo se procesan si el test
devuelve verdadero. Esta directiva en anidable, dando lugar a comprobaciones complejas.
Un ejemplo sería:
LoadModule
Estado: base
Módulo: mod_so.
Esta directiva enlaza la biblioteca contenida en nombre-fichero y añade la estructura del módulo
con el nombre módulo a la lista de módulos. El argumento módulo es el nombre de la variable
externa (de tipo módulo). El listado de las disponibles se lista como identificador de módulo en la
documentación sobre módulos de Apache.
Un ejemplo sería:
PidFile
Estado: core
Establece el fichero en el que se almacena el identificador de proceso para el servidor Web. Esta
directiva sólo se usa en el modo de ejecución standalone y se suele utilizar en los scripts que paran
o rearrancan el servidor (vea la sección 10.6 en la página 144):
Un ejemplo sería:
# PidFile: The file in which the server should record its process
# identification number when it starts.
#
PidFile /usr/local/apache/logs/httpd.pid
ScoreBoardFile
Estado: core
Esta directiva se usa en algunas arquitecturas como un fichero de comunicación entre procesos
hijos y padre. En Linux no es necesario. Para saber si nuestro sistema necesita de un
ScoreBoardFile o no, la mejor forma es ejecutar Apache y controlar si el fichero es creado.
Un ejemplo sería:
ServerRoot
Estado: core
Establece el directorio donde reside el servidor. En los ficheros de configuración, todas las rutas
relativas lo serán respecto a este directorio. En una instalación típica bajo el directorio que se
establece en ServerRoot aparecerán directorios como conf o logs.
Se puede especificar el valor de esta directiva al ejecutar el servidor desde la línea de comandos.
Esto permite, poder lanzar distintos servidores con sólo un ejecutable y distintas configuraciones.
Por ejemplo:
/usr/local/apache/bin/httpd -d /usr/local/proyecto/apache1
Un ejemplo sería:
# ServerRoot: The top of the directory tree under which the server’s
# configuration, error, and log files are kept.
#
164 CAPÍTULO 11. CONFIGURACIÓN BÁSICA DEL SERVIDOR
Group
Estado: core
Establece el grupo bajo el que el servidor responde las peticiones. Al igual que con User, para
ejecutar esta directiva se debe estar ejecutando el servidor en modo standalone.
Un ejemplo sería:
Group nobody
MaxClients
Estado: core
Si se tienen más peticiones simultáneas que las que permite esta directiva, serán introducidas en
una cola hasta que un proceso hijo quede libre.
Un ejemplo sería:
MaxRequestsPerChild
Defecto: MaxRequestsPerChild 0
Estado: core
Establece el límite en el número de peticiones que puede manejar un proceso hijo. Si el valor es
“0” el proceso hijo puede manejar un número ilimitado de peticiones. Un valor distinto de “0”
tiene efectos beneficiosos:
1. Limita la cantidad de memoria que el proceso consume. Esta es una buena medida de
protección anre un problema de memoria accidental.
2. Dando a los procesos un tiempo finito, se reduce el número de procesos cuando la carga
baja.
Un ejemplo sería:
MaxSpareServers
Defecto: MaxSpareServers 10
Estado: core
Establece el número máximo de procesos hijos inactivos. El proceso padre se encarga de matar
algún proceso hijo cuando se supera el valor establecido en esta directiva.
El ajuste de esta directiva es necesario en sitios con mucha carga. Establecer un valor alto no suele
ser buena idea.
Un ejemplo sería:
MaxSpareServers 10
MinSpareServers
Defecto: MinSpareServers 5
Estado: core
11.5. DEFINICIÓN DEL ENTORNO DEL SERVIDOR PRINCIPAL 167
Establece el número mínimo de procesos hijos inactivos. Un proceso inactivo es aquel que no
está manejando una conexión. El proceso padre puede crear nuevos procesos hijos a un ritmo
máximo de uno por segundo. Las consideraciones de uso de esta directiva son las mismas que
para MaxSpareServers.
Un ejemplo sería:
#
# Server-pool size regulation. Rather than making you guess how many
# server processes you need, Apache dynamically adapts to the load it
# sees --- that is, it tries to maintain enough server processes to
# handle the current load, plus a few spare servers to handle transient
# load spikes (e.g., multiple simultaneous requests from a single
# Netscape browser).
#
# It does this by periodically checking how many servers are waiting
# for a request. If there are fewer than MinSpareServers, it creates
# a new spare. If there are more than MaxSpareServers, some of the
# spares die off. The default values are probably OK for most sites.
#
MinSpareServers 5
ServerType
Estado: core
Un ejemplo sería:
StartServers
Defecto: StartServers 5
Estado: core
Un ejemplo sería:
User
Estado: core
Configura el identificador de usuario con el que el servidor responderá las peticiones. Para usar
esta directiva se debe estar ejecutando el servidor en modo standalone.
Un ejemplo sería:
#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# . On SCO (ODT 3) use "User nouser" and "Group nogroup".
# . On HPUX you may not be able to use shared memory as nobody, and the
# suggested workaround is to create a user www and use that user.
# NOTE that some kernels refuse to setgid(Group) or semctl(IPC_SET)
# when the value of (unsigned)Group is above 60000;
# don’t use Group nobody on these systems!
#
User nobody
KeepAlive
Esta directiva tiene ligeros cambios de sintaxis y uso dependiendo de las versiones de Apache,
aquí sólo se indica el formato válido para las últimas versiones.
Defecto: KeepAlive on
Estado: core
Esta directiva habilita o deshabilita la característica KeepAlive de HTTP (vea la sección 2.3.2 en
la página 31).
Un ejemplo sería:
170 CAPÍTULO 11. CONFIGURACIÓN BÁSICA DEL SERVIDOR
#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On
KeepAliveTimeout
Defecto: KeepAliveTimeout 15
Estado: core
Número de segundos que Apache esperará por la siguiente petición antes de cerrar la conexión.
Un valor alto de KeepAliveTimeout puede causar problemas de rendimiento en servidores con
mucha carga, ya que obliga al servidor a mantener más conexiones inactivas esperando por los
clientes.
Un ejemplo sería:
Listen
Estado: core
Le dice a Apache que escuche en más de una dirección IP o puerto; por defecto Apache escucha
en todas las IP, pero sólo en el puerto indicado por Port.
Un número de puerto sin dirección IP hace que Apache escuche esos puertos para todas las
interfaces. Por ejemplo, se pueden especificar los siguiente puertos:
Listen 80
Listen 8080
Una dirección IP y número de puerto hace que Apache escuche exactamente esa dirección y puerto.
Listen 193.147.87.2:80
Listen 193.147.87.2:8080
#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, in addition to the default. See also the <VirtualHost>
# directive.
#
#Listen 3000
#Listen 12.34.56.78:80
MaxKeepAliveRequests
Estado: core
Limita el número de peticiones permitidas por conexión cuando KeepAlive está “on”. Si se le da
el valor “0”, se permite un número ilimitado de peticiones.
Un ejemplo sería:
172 CAPÍTULO 11. CONFIGURACIÓN BÁSICA DEL SERVIDOR
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100
Port
Defecto: Port 80
Estado: core
El número se refiere a un puerto y estará en un rango entre 0 y 65535. Los números menores a
1024 están reservados para servidores bien conocidos. El puerto estándar de http es el 80.
Esta directiva no afecta a la configuración de host virtuales, que tienen su propia forma de
especificar el puerto en el que escuchan.
El puerto 80 es un puerto reservado (<1024), en el que sólo pueden escuchar demonios arrancados
por el root. Una vez iniciado el servidor este trabajará con los permisos de usuario y grupo
especificados en las directivas User, Group. Un ejemplo sería:
8 Este comportamiento un poco extraño, se mantiene por compatibilidad con el servidor de NCSA
11.5. DEFINICIÓN DEL ENTORNO DEL SERVIDOR PRINCIPAL 173
TimeOut
Estado: core
Define una cantidad de tiempo en segundos. Esta cantidad será el tiempo máximo que Apache
espera a recibir:
Un ejemplo sería:
#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300
UseCanonicalName
Defecto: UseCanonicalName on
Sobreescibe: Options
Con UseCanonicalName on, el servidor es capaz de construir una URL de referencia al mismo
servidor usando los valores de las directivas ServerName y Port. En versiones anteriores de
Apache se lograba el mismo resultado combinando las variables de entorno SERVER_NAME y
SERVER_PORT .
174 CAPÍTULO 11. CONFIGURACIÓN BÁSICA DEL SERVIDOR
Con UseCanonicalName off, el servidor es capaz de construir una URL de referencia, con los
datos que el cliente proporciona. Si tales datos no existen se usará el nombre canónico.
UseCanonicalName DNS, está pensado para su uso en servidores que alojan múltiples host
virtuales basados en IP y clientes que no proporcionan el nombre del servidor. Apache realiza
una resolución inversa de la IP solicitada para construir referencias URL al propio servidor.
Un ejemplo sería:
11.6.1 AddIcon
Sobreescribe: Indexes
Estado: base
Módulo: mod_autoindex.
Cuando se usa FancyIndexing en los listados de directorio se asignan iconos a cada tipo de
fichero. Esta directiva indica el icono a usar para un determinado fichero. El Apache Group
recomienda usar AddIconByType en vez de AddIcon, cuando sea posible.
El icono puede tener las mismas apariencias que en la directiva anterior. El nombre puede tener
como valores:
Extensión.
Un ejemplo sería:
11.6.2 AddIconByEncoding
Sobreescribe: Indexes
Estado: base
Módulo: mod_autoindex.
Cuando se usa FancyIndexing en los listados de directorio se asignan iconos a cada tipo
de fichero. Configura el icono a mostrar junto a los ficheros con una codificación-MIME
determinada. El icono puede ser:
La codificación-MIME es una patrón con comodines que concuerda con la codificación del
contenido.
Un ejemplo sería:
#
# AddIcon* directives tell the server which icon to show
# for different files or filename extensions.
# These are only displayed for
176 CAPÍTULO 11. CONFIGURACIÓN BÁSICA DEL SERVIDOR
# FancyIndexed directories.
11.6.3 AddIconByType
Sobreescribe: Indexes
Estado: base
mod_autoindex.
Cuando se usa FancyIndexing en los listados de directorio se asignan iconos a cada tipo de
fichero. Configura el icono a mostrar junto a los ficheros de un tipo-MIME determinado. El
icono puede ser:
El tipo-MIME es una patrón con comodines que concuerda con los tipos Mime.
Un ejemplo sería:
11.6.4 DefaultIcon
Defecto: DefaultIcon
11.6. INDEXACIÓN DE DIRECTORIOS 177
Sobreescribe: Indexes
Estado: base
Módulo: mod_autoindex.
Cuando se usa FancyIndexing en los listados de directorio se asignan iconos a cada tipo de
fichero. DefaultIcon establece el icono a mostrar para ficheros que no tienen asignado ningún
otro icono. path-URLindica la URL url encoded hasta el icono.
Un ejemplo sería:
11.6.5 DirectoryIndex
Estado: base
Módulo: mod_dir.
Establece la lista de recursos a buscar cuando un cliente realiza una petición de un directorio.
URL-locales la codificación-URL del documento relativo al directorio dado, generalmente es una
página Web de índice. Si no existe en el directorio ninguno de los recursos indicados, y la opción
Indexes está activada, se muestra el listado del directorio.
Un ejemplo sería:
11.6.6 HeaderName
Sobreescribe: Indexes
Estado: base
Módulo: mod_autoindex.
Un ejemplo sería:
11.6.7 IndexIgnore
Defecto: .
Sobreescribe: Indexes
Estado: base
Módulo: mod_autoindex.
11.6. INDEXACIÓN DE DIRECTORIOS 179
Añade ficheros a la lista de ficheros que deben ser ocultados en los listados de directorio. fichero
puede ser una extensión, una nombre parcial, una expresión con comodines, o el nombre completo
del fichero a ignorar.
Un ejemplo sería:
11.6.8 IndexOptions
Sobreescribe: Indexes
Estado: base
Módulo: mod_autoindex.
IconsAreLinks: hace que los iconos formen parte del enlace del fichero al que representan.
ScanHTMLTitles: extrae información del título de los documentos HTML para presentar en el
listado mejorado.
SuppressColumnSorting: hace que las columnas de la cabecera no sean enlaces que ordenan el
listado.
TrackModified: devuelve datos sobre los ficheros como parte de las cabeceras HTTP. El cliente
puede darse cuenta de los cambios cuando ejecuta una petición HEAD.
Un ejemplo sería:
11.6.9 ReadmeName
Sobreescribe: Indexes
Estado: base
Módulo: mod_autoindex.
# ReadmeName is the name of the README file the server will look for by
# default, and append to directory listings.
# If MultiViews are amongst the Options in effect, the server will
# first look for name.html and include it if found. If name.html
# doesn’t exist, the server will then look for name.txt and include
# it as plaintext if found.
#
ReadmeName README
11.7.1 Alias
Estado: base
Módulo: mod_alias.
Esta directiva permite que documentos sean almacenados en partes del sistema local de ficheros
que no están bajo el DocumentRoot.
El path-URL es una ruta codificada como URL (vea la sección A.3 en la página 362) que es
mapeada al directorio-fichero. Por ejemplo:
9 Algunas consideraciones más complejas pueden encontrarse en la documentación de Apache [16]
182 CAPÍTULO 11. CONFIGURACIÓN BÁSICA DEL SERVIDOR
Deberían utilizarse las directivas <Directory> o <Location> para configurar adecuadamente las
localizaciones a las que se refieren los alias.
Una cosa a tener en cuenta es que si el path-URL incluye una barra “/” al final, esta deberá formar
parte obligatoriamente del URL. Por ejemplo con:
Un ejemplo:
<Directory "/usr/local/apache/icons">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<\IfModule>
11.7.2 <Directory>
Estado: core
1. Un path completo.
3. Desde Apache 1.2 también se permiten expresiones regulares extendidas (vea el apéndice C
en la página 373), para ello se indica en primer lugar el carácter ~.
11.7.3 <Files>
Estado: core
Proporciona una sección para el control de acceso por fichero. Permite un grano más fino que
con <Directory> o Location. Las directivas dentro de la sección se aplicarán a los ficheros que
emparejen con el patrón especificado.
3. Desde Apache 1.2 también se permiten expresiones regulares extendidas (vea el apéndice C
en la página 373), para ello se indica en primer lugar el carácter ~.
Un ejemplo sería:
#
# The following lines prevent .htaccess files from being viewed by
# Web clients. Since .htaccess files often contain authorization
# information, access is disallowed for security reasons. Comment
# these lines out if you want Web visitors to see the contents of
# .htaccess files. If you change the AccessFileName directive above,
# be sure to make the corresponding changes here.
#
# Also, folks tend to use names such as .htpasswd for password
# files, so this will protect those as well.
#
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>
11.7.4 <Limit>
Contexto: any
Estado: core
Controla el acceso dependiendo del método HTTP solicitado. Las directivas dentro de <Limit>
sólo se aplicarán a las peticiones HTTP realizadas con el método de acceso especificado. La
directiva <LimitExcept> funciona como la negación de la directiva Limit.
Por ejemplo, las siguientes directivas indican que para los métodos POST, PUT y DELETE se
requiere un usuario válido (usuario1) y que también se requerirá un usuario válido (usuario2)
cuando la petición se realiza con cualquier método que no sea GET:
Un ejemplo sería:
<LimitExcept GET>
Require valid-user usuario2
</Limit>
11.7.5 <Location>
Estado: core
Esta directiva proporciona control de acceso mediante URLs. En cierto modo su funcionamiento
es muy similar al de <Directory>. Las secciones definidas por <Location> se procesan en el
orden en que aparecen en el fichero de configuración, después de que hayan sido procesadas las
secciones definidas por <Directory>, los ficheros .htaccess y las secciones <Files>.
186 CAPÍTULO 11. CONFIGURACIÓN BÁSICA DEL SERVIDOR
Lo que diferencia a <Location> es que no se refiere a ningún punto específico del sistema de
ficheros, sino a una URL. La URL a ser emparejada es de la forma /ruta/ y no deben incluirse
prefijos como http://nombredelservidor10 .
<Location /status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from .foo.com
</Location>
<Location> permite incluir caracteres comodín (* ?) para determinar las URLs a las que afecta,
de todas formas, para utilizar versiones más potentes de expresiones regulares se puede usar la
directiva <LocationMatch>.
11.7.6 ScriptAlias
Estado: base
Módulo: mod_alias.
http://www.ejemplo.com/cgi-bin/test-cgi
10 Este comportamiento cambia si nuestro servidor funciona como un proxy.
11.7. DIRECTIVAS CONTENEDORAS Y ALIAS 187
El servidor Web se da cuenta de que está en un directorio ScriptAlias, e intenta tratarlo como
un programa, y no solamente devolver su contenido. Comenzará la ejecución CGI del siguiente
fichero:
/home/httpd/cgi-bin/test-cgi
Existe también la directiva ScriptAliasMatch, que funciona de manera parecida pero utilizando
expresiones regulares estándar en vez de rutas. La expresión regular, si empareja con la URL es
mapeada a un directorio-fichero.
11.7.7 <VirtualHost>
Estado: core
188 CAPÍTULO 11. CONFIGURACIÓN BÁSICA DEL SERVIDOR
<VirtualHost> ... </VirtualHost> se usan para crear una sección de directivas que se aplicarán
a un host virtual. Obviamente las directivas incluidas en la sección deben estar permitidas en el
contexto “server config”.
La dirección-IP puede ser una IP o un nombre de dominio completamente cualificado. Como
dirección-IP también puede usarse el nombre especial _default_ , utilizado en un host virtual,
hace que este responda a cualquier IP no configurada explícitamente en otro grupo <VirtualHost>.
Cada host virtual debe corresponderse con una dirección IP, un número de puerto o un nombre para
el servidor.
Es posible especificar varias direcciones IP, esto en útil para una máquina que responde a dos
interfaces distintas con el mismo nombre. Puede indicarse también un número de puerto específico
en cada <VirtualHost>. Si no es así, por defecto, el host virtual escucha el puerto especificado en
la directiva Port. También se puede referir a todos los números de puerto con el carácter comodín
“*”.
El uso de una dirección-IP en <VirtualHost> no asegura que Apache escuche en esa dirección.
Se necesita la directiva Listen para hacerlo.
Un ejemplo:
<VirtualHost 10.1.2.3>
ServerAdmin webmaster@miequipo.com
DocumentRoot /usr/local/htdocs/miequipo.com
ServerName www.miequipo.com
</VirtualHost>
11.8.1 AddCharset
Sobreescribe: FileInfo
Estado: base
Módulo: mod_mime.
AddLanguage ja .ja
AddCharset ISO-2022-JP .jis
Un ejemplo sería:
11.8.2 AddEncoding
Sobreescribe: FileInfo
Estado: base
Módulo: mod_mime.
11 El argumento extensión no es sensible a las mayúsculas y puede llevar punto o no.
190 CAPÍTULO 11. CONFIGURACIÓN BÁSICA DEL SERVIDOR
Esto indica que los ficheros de extensión .gz han sido codificados son x-gzip12 .
Un ejemplo sería:
11.8.3 AddLanguage
Sobreescribe: FileInfo
Estado: base
Módulo: mod_mime.
AddLanguage es .es
Un documento de nombre xxx.html.es será tratado como un documento html escrito en idioma
español. La directiva AddLanguage es útil para que el servidor haga negociación de contenido,
devolviendo documentos en función de las preferencias de idioma del cliente.
Un ejemplo sería:
12 El estándar dice que esto es equivalente a gzip.
11.8. TIPOS MIME 191
11.8.4 AddType
Sintaxis: AddType tipo-MIME extensión (vea la nota al pie 11 en la página 189) [extensión]
...
Sobreescribe: FileInfo
Estado: Base
192 CAPÍTULO 11. CONFIGURACIÓN BÁSICA DEL SERVIDOR
Módulo: mod_mime.
La directiva AddType hace corresponder un tipo de contenido especificado tipo-MIME con las
extensiones13 de fichero dadas extensión . Esta correspondencia es añadida sobreescribiendo
cualquier otra que ya exista para la misma extensión. Se suele usar esta directiva para
correspondencias que no existen en el fichero de tipos MIME, indicado con la directiva
TypesConfig.
El Apache Group recomienda añadir nuevos tipos usando esta directiva, mejor que cambiar el
contenido del fichero definido por TypesConfig.
Un ejemplo sería:
11.8.5 DefaultType
Sobreescribe: FileInfo
13 En el servidor de NCSA httpd también se permitía asignar tipos MIME a nombres de fichero. Apache no lo permite.
Estado: core
En ocasiones el servidor recibe peticiones de documentos de tipos que no puede determinar con la
información que conoce sobre tipos MIME. Para estas ocasiones se define un tipo por defecto.
Un ejemplo sería:
# DefaultType is the default MIME type the server will use for a
# document if it cannot otherwise determine one, such as from
# filename extensions.
# If your server contains mostly text or HTML documents,
# "text/plain" is a good value. If most of your content is binary,
# such as applications# or images, you may want to use
# "application/octet-stream" instead to keep browsers from trying
# to display binary files as though they are text.
#
DefaultType text/plain
11.8.6 LanguagePriority
Sobreescribe: FileInfo
Estado: base
Módulo: mod_negotiation.
Esta directiva establece la precedencia entre los posibles idiomas, caso de que el cliente no indique
una y sestén manejando Multiviews.
Esta directiva sólo tiene efecto si el servidor no tiene ninguna forma mejor de determinar el
idioma14 .
Un ejemplo sería:
11.8.7 MIMEMagicFile
Defecto: None
Estado: extensión
Módulo: mod_mime_magic.
Con esta directiva se habilita el módulo que controla el tipo MIME de los ficheros atendiendo a su
número mágico. Este número no es más que un patrón que se repite en el contenido de todos los
ficheros con el mismo tipo, identificándolos.
Un ejemplo sería:
<IfModule mod_mime_magic.c>
MIMEMagicFile /usr/local/apache/conf/magic
</IfModule>
11.9.1 CustomLog
Estado: Base
Módulo: mod_log_config.
Se utiliza para configurar el log de Apache a nuestra medida. El logging puede hacerse incluso
condicional en función de variables de entorno. El primer argumento especifica la localización en
donde deben ser escritos los logs. Puede elegirse una de las siguientes:
pipe: El carácter de tubería (pipe) seguido de la ruta hasta un programa que sepa manejar la
información de log.
El segundo argumento indica que va a ser escrito en el fichero de log. Se puede usar un “nickname”
definido en una directiva LogFormat o una cadena de formato de log.
Un ejemplo sería:
ErrorLog
Estado: core
Establece el nombre-fichero en el que se almacena el log de los errores del servidor. Si el nombre
comienza por una barra vertical (pipe), lo que le sigue es el nombre del proceso que maneja los
logs. Por ejemplo, puede utilizarse una herramienta como cronolog (vea la sección 19.3.5 en la
página 283) para dividir nuestros logs de manera temporal. En vez de nombre-fichero también
se puede usar syslog.
Un ejemplo sería:
#
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a <VirtualHost>
# container, that host’s errors will be logged there and not here.
11.9. UTILIDADES DE LOG 197
ErrorLog /usr/local/apache/logs/error_log
HostNameLookups
Estado: core
Compatibilidad: las características básicas están disponibles en todas las versiones, double
sólo desde Apache 1.3.
HostNameLookups on, habilita búsquedas DNS para que los nombres de los host del cliente
puedan guardarse en el log.
HostNameLookups double, habilita búsquedas inversas dobles15 en el DNS para que los nombres
de los host del cliente puedan guardarse en el log. Este tipo de búsqueda en el DNS hace primero
una búsqueda inversa, y luego una búsqueda normal con el valor obtenido. Al menos uno de los
resultados debe coincidir con el inicial.
HostNameLookups off, lo que mejora el rendimiento al evitar las costosa latencia de las
búsquedas en el DNS. De todas formas siempre se pueden usar herramientas offline como
logresolve, o analog para obtener los nombres de dominio desde las IPs almacenadas en el log.
Un ejemplo sería:
HostnameLookups Off
15 Para gente realmente preocupada por saber de verdad el host del cliente.
198 CAPÍTULO 11. CONFIGURACIÓN BÁSICA DEL SERVIDOR
11.9.2 LogFormat
Estado: base
Módulo: mod_log_config.
Especifica el formato de el fichero de log de accesos. Los argumentos pueden tomar dos formas:
Un argumento simple indica el formato por medio de una cadena con símbolos especiales.
Este formato será el que se aplica luego en la directiva TransferLog.
Dos argumentos se usan para asociar un formato con un nickname que servirá luego para
ser referenciado en otras directivas LogFormat o CustomLog, sin tener que repetir toda la
cadena. Con dos argumentos la directiva no tiene ningún efecto sobre TransferLog.
Un ejemplo sería:
#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"
\"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
11.9.3 LogLevel
Estado: core
Módulo: mod_log_config.
Ajusta el nivel de explicación para los mensajes almacenados en el log. Existen varios niveles
posibles:
Se recomienda el uso de un nivel mínimo de crit. Cuando se elige un nivel, todos los mensajes
de niveles superiores son mostrados también.
Un ejemplo sería:
#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn
11.9.4 TransferLog
Defecto: none
Estado: base
Módulo: mod_log_config.
Tiene los mismos argumentos y efectos que CustomLog, con la excepción de que no admite que
el formato de log se indique explícitamente. En vez de ello el formato de log se determina por la
directiva LogFormat más reciente. Se utiliza el common log si no existe una directiva LogFormat
específica.
Un ejemplo sería:
11.10.1 Allow
Sobreescribe: Limit
Estado: base
Módulo: mod_access.
Afecta a los host que en principio pueden acceder16 a un área del servidor. El acceso puede
ser controlado por nombre, IP, rango de IPs, o por otras características de la petición del cliente
capturadas como variables de entorno.
dirección IP parcial: permite el acceso a subredes, indicando para ello uno, dos o tres
bytes de la dirección de red. Por ejemplo:
red/máscara: define los host que tienen acceso a través de un número de red y su
máscara. Por ejemplo:
Un ejemplo sería:
<Directory />
AllowOverride None
Order allow,deny
Allow from all
</Directory>
Existe una directiva deny que funciona justo al contrario y sirve para marcar a que hosts no se
puede acceder.
11.10.2 AllowOverride
Contexto: directory
Estado: core
Cuando el servidor encuentra un fichero .htaccess necesita saber que directivas declaradas en el
mismo pueden sobreescribir directivas de acceso previas. Si AllowOverrride se establece a None,
entonces los ficheros .htaccessse ignoran por completo. Si AllowOverrride se establece a All,
entonces los cualquier directiva dentro de los ficheros .htaccess serán permitidas.
FileInfo: Permite el uso de directivas de control de tipos de documentos, como por ejemplo
AddEncoding.
Indexes: Permite el uso de directivas de control de indexado de directorios, como por ejemplo
AddDescription.
Limit: Permite el uso de directivas de control de acceso al host (Allow, Deny y Order).
Un ejemplo sería:
11.10.3 Options
Sobreescribe: Options
Estado: core
La directiva Options controla que características del servidor están disponibles en un directorio
particular.
El valor asignado puede ser None , en cuyo caso ninguna característica extra es activada, o bien al
menos una de las siguientes:
FollowSymLinks: El servidor sigue los enlaces simbólicos dentro del directorio. Si se sigue un
enlace simbólico, el pathname que emparejó con la directiva Directory no cambia. Esta
opción no tiene efecto dentro de la directiva Location.
Indexes: Si una URL referencia un directorio en el que no existe un fichero considerado como
índice (directiva DirectoryIndex), entonces el servidor devuelve un listado formateado del
contenido del directorio.
En general las opciones no se mezclan, si no que se escoge la más específica. Si se pretende que
se mezclen pueden utilizarse los modificadores [+|-].
Un ejemplo sería:
204 CAPÍTULO 11. CONFIGURACIÓN BÁSICA DEL SERVIDOR
11.10.4 Order
Sobreescribe: Limit
Estado: base
Módulo: mod_access.
Controla el estado de acceso por defecto en el que las directivas Allow, y Deny son evaluadas. El
valor orden puede ser uno de los siguientes:
Deny,Allow: La directiva Deny se evalúa antes que Allow. Por defecto el acceso estará permitido,
lo que implementa una política de máximo privilegio. El acceso está permitido a cualquier
cliente que no empareja con la directiva Deny o que sí lo hace con Allow.
Allow,Deny: La directiva Allow se evalúa antes que Deny. El acceso está prohibido por defecto
(política de mínimo privilegio). Cualquier cliente que no empareja con la directiva Allow o
empareja con Deny tendrá el acceso prohibido.
Mutual-failure: Sólo los host que aparecen en la lista de Allow y no aparecen en la lista de Deny
tienen acceso garantizado. Esta opción tiene el mismo comportamiento que Allow,Deny y
ha sido marcada como obsoleta (deprecated).
Order Deny,Allow
Allow from ei.uvigo.es
Deny from montsfortis.ei.uvigo.es
Un ejemplo sería:
BindAddress
Defecto: BindAddress *
Estado: core
Un servidor Web Unix puede escuchar conexiones en cada dirección IP de la máquina, o sólo en
alguna dirección IP específica. Si se configura con el valor “*” el servidor escucha en todas las
IPs de la máquina, de otra forma escuchará en el lugar especificado (bien en la IP o servidor con
nombre de dominio completamente cualificado).
Apache provee también la directiva Listen para un mayor control de los puertos en los que se
escucha. Se recomienda el uso de Listen en vez de BindAddress.
BindAddress puede ser usada como un modo alternativo para soportar hosts virtuales con
múltiples servidores independientes.
Un ejemplo sería:
206 CAPÍTULO 11. CONFIGURACIÓN BÁSICA DEL SERVIDOR
11.11.1 NameVirtualHost
Estado: core
Esta directiva es absolutamente necesaria para configurar hosts virtuales basados en nombre.
Indica la dirección IP sobre la que escuchan los servidores virtuales y opcionalmente puede indicar
también un número de puerto.
El valor puede ser tanto una dirección IP como una expresión con comodines. El carácter comodín
* como dirección IP en NameVirtualHost, será la IP utilizada por los hosts virtuales que no tengan
directiva(s) más especificas. Esto es útil para configurar servidores de los que no se conoce a priori
la dirección IP (por ejemplo porque tenga la dirección IP dinámica).
Un ejemplo:
NameVirtualHost 193.147.87.2
11.11.2 ServerAlias
Estado: core
Esta directiva establece nombres alternativos para un host. Es utilizada dentro de servidores
virtuales. Por ejemplo puede necesitar ServerAlias en una red local donde los usuarios están
acostumbrados a no utilizar el nombre de dominio completo.
Un ejemplo:
<VirtualHost>
ServerName www.ei.uvigo.es
ServerAlias www
DocumentRoot ...
...
</VirtualHost>
Existen multitud de otras directivas, por ejemplo, comentar alguna que aparece de manera habitual
en la configuración por defecto de Apache:
11.12.1 BrowserMatch
Defecto: none
Sobreescribe: FileInfo
Estado: base
Módulo: mod_setenvif.
Define variables de entorno basadas en las cabeceras de petición HTTP (User-Agent). El primer
argumento regex es una expresión regular “case-sensitive”19 . al estilo de las que proporciona el
comando egrep (vea el apéndice C en la página 373). El resto de argumentos dan los nombres de
las variables que deben ser configuradas; el establecimiento de las variables puede hacerse de tres
formas:
19 Existe la directiva BrowserMatchNoCase que actúa igual que esta pero no es “case-sensitive”
208 CAPÍTULO 11. CONFIGURACIÓN BÁSICA DEL SERVIDOR
nombre-variable: crea una variable con ese nombre y el valor “1” como contenido.
Un ejemplo sería:
11.12.2 UserDir
Estado: base
Módulo: mod_userdir.
Compatibilidad: La versión más básica UserDir public_html está disponible en todas las
versiones.
El uso de otros directorios y URLs desde la versión 1.1.
Las características extendidas enabled y disabled sólo desde Apache 1.3.
Establece el directorio real20 o URL para redirección a usar cuando se recibe una petición de un
documento de usuario. directorio-fichero puede tomar un valor entre los siguientes:
1. La palabra clave disabled, que deshabilita el uso de directorios de usuario. Esta palabra
clave también puede aparecer seguida por una lista separada por espacios en blanco de
nombres de usuario, para deshabilitar las peticiones sólo en los directorios de esos usuarios.
2. La palabra clave enabled, seguida por una lista separada con espacios en blanco de nombres
de usuario, habilita el uso de directorios a los usuarios especificados.
Como ejemplo, se supone que se hace una petición de un documento en un directorio de usuario:
http://www.ei.uvigo.es/~txapi/enlaces.htm
Con la siguiente configuración, se puede indicar que el directorio-fichero real que se corresponde
es /home/txapi/www/enlaces.htm:
UserDir /home/*/www/
UserDir http://www.*.net/
</IfModule mod_user_dir.c>
UserDir public_html
</IfModule>
#
# Control access to UserDir directories. The following is an example
# for a site where these directories are restricted to read-only.
#
#<Directory /home/*/public_html>
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
# <Limit GET POST OPTIONS PROPFIND>
# Order allow,deny
# Allow from all
# </Limit>
# <LimitExcept GET POST OPTIONS PROPFIND>
# Order deny,allow
# Deny from all
# </LimitExcept>
#</Directory>
Apache por defecto busca los ficheros tradicionales srm.conf y access.conf cada vez que
arranca, aunque puede funcionar perfectamente sin ellos y ni siquiera da error si no los encuentra.
Esto produce un posible agujero de seguridad si alguien es capaz de modificar estos ficheros
introduciendo directivas peligrosas como Option Includes por ejemplo.
La solución consiste en configurar en el fichero principal http.conf para que no busque estos
ficheros:
AccessConfig /dev/null
ResourceConfig /dev/null
11.13. CONSIDERACIONES DE SEGURIDAD 211
Es conveniente revisar de vez en cuando los permisos, para no comprometer la seguridad. Existen
varias formas de ataque si se tienen los permisos mal establecidos. Por ejemplo, si un usuario
no-root puede modificar el ejecutable httpd, el root puede estar ejecutando código arbitrario sin
saberlo. Un error en los permisos permitiría también modificar los ficheros de log de manera que
fuesen enlaces a algún otro fichero del sistema; podrían estarse machacando ficheros vitales del
sistema sin darse cuenta.
Las comprobaciones que se deben realizar en una instalación típica (en /usr/local/apache por
ejemplo) son:
En primer lugar se comprueba que /, /usr y /usr/local son modificables sólo por el root.
Luego los permisos de los subdirectorios principales: bin, conf, logs, que deben
pertenecer al root o al propietario del servidor y no tener permiso de escritura por nadie
más.
Como cualquier comando que ejecuta el root, se debe proteger de modificaciones por parte
de usuarios no-root. Para ello se verifican los permisos del ejecutable, dándole permiso de
ejecución a todo el mundo y de lectura sólo al propietario.
chown 0 /usr/local/apache/bin/httpd
chgrp 0 /usr/local/apache/bin/httpd
chmod 511 /usr/local/apache/bin/httpd
El directorio htdocs puede tener permisos de escritura para otros usuarios, y esto no causa
problema, mientras el root no ejecute nada (como por ejemplo un CGI) dentro de este
directorio.
Hay que ser cuidadoso con esta directiva, para no permitir accesos a rutas no deseadas. En este
sentido es muy recomendable que se deshabilite al root como usuario válido.
Por defecto, se permite el acceso a cualquier parte del servidor. Un usuario malintencionado podría
intentar aprovechar estas características (combinada con la mala configuración de UserDir) para
navegar por todo el sistema de ficheros. Por ejemplo:
# cd /; ln -s / public_html
netscape http://localhost/~root/
Las directivas Allow, Deny y Order controlan el acceso desde los clientes a según que partes
del servidor Web. Con ellas se pueden definir bloques como el siguiente, que prohibe el acceso a
cualquier sitio del sistema de ficheros:
<Directory />
Order Deny,Allow
Deny from all
</Directory>
Lo anterior es muy restrictivo, ahora simplemente se deben añadir bloques <Directory> para
proporcionar acceso a las zonas que realmente deben estar disponibles. Por ejemplo:
<Directory /usr/local/apache/htdocs>
Order Deny,Allow
Allow from all
</Directory>
La sobreescritura de los valores globales de configuración por medio de los ficheros .htaccess
también está permitida por defecto. Un usuario malintencionado podría intentar aprovechar
esta característica para ejecutar programas en lugares no permitidos. Por ejemplo, añadiendo
lo siguiente en un fichero .htaccess:
Options +ExecCGI
Las directivas AllowOverride y Options controlan la sobreescritura. Puede ganarse un grado más
de seguridad si se combinan estas directivas con la restricción por defecto en el acceso a páginas
(vea sección anterior). Por ejemplo:
<Directory />
AllowOverride None
Options None
Order Deny,Allow
Deny from all
</Directory>
11.14. COMPROBACIONES DE LA CONFIGURACIÓN DEL SERVIDOR 213
Típicamente Apache es arrancado por el root, y luego pasa a la identidad definida en las directivas
User y Group para manejar las peticiones. Para mejorar la seguridad es importante que los valores
de estas directivas no sean root. Por defecto, se utiliza nobody, pero no es mala idea crear un
usuario y grupo nuevos exclusivamente para esto.
El uso de estas directivas en <VirtualHost> requiere de un wrapper suEXEC correctamente
configurado.
Se recomienda configurar Apache de forma que no deba usar DNS durante el análisis de los
ficheros de configuración. Si Apache confía en resoluciones DNS, pueden estarse creando
problemas:
de seguridad: Cuando las respuestas de peticiones a un servidor las realiza otro como
consecuencia de un cambio en el DNS.
En general, no es una buena política activar por defecto la generación de listados automáticos por
directorio, esto puede dar lugar a que cierta información que en principio no se quiere mostrar, sea
accesible. No es tan raro tener usuarios que creen que lo que no se enlaza desde una página no
es accesible. De todas formas la mejor manera de evitar estos accesos no deseados es quitar los
archivos del directorio con acceso desde el Web.
Varias son las herramientas que permiten comprobar la configuración del servidor. Algunas de
las mejores son accesibles desde la línea de comandos como parámetros de los ejecutables httpd
(vea la sección 10.6.5 en la página 145) y apachectl (vea la sección 10.6.6 en la página 147).
También existen un par de módulos de Apache relacionados (mod_status y mod_info), que se
comentan más en profundidad en los siguientes puntos.
11.14.1 mod_status
Cuando mod_status se compila con Apache, se instala un nuevo manejador (handler) llamado
server-status. Este manejador debe ser configurado en Apache dentro de una sección
<Location> con las siguientes directivas:
214 CAPÍTULO 11. CONFIGURACIÓN BÁSICA DEL SERVIDOR
ExtendedStatus On
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
11.14.2 mod_info
mod_info funciona de manera similar a mod_status, cuando se compila con Apache se instala un
nuevo manejador llamado server-info. Este manejador debidamente configurado permite que el
servidor devuelva gran cantidad de información sobre su configuración. Las directivas que deben
aparecer en httpd.conf para habilitar esta característica son:
<Location /server-info>
SetHandler server-info
11.14. COMPROBACIONES DE LA CONFIGURACIÓN DEL SERVIDOR 215
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
Servidores virtuales
12.1 Introducción
El término servidor virtual, o en inglés virtual host (vea la sección 2.3.3 en la página 31) hace
referencia al hecho de simular más de un equipo servidor cuando en realidad se dispone de una
sola máquina. Apache fue uno de los primeros servidores Web capaces de soportar hosts virtuales.
En este capítulo se explica como configurar adecuadamente un Apache con servidores virtuales
utilizando las distintas técnicas posibles (según IP o según nombre). Además se comentan algunas
características avanzadas, como el alojamiento dinámico de servidores virtuales.
217
218 CAPÍTULO 12. SERVIDORES VIRTUALES
lograrse en una sola máquina que tiene varias conexiones físicas de red o mediante el uso de alias
o interfaces virtuales.
Esta es la forma más antigua de ejecutar varios servidores en un mismo equipo. Es una alternativa
que requiere bastantes recursos adicionales (tiempo de CPU, memoria, varias IPs, etc.), por tanto
tendrían que darse unas condiciones muy particulares para que esta sea la opción elegida en un
servidor actual.
También se debe asegurar que los recursos que el servidor utilizará para escritura (como por
ejemplo los ficheros de log) son distintos para cada instancia. Si no se hace esto existirán varios
servidores compitiendo por los mismos recursos, lo que puede dar problemas. En cambio, los
recursos de lectura (como por ejemplo el directorio /icons) pueden compartirse.
Una vez se tienen preparados todos los archivos de configuración se utiliza el ejecutable httpd
para arrancar las distintas instancias. Con la opción -f se le indicará cual es el archivo de
configuración que Apache debe leer para cada servidor virtual. Ejemplo:
# http -f /usr/local/webs/servidor1/conf/httpd.conf
# http -f /usr/local/webs/servidor2/conf/httpd.conf
...
Caso de elegir esta opción, una sola instancia del servidor atenderá todas las peticiones, tanto las
del servidor principal como las de los hosts virtuales. Aparecerá una directiva Listen para cada
IP a la que un servidor virtual deba responder. Se utiliza además la directiva <VirtualHost> (vea
la sección 11.7.7 en la página 187) para establecer una sección propia para cada servidor virtual.
Dentro de estas secciones se pueden definir valores para distintas directivas1 :
...
<VirtualHost 193.147.87.2>
ServerAdmin webmaster@ei.universidad.es
DocumentRoot /etc/local/virtuales/virtual1
ServerName www.ei.universidad.es
ErrorLog /etc/local/virtuales/virtual1/log/error_log
TransferLog /etc/local/virtuales/virtual1/log/access_log
</VirtualHost>
<VirtualHost 193.147.87.3>
ServerAdmin eseiadmin@ei.universidad.es
DocumentRoot /etc/local/virtuales/virtual2
ServerName esei.ei.universidad.es
ErrorLog /etc/local/virtuales/virtual2/log/error_log
TransferLog /etc/local/virtuales/virtual2/log/access_log
</VirtualHost>
Configurar hosts virtuales basados en nombre (Name-based virtual hosts), es muy parecido a
configurar host virtuales basados en IP. La principal diferencia de la directiva NameVirtualHost
(vea la sección 11.11.1 en la página 206) que especifica la dirección IP que deberá usarse como
destino de los hosts virtuales basados en nombre. Un ejemplo simple es:
NameVirtualHost 193.147.87.211
<VirtualHost 193.147.87.211>
ServerName prueba.ei.universidad.es
DocumentRoot /etc/local/virtuales/virtual1
</VirtualHost>
<VirtualHost 193.147.87.211>
ServerName prueba1.ei.universidad.es
DocumentRoot /etc/local/virtuales/virtual2
</VirtualHost>
220 CAPÍTULO 12. SERVIDORES VIRTUALES
Cuando se especifica una dirección IP en una directiva NameVirtualHost sólo se atenderán las
peticiones si existe una sección <VirtualHost> configurada para responder a esa IP. El servidor
principal nunca podrá escuchar esa dirección IP. De hecho, cuando se comienzan a utilizar
servidores virtuales debería deshabilitarse el servidor principal como servidor independiente
y utilizarlo simplemente como un lugar para configurar directivas globales a todos los hosts
virtuales. En otras palabras, si se empiezan a usar hosts virtuales y se pretende que el servidor
principal siga funcionando deberá ser configurado como un host virtual más.
Algunos servidores pueden tener más de un nombre. Apache soporta esta característica mediante
la directiva ServerAlias (vea la sección 11.11.2 en la página 206). Un posible ejemplo es cuando
un servidor tiene uno local (web) y otro público (www.ei.universidad.es):
<VirtualHost 193.147.87.211>
...
ServerAlias web www.ei.universidad.es
...
</VirtualHost>
Para poder utilizar los servidores virtuales por nombre, los clientes deben hacer peticiones que
incluyan un campo de encabezado Host. El encabezado Host se define en la especificación
de HTTP/1.1 y aunque algunos navegadores que soportan HTTP/1.0 han sido mejorados con
la capacidad de manejar este encabezado, los más antiguos directamente no lo soportan. Las
peticiones desde estos navegadores antiguos no son bien entendidas por el servidor, que no será
capaz de determinar a que host virtual se pretende acceder y responderá siempre con el servidor
por defecto.
En muchos casos no se desea perder los accesos de estos posibles usuarios. Existe una solución
basada en la directiva ServerPath que designa una manera alternativa de acceder a los datos que
forman parte de servidores virtuales. Mediante ServerPath se define una localización en el host
por defecto que se refiere al servidor virtual. Por ejemplo:
DocumentRoot /usr/local/proyecto/htdocs/virtuales/virtual1
</VirtualHost>
Con estas líneas se consigue que las peticiones de la localización /virtual1 del servidor por
defecto sean servidas desde el raíz del host virtual virtual1.ejemplo.es. De esta forma las
páginas podrán ser accesibles mediante las siguientes URLs:
Para asegurar la compatibilidad total se proporcionarán enlaces desde el servidor por defecto a las
páginas alternativas de cada host alojado. Además las páginas no podrán contener referencias al
nombre del servidor virtual.
Como se ve, el uso de esta alternativa exige un poco de disciplina, pero con ello se garantiza el
acceso a los datos independientemente de la versión de navegador que utilicen los usuarios.
Las dos técnicas anteriores, hosts virtuales basados en nombre y hosts virtuales basados en IP,
son suficientes para la mayoría de los servidores, pero no son muy cómodas cuando se trata de
alojar a cientos o miles de servidores virtuales (caso típico de un ISP). Existe una técnica llamada
configuración masiva y dinámica de hosts virtuales (Dynamically configured mass virtual hosting)
que soluciona este problema. Se implementa en el módulo mod_vhost_aliases (distribuido de
manera estándar con Apache). Este se encarga de determinar las rutas (tradicionalmente indicadas
por DocumentRoot y ScriptAlias) basándose en la URL solicitada. Cuatro son las directivas que
permiten hacerlo:
Ya no será necesario incluir líneas en httpd.conf para cada nuevo host virtual. En realidad se
tendrán una serie de patrones2 que emparejarán con las URLs generando rutas reales. Simplemente
se deberá asegurar que las rutas generadas existen.
Por ejemplo, la configuración de hosts virtuales puede incluir el patrón %1 que permite asignar
rutas reales en función del nombre de la máquina3 :
...
UseCanonicalName off
VirtualDocumentRoot /usr/local/proyecto/htdocs/%1
...
http://ccia.ei.universidad.es/index.html
Apache consulta sus ficheros de configuración, empareja y determina que la ruta real donde está
alojado el documento seleccionado es:
/usr/local/proyecto/htdocs/ccia/index.html
Cuando se usan servidores virtuales se está expuesto a que un cliente realice una petición de
acceso a un servidor virtual que no existe, por ejemplo si se accede a la máquina con un nombre
alternativo del DNS. En estos casos Apache responde según las directivas que tenga configuradas
en el servidor principal. Una manera mucho más legible de configurar estas respuestas es usar
un servidor virtual por defecto. El servidor virtual por defecto se establece dentro de una sección
<VirtualHost> propia, con la palabra clave _default_ (para el nombre del servidor) y el comodín
* (para el número de puerto). Todo lo no definido explícitamente en otros servidores virtuales se
atenderá desde aquí. Un ejemplo de configuración del servidor virtual por defecto es el siguiente:
<VirtualHost _default_:*>
DocumentRoot /usr/local/proyecto/htdocs/virtuales/pordefecto
...
</VirtualHost>
2 Para un listado completo de los patrones permitidos puede consultarse la información relativa a mod_vhost_alias
en la documentación que acompaña a Apache.
3 El patrón %1 empareja con el nombre de la máquina, en este ejemplo %1 = ccia.
12.5. CONSIDERACIONES FINALES 223
Para depurar la configuración de los hosts virtuales puede ser útil la opción -S del demonio httpd.
Desde la línea de órdenes puede escribirse:
# httpd -S
Esto realiza un volcado de la configuración de los servidores virtuales tal y como Apache la ha
analizado. Revisar en la salida producida puede ayudar a descubrir errores.
224 CAPÍTULO 12. SERVIDORES VIRTUALES
Capítulo 13
13.1 Introducción
SSI y CGI son las dos tecnologías de generación de contenido dinámico más antiguas, ambas
se incluyen en las distribuciones de Apache. SSI (vea la sección 4.2 en la página 53) es un
sistema de directivas embebidas en el código HTML, mientras CGI (vea la sección 3.2 en la
página 36) permite la ejecución de programas externos. En las siguientes secciones se discute
como se instalan y configuran adecuadamente.
225
226 CAPÍTULO 13. CONFIGURANDO SSI Y CGI
13.2 SSI
13.2.1 Introducción
SSI se compila por defecto y por tanto está disponible en todos los servidores salvo que
explícitamente se indique lo contrario. El módulo mod_include proporciona la implementación
XSSI (vea la sección 4.2.2 en la página 54) que se puede decir que es la implementación estándar
de facto.
Con una instalación básica de Apache (vea el capítulo 10 en la página 133) se incluye el módulo de
XSSI. Un poco más complejo es instalar las extensiones al XSSI de Apache que provee Hotwired
XSSI (vea la sección 4.2.3 en la página 58). Para ello se tiene que partir del código fuente y seguir
los siguientes pasos:
3. Seguir el proceso normal de instalación desde código fuente (vea la sección 10.4 en la página
136).
Una vez acabada la instalación puede verificarse que efectivamente se incluye el módulo que
soporta SSI:
1. Si Apache fue compilado como un único ejecutable sin módulos, comprobar mediante la
siguiente orden que en efecto se incluyó el módulo mod_include:
APACHE_HOME/bin/httpd -l
La directiva LoadModule (vea la sección 11.5.2 en la página 161) enlaza el objeto (fichero
o biblioteca) del módulo y lo añade a la estructura de módulos activos. La directiva
AddModule (vea la sección 11.5.2 en la página 159) se utiliza para habilitarlo.
1Y existirá el fichero dentro de /libexec.
13.2. SSI 227
Una vez instalado, SSI debe ser correctamente configurado. Lo primero es indicar que se desea
habilitar el procesamiento de directivas SSI, para ello se añade en algún sitio de los ficheros de
configuración:
Option +Include
Esta forma es válida si ya existe una lista de opciones por defecto (el modificador + significa añadir
a la lista de opciones actual), si no es así, puede usarse simplemente:
Option Include
También se puede usar una versión un poco más segura que impide que se puedan ejecutar scripts
desde directivas SSI2 :
Option +IncludesNOEXEC
Los documentos que incluyen etiquetas SSI deben ser analizados e interpretados por el servidor
antes de ser servidos (server parsed). Por cuestiones de eficiencia no todos los documentos son
server parsed. Aunque parezca más cómodo, se debe tener en cuenta que el servidor deberá
analizar cada fichero en busca de directivas antes de enviarlo al cliente, con la consecuente
sobrecarga. Hay dos formas de indicarle a Apache que archivos debe interpretar y cuales no:
1. La primera solución se basa en utilizar las extensiones de los archivos y asociarlas con un
manejador especial. Para ello:
2 Con la misma consideración respecto a la lista de opciones por defecto que en el caso anterior.
228 CAPÍTULO 13. CONFIGURANDO SSI Y CGI
2. La segunda solución es utilizar los propios permisos de ejecución de los archivos. Mediante
la directiva XBitHack se consigue que el servidor analice todos los archivos con permisos
de ejecución buscando directivas SSI:
XBitHack on
Con esta opción Apache no envía la cabecera HTTP que contiene la fecha de última
modificación y los clientes no pueden efectuar operaciones de caché. Por corregirlo puede
utilizarse:
XBitHack full
Con XBitHack si se quieren añadir directivas a una página concreta no hay que cambiarle
la extensión, sino únicamente los permisos, por ejemplo:3 .
chmod +x pagina.html
13.3 CGI
13.3.1 Introducción
El CGI define una interface para que el servidor Web pueda interactuar con programas externos
que generan contenido (vea la sección 3.2 en la página 36).
Normalmente cuando un script se ejecuta lo hace con los permisos del usuario especificados
mediante las directivas User (vea la sección 11.5.3 en la página 168) y Group (vea la sección
11.5.3 en la página 164). Con suEXEC activado el funcionamiento cambia, el wrapper es llamado
cuando una petición HTTP solicita un programa CGI, Apache le proporciona el nombre del
programa y el identificador de usuario y grupo con el que debe ejecutarse.
Permiten a los usuarios crear scripts en sus directorios personales y ejecutarlos bajo sus
propios permisos, en vez de ser lanzados con los permisos especificados en el servidor por
las directivas User y Group.
Por ejemplo, el usuario txapi puede tener un script llamado enlaces.pl en su directorio
personal4 . El script se invocaría como http://www.ejemplo.com/~txapi/cgi-bin/
enlaces.pl y sería ejecutado con los permisos del usuario, permitiendo el acceso a ficheros
de datos propiedad del mismo usuario.
Permiten mayor seguridad en los servidores virtuales redefiniendo las directivas User y
Group con valores diferentes a los del servidor principal. Un ejemplo de configuración:
<VirtualHost 10.0.0.1>
ServerName virtual.ejemplo.com
ServerAdmin adminvirtual1@ejemplo.com
DocumentRoot /usr/local/bin/proyecto/htdocs/virtual1
User adminvirtual1
Group adminvirtual1
</VirtualHost>
Todas las peticiones de recursos CGI serán ejecutados como el usuario y grupo definido en
el servidor virtual. De esta manera un administrador de un host virtual puede escribir sus
propios CGIs sin comprometer la seguridad de todo el servidor Web.
3. ¿Está el usuario autorizado a ejecutar el wrapper? Sólo el dueño de Apache debería poder.
8. ¿El número de identificador del usuario objetivo está sobre el número mínimo para
identificadores? Este número se configura en la instalación y permite evitar que la cuenta
objetivo sea de sistema.
9. ¿Puede el wrapper convertirse en el objetivo (id. y grupo)? Aquí el wrapper realiza las
llamadas a las funciones del sistema setuid y setgid.
10. ¿Existe el directorio donde reside el programa? Si no existe el directorio, mal puede haber
ficheros.
12. ¿El directorio NO tiene permisos de escritura para otros? Sólo el poseedor del directorio
debe poder crear contenido.
14. ¿El programa NO tiene permisos de escritura para otros? Sólo el poseedor del programa
debe poder crear contenido.
15. ¿El programa NO es setuid, setgid? No interesa comenzar la ejecución de un programa que
mediante setuid y/o setgid pueda alterar de nuevo los permisos de usuario.
16. ¿Es el usuario/grupo del objetivo el mismo que el usuario/grupo del programa?
17. ¿Puede limpiarse el entorno del proceso para asegurar una ejecución segura? Antes de la
ejecución se establece un entorno seguro (definido durante la instalación).
El soporte CGI básico está implementado en el módulo mod_cgi. Además para tareas de
configuración pueden ser necesarios otros módulos mod_mime, mod_alias, mod_actions. Todos
ellos se incluyen por defecto en las instalaciones estándar. Lo que no se incluye es el soporte
a suEXEC, si se necesita de su instalación se deben instalar Apache con algunos parámetros
especiales:
suEXEC es fácilmente configurable utilizando APACI, lo único que hay que hacer es añadir
algunos parámetros a la instalación básica desde código fuente (vea la sección 10.4 en la página
136).
El parámetro más importante y el único absolutamente necesario es --enable-suexec(habilita la
instalación de suEXEC), aunque también existen otros que tendrán valores asignados por defecto.
Un script típico de configuración de la instalación podría ser el siguiente:
13.3. CGI 231
./configure --prefix=/usr/local/proyecto/apache1.3.20 \
--enable-module=most \
--enable-shared=max \
--htdocsdir=/usr/local/proyecto/htdocs/ \
--cgidir=/usr/local/proyecto/cgi-bin/ \
--sysconfdir=/usr/local/proyecto/conf/ \
--logfiledir=/usr/local/proyecto/logs/ \
--enable-suexec \
--suexec-caller=apache \
--suexec-logfile=/usr/local/proyecto/logs/suexec_log
Los parámetros relacionados con suEXEC son los tres últimos. Para conocer cuáles son los
posibles parámetros y cual es su función puede observarse la salida del script ./configure -h:
Una vez completada la instalación de Apache (vea la sección 10.4.2 en la página 139) puede
verificarse que suEXEC ha quedado correctamente instalado, utilizando el programa httpd:
# ./httpd -l
Compiled-in modules:
http_core.c
232 CAPÍTULO 13. CONFIGURANDO SSI Y CGI
mod_so.c
suexec: enabled;
valid wrapper /usr/local/proyecto/apache1.3.20/bin/suexec
Para que un script CGI funcione no llega con hacer un programa que genere contenido HTML,
Apache debe conocer que los ficheros deben ser ejecutados y no simplemente servidos como
cualquier fichero HTML. Existen varias posibilidades para indicar esto:
ScriptAlias
Alias y SetHandler
mod_actions
ScriptAlias
Esta directiva (vea la sección 11.7.6 en la página 186) le dice a Apache que un directorio particular
y todos sus subdirectorios, van a contener scripts CGI. Si se solicita un fichero dentro de uno de
estos directorios el servidor Web intentará ejecutarlo y no simplemente servirlo:
Alias y SetHandler
También se tiene otra opción para hacer que todo un directorio pueda ejecutar CGI. Se basa en
usar las directivas Alias (vea la sección 11.7 en la página 181) y SetHandler:
Primero debe usarse Alias para realizar el alias del directorio. Luego con SetHandler (parte de
mod_mime) se fuerza a que los ficheros del directorio sean pasados por el manejador indicado.
13.3. CGI 233
Otra forma de hacer que los scripts funcionen es usar la directiva AddHandler (parte del módulo
mod_mime). Con esta directiva se indica que los archivos de ciertas extensiones van a ser
ejecutables CGI, independientemente de su localización. Esto puede ser apropiado si se quiere
que cada usuario pueda usar scripts situados en su propios directorios y no en una localización
general como /cgi-bin/. La sintaxis es:
Esto hace que los archivos de extensiones .pl y .cgi sean considerados scripts CGI, pero no
habilita la ejecución de los mismos. Para permitir esta ejecución se debe usar la directiva Options
+ExecCGI (vea la sección 11.10.3 en la página 202) en el directorio o localización deseado.
<Directory /usr/local/apache/htdocs/algundirectorio>
Options +ExecCGI
</Directory>
mod_actions
Es un módulo que proporciona la ejecución de scripts CGI basándose en el tipo de medio o método
de petición:
El tipo de medio puede ser un manejador (handler) o un tipo MIME. La ejecución del script
se controla con la directiva Action. Como ejemplo si se quiere que todas las peticiones
de ficheros de extensión .acc sean procesadas por un script de control, se incluirán las
siguientes líneas en la configuración:
El método de petición puede ser cualquiera de los que especifica el protocolo HTTP (GET,
POST, etc.). La ejecución del script se controla con la directiva Script. Un ejemplo sería
tener un script CGI capaz de monitorizar todas las peticiones (potencialmente peligrosas)
de tipo PUT.
Una vez se ha habilitado el soporte CGI ya se pueden publicar los scripts y estos deberían
funcionar. Pero no siempre es así y resulta bastante frustrante no saber que hacer ante el típico
mensaje de error (figura 13.1).
Para evitar enfados innecesarios siempre que un script no funcione pueden comprobarse varias
cosas:
Sintaxis: como en cualquier otro programa, se debe conocer la sintaxis del lenguaje que se
está manejando y usarla adecuadamente. Un error de sintaxis hace que el script no funcione.
#!/usr/bin/perl
print "Content-type: text/html\n\n";
Problemas con suEXEC: un error muy habitual con suEXEC, se produce cuando se quiere
habilitar la ejecución de CGIs desde directorios de usuario. Un mensaje en el fichero de
13.3. CGI 235
errores del servidor del estilo premature end of script headers indica de manera casi
segura que suEXEC está mal configurado. Se puede encontrar más información en el archivo
de log de suEXEC (generalmente suEXEC_log).
Pero no sólo el script CGI debe tener permisos adecuados, sino también todos los archivos
que se trate de leer o escribir desde el mismo. Si esto no se verifica el script “romperá”
cuando se produzca un intento de acceso al archivo sin permisos.
Figura 13.2: Error típico provocado por un problema de permisos en un script CGI.
La forma típica de obtener información sobre los errores es buscar en el log de errores del servidor
(error_log). Pero existe otra forma, que consigue una información más detallada. Se basa en
configurar el servidor añadiendo las directivas de “debug”6 que se incluyen en el mod_cgi.
5 El propietario que ejecuta se especifica en la configuración con las directivas User y Group
6 Por eficiencia, estas características nunca deberían estar presentes en un servidor en producción.
236 CAPÍTULO 13. CONFIGURANDO SSI Y CGI
ScriptLog: indica en que fichero se almacenarán los logs, su presencia activa este método
de búsqueda de errores en CGIs. Por ejemplo:
ScriptLog /usr/local/proyecto/cgi-bin/cgi.log
ScriptLogLength: indica la longitud máxima que puede alcanzar el fichero de log (por
defecto 1 MB). Una vez alcanzada esta longitud el proceso de log es desactivado.
Con estas directivas activadas el resultado obtenido tras un error es bastante descriptivo. Por
ejemplo, este es el error que se obtiene tras la llamada a un script que no tiene bien los permisos:
Usando CGI el mayor problema es que la flexibilidad que se puede lograr con la directiva Options
+ExecCGI, puede convertirse en peligroso (vea la sección 11.13.5 en la página 212). Ciertos
usuarios en los que no se confía completamente pueden aprovecharse de esto y ejecutar CGIs
arbitrarios o realizar otras acciones malvadas.
La solución más segura consiste en mantener los scripts en un sólo directorio controlado por el
administrador (ScriptAlias), o deshabilitar selectivamente la ejecución CGI para los directorios
de los usuarios en los que no se confía (Options -ExecCGI).
Capítulo 14
14.1 Introducción
El mayor crecimiento en tecnologías aplicadas al lado del servidor viene de la mano de Java. La
primera apuesta fueron los Java Servlets, pequeños programas que se ejecutan como respuesta a
una petición HTTP (vea la sección 3.3 en la página 43). Posteriormente apareció JSP (Java Server
Pages), una solución Java embebida en código HTML (vea la sección 4.3 en la página 59).
237
238 CAPÍTULO 14. SERVLETS Y JSP CON TOMCAT. INTEGRACIÓN CON APACHE
Aunque hay varios productos que implementan contenedores de Servlets, el que tiene más
respaldo1 en la actualidad es Jakarta2 Tomcat. Tomcat está siendo desarrollado en un entorno
abierto y participativo bajo la licencia de Apache Software. A fecha actual (junio 2001) existen
varias versiones disponibles para su utilización. En este capítulo se discute como instalar y utilizar
Tomcat 3.2.3 (la última versión binaria disponible del producto) tanto para ser ejecutado de manera
independiente como para integrarlo en Apache como contenedor Servlet externo.
Tomcat está escrito en Java y por tanto lo primero que se necesita conseguir (si no la tenemos
ya) es una versión del JDK (Java Development Kit) que estará disponible en la Web de SUN
(http://java.sun.com). Tomcat recomienda utilizar una versión igual o superior a la JDK 1.1.
Actualmente se puede conseguir como versión estable el J2SDK 1.3.13 .
La J2SDK (Java 2 Software Development Kit), es el kit de desarrollo software Java 2, un entorno
de desarrollo para construir aplicaciones, applets, etc, que podrán ser desplegadas en la plataforma
Java 2. Incluye herramientas básicas para desarrollar y probar programas escritos en Java. Entre
ellas la JVM (Java Virtual Machine), el corazón (core) de las librerías de clases, compilador,
debugger, etc.
Desde la zona de download del sitio de SUN (figura 14.1) puede conseguirse una versión
adecuada a nuestra plataforma y modo preferido de instalación del JSDK. Por ejemplo el archivo
j2sdk-1_3_1-linux-i386-rpm.bin es la versión binaria empaquetada como rpm.
# mv j2sdk-1_3_1-linux-i386-rpm.bin /usr/local/proyecto/src
# /usr/local/proyecto/src/j2sdk-1_3_1-linux-i386-rpm.bin
2. Tras leer y aceptar la licencia se obtiene un paquete rpm instalable de la manera habitual
(vea la sección 10.5.2 en la página 142), como root se ejecuta:
# rpm -i jdk-1.3.1.i386.rpm
1 Es la implementación de referencia SUN para las especificaciones de Java Servlets [23] y JSPs [22].
2 Jakarta [53] es el nombre común que engloba un conjunto de proyectos relacionados con Java, desarrollados bajo
el control del Apache Software Foundation.
3 Por motivos de marketing, los nombres de los productos de SUN han sufrido un cambio. Lo que antes era JDK
ahora es J2SDK, y a veces también se le conoce como JSDK. Este baile de nombres puede provocar equívocos, en la
página de SUN puede encontrarse más información sobre las equivalencias.
14.2. PASOS PREVIOS: INSTALAR SOPORTE JAVA 239
PATH: se añadirá a esta variable la ruta donde residen los ejecutables del JDK
(/usr/java/jdk1.3.1/bin/) y JRE (/usr/java/jdk1.3.1/jre/bin/). Así se
consigue habilitar la ejecución de programas Java desde cualquier lugar del sistema
de ficheros.
JAVA_HOME: contendrá el directorio que raíz que contiene el JSDK, para esta
instalación /usr/java/jdk1.3.1/.
CLASSPATH: contendrá los directorios y/o archivos .jar que contienen las clases
Java. Es importante incluir en la lista el directorio actual (./).
Es habitual que se quiera que estos cambios en las variables sean permanentes y afecten a
todos los usuarios. Para ello se puede modificar el fichero /etc/profile. Como root se
edita este fichero añadiendo las siguientes líneas:
PATH="$PATH:/usr/java/jdk1.3.1/bin/:/usr/java/jdk1.3.1/jre/bin/"
JAVA_HOME="/usr/java/jdk1.3.1/"
CLASSPATH="/usr/java/jdk1.3.1/jre/lib/i18n.jar:...:./"
Con los pasos previos se ha instalado el soporte para Java en el equipo. Para probar la instalación
se puede utilizar algún pequeño programa. Es ya clásico utilizar el programa Hola Mundo:
# javac HolaMundo.java
# java HolaMundo
Hola Mundo
Se puede elegir entre varios formatos de instalación (binarios en diversos formatos de paquete o
código fuente). Para este proyecto se ha decidido4 utilizar la versión binaria (en paquetes RPM).
Desde el sitio del proyecto Jakarta http://jakarta.apache.org/ (figura 14.2) se obtienen un
par de ficheros rpm:
# rpm -i tomcat-3.2.3-1.noarch.rpm
# rpm -i tomcat-webapps-3.2.3-1.noarch.rpm
4 Después de intentarlo con la versión en código fuente y tener más de un problema.
14.3. TOMCAT COMO CONTENEDOR SERVLET 241
server.xml: fichero global de configuración del contenedor Servlet. Se utiliza para cosas
como ficheros de log (<Logger ... />), el gestor de contexto (<Connector ... />, <Context
.../>, <Host .../>, etc). Más información puede obtenerse en las páginas de documentación
que acompañan al programa.
Con la instalación realizada hasta ahora Tomcat ya funciona, pero sólo en modo standalone, es
decir, como un demonio independiente que puede servir páginas Web y ejecutar Servlets y JSPs.
Para probar si está funcionando adecuadamente lo primero es arrancar el servidor:
# /usr/bin/tomcat start
Using classpath: /var/tomcat/lib/ant.jar:/var/tomcat/lib/jasper.jar:
/var/tomcat/lib/parser.jar:/var/tomcat/lib/servlet.jar:
/var/tomcat/lib/test:/var/tomcat/lib/webserver.jar:
/var/tomcat/lib/xerces.jar:/usr/java/jdk1.3.1/lib/tools.jar:./
242 CAPÍTULO 14. SERVLETS Y JSP CON TOMCAT. INTEGRACIÓN CON APACHE
Luego se abrirá un navegador que intente conectarse a la URL que el servidor atiende por defecto,
y probar los ejemplos de Servlets y JSPs referenciados desde la misma:
http://localhost:8080/
Aunque Tomcat puede servir páginas Web como si fuese un servidor HTTP, en realidad ha sido
optimizado para funcionar como un contenedor Servlet. En sitios reales no es deseable que Tomcat
14.4. INTEGRANDO APACHE Y TOMCAT 243
se encargue de servir las páginas estáticas, por ello se suele optar por una solución integradora más
eficiente. Por un lado se utiliza un servidor Web (como puede ser Apache) para servir las páginas
estáticas y por otro Tomcat (como contenedor Servlet) para ejecutar Servlets y JSPs. Las razones
para seguir esta recomendación son varias:
Velocidad de ejecución: Tomcat no es capaz de servir páginas estáticas tan rápido como
Apache.
Integración con aplicaciones legacy: existen multitud de sitios que han venido desarrollando
aplicaciones basadas en CGI, PHP, etc, y no se puede asumir que todo se va a tirar a la basura
para instalar Tomcat como servidor Web.
in-proccess: es la manera más eficiente, se realiza a través de JNI y está disponible para
servidores multihilo (como Apache 2.0).
mod_jserv: sólo soporta el servidor Web Apache. Con mod_jk, en cambio, varios
servidores Web tendrán la posibilidad de acceder a Tomcat, mediante una capa intermedia
llamada biblioteca jk.
244 CAPÍTULO 14. SERVLETS Y JSP CON TOMCAT. INTEGRACIÓN CON APACHE
Respecto a los métodos de comunicación entre Apache y Tomcat, mod_jserv sólo soporta
AJP v1.25 . mod_jk en cambio soporta :
– JNI: el método más rápido en caso de tener servidores multihilo (por ejemplo Apache
2.0).
mod_jk puede obtenerse en varios formatos, la opción más cómoda es conseguir algún tipo de
formato binario (por ejemplo un paquete RPM) adecuado a nuestra plataforma. Puede encontrarse
en la Web del proyecto Jakarta (http://jakarta.apache.org/) dentro del mismo directorio
desde donde se descarga la distribución de Tomcat. Por ejemplo para Tomcat 3.X y plataforma
Linux se pueden conseguir dos versiones del fichero:
1. mod_jk-eapi.so
2. mod_jk-noeapi.so
Los servidores Apache ofrecen por defecto la API estándar, en cambio los que pretenden dar
capacidades de comunicación segura sobre SSL mediante el módulo mod_ssl ofrecen la EAPI.
Según el caso se seleccionará el el fichero adecuado y se moverá a la localización donde se
encuentran los módulos de Apache (generalmente libexec) renombrándolo como mod_jk.so.
Por ejemplo:
# mv mod_jk-noeapi.so /usr/local/proyecto/apache/libexec/mod_jk.so
Tomcat, cada vez que arranca, es capaz de generar automáticamente la configuración que Apache
necesita y volcarla en un fichero mod_jk.conf-auto. En la versión que se está instalando, el
fichero auto configurado se crea en TOMCAT_HOME/conf/.
Aunque siempre es posible abrir el fichero que contiene la autoconfiguración, copiar las directivas
y pegarlas en el lugar adecuado de httpd.conf, existe otra forma más sencilla de obtener el
mismo resultado. Se trata de utilizar la directiva de Apache Include. Esta directiva permite la
inclusión de otros ficheros de configuración. De esta manera se puede editar httpd.conf e incluir
al final del mismo una línea del estilo de la siguiente:
Include /var/tomcat/conf/mod_jk.conf-auto
5 AJP v1.2 se considera un proyecto acabado y carece de mantenimiento.
14.4. INTEGRANDO APACHE Y TOMCAT 245
El primer paso es arrancar los demonios en orden, primero Tomcat y luego Apache. Si se hace así
no habrá problemas extraños, recuerde que Tomcat al iniciarse, genera un fichero de configuración
que necesita Apache. Si Apache arranca antes es probable que esté leyendo un fichero no válido.
Un ejemplo de las órdenes de arranque:
# /usr/bin/tomcat start
# /usr/local/proyecto/apache/bin/apachectl start
Una vez arrancados los servicios, se puede probar una petición a Apache de un Servlet o Jsp. Por
ejemplo para acceder a los ejemplos que proporciona Tomcat se utiliza la URL6 :
http://localhost/examples
Si todo va bien el resultado puede ser parecido al que se obtenía en la ejecución independiente de
Tomcat (figura 14.3), pero encapsulando la petición a través de Apache.
Configurando PHP
15.1 Introducción
PHP (PHP: Hypertext Preprocessor) [88] es uno de los lenguajes embebidos en páginas HTML
que más se utiliza en la actualidad, provee numerosas interfaces que le permiten comunicarse
con multitud de bases de datos, protocolos, etc. Además la posibilidad de compilarlo como un
intérprete externo permite que sea utilizable desde CGI en casi cualquier servidor Web. Más
información teórica sobre este tema se ofrece en un capítulo anterior (vea la sección 4.4 en la
página 64).
En este capítulo se explica como instalar y configurar la última versión disponible de PHP (PHP4)
con soporte a MySQL1 en un servidor Web Apache.
15.2 Instalación
Desde el sitio de PHP (http://www.php.net) se obtiene una copia (figura 15.1) de la última
versión disponible del software. A fecha de escritura de este capítulo esta versión es PHP 4.0.6.
En la Web pueden obtenerse distintas distribuciones (binarios, código fuente, etc.).
1 MySQL (vea la sección 8.2.1 en la página 109) es una base de datos de código libre muy utilizada en Internet.
247
248 CAPÍTULO 15. CONFIGURANDO PHP
Antes de instalar y para evitar problemas posteriores hay que tener en cuenta las librerías
compartidas que van a ser necesarias para PHP. Debe comprobarse que todas las necesarias
estén listadas en el fichero /etc/ld.so.conf. Si no lo están se incluirán utilizando la
herramienta ldconfig. Por ejemplo, si se desea utilizar MySQL y se tiene la librería compartida
en /usr/lib/mysql/libmysqlclient.so, en el fichero /etc/ld.so.conf aparecerá la ruta
/usr/lib/mysql.
Construir PHP como un interprete externo y utilizarlo para crear scripts CGI (al estilo de
Perl). Esta última es la forma de instalación por defecto porque hace posible que PHP pueda
ser utilizado en cualquier servidor Web que soporte CGI.
Como ya se comenta en un capítulo anterior, para configurar nuevos módulos en Apache se debe
haber compilado el servidor activando el módulo mod_so que es el da soporte a DSO. Si esto es
así se puede instalar el nuevo módulo para PHP:
Como ejemplo para este proyecto se configuró PHP con los siguientes parámetros:
# cd php-4.0.6
# ./configure --prefix=/usr/local/proyecto/php \
--with-apxs=/usr/local/proyecto/apache1.3.20/bin/apxs \
--with-mysql=/usr
# make
3. Y por último se instala el módulo y los archivos adicionales necesarios para utilizar PHP:
# make install
# cp php.ini-dist /usr/local/lib/php.ini
La configuración para el correcto funcionamiento de PHP utiliza dos ficheros, por un lado el
fichero php.ini y por otro el fichero de configuración de Apache httpd.conf.
15.3.1 php.ini
El archivo de configuración php.ini es leído cuando arranca el intérprete PHP. Para las versiones
en formato módulo de servidor (como el que se ha construido en este capítulo) esto sólo ocurre al
arrancar el servidor Web.
Editando el fichero php.ini pueden realizarse multitud de ajustes, aunque generalmente los
valores por defecto son válidos. Este archivo está perfectamente comentado y permite una
configuración muy detallada de la ejecución del interprete PHP usando una gran cantidad de
directivas. Muchas de ellas permiten cambiar valores que se configuran inicialmente como
parámetros del script ./configure. Por claridad las directivas de php.ini se agrupan en
secciones:
Opciones del lenguaje: diversas directivas para habilitar el motor PHP, permitir etiquetas al
estilo ASP, etc.
Manejo de errores y utilidades de log: ficheros donde se almacenan los errores, ...
Manejo de datos: directivas que manejan los datos que PHP recibe de las peticiones HTTP.
Extensiones dinámicas: PHP permite una forma de carga dinámica de librerías compartidas.
15.3.2 httpd.conf
El otro fichero de configuración es httpd.conf y debe ser modificado para indicarle al servidor
donde está el módulo que interpreta código PHP, para ello se utilizan las directivas de Apache
LoadModule (vea la sección 11.5.2 en la página 161) y AddModule (vea la sección 11.5.2 en la
página 159):
15.4. PROBAR FUNCIONAMIENTO 251
Y también cuales son los nuevos tipos MIME que indican las extensiones de ficheros asociados al
manejador PHP, utilizando la directiva AddType (vea la sección 11.8.4 en la página 191):
La extensión .php se asocia con archivos que deben ser ejecutados por PHP.
La extensión .phps se asocia con el código fuente que el motor PHP puede interpretar y
presentar en una página Web con la sintaxis coloreada. Esta es una utilidad que puede
ayudar a la corrección de errores.
También se pueden cambiar ciertos ajustes de configuración del intérprete PHP desde el propio
httpd.conf, para ello se utilizan las directivas (tabla 15.1) que incluye el módulo de php
(mod_php4).
Directiva Significado
php_value nombre valor Fija el valor de la variable especificada.
php_flag nombre on|off Fija una opción de configuración de tipo Boolean.
php_admin_value nombre valor Fija el valor de la variable especificada. Los ajustes de
configuración de tipo “Admin” sólo se pueden fijar desde
los archivos principales de configuración del Apache, y
no desde los .htaccess.
php_admin_flag nombre on|off Fija una opción de configuración de tipo Boolean. Debe
tenerse en cuenta la misma consideración para los ajustes
de tipo “Admin” que en la directiva anterior.
Por último se reinicia el servidor (apachectl graceful) haciendo que se vuelva a leer la
configuración y se active el soporte PHP. Para probar el funcionamiento puede utilizarse una
pequeña página PHP de prueba como la siguiente:
<html>
<title>Primera página de prueba PHP</title>
<body>
<!-- Esta función PHP muestra la configuración actual -->
252 CAPÍTULO 15. CONFIGURANDO PHP
<?
phpinfo();
?>
</body>
</html>
Este sencillo código es muy útil porque muestra los valores actuales de configuración del intérprete
PHP (figura 15.2).
16.1 Introducción
253
254 CAPÍTULO 16. AUTENTICACIÓN, AUTORIZACIÓN Y CONTROL DE ACCESO
Protege los directorios del servidor utilizando el método clásico de cuentas (login/password).
Apache emula el funcionamiento de los sistemas Linux/Unix, que se basan en los ficheros de
usuarios /etc/passwd y grupos /etc/group.
16.2.1 Usuarios
Nuevos usuarios pueden añadirse en cualquier momento con un comando muy parecido al anterior:
Lo siguiente es indicar a Apache que directorio queremos proteger. Para ello se incluyen algunas
directivas en los ficheros adecuados (httpd.conf, access.conf, .htaccess). Quizá la manera
más cómoda sea crear un fichero .htaccess, en el directorio seleccionado y añadir las siguientes
líneas:
AuthType Basic
AuthName "Protegido mediante login/password"
AuthUserFile /usr/local/proyecto/conf/controldeacceso
AuthGroupFile /dev/null
require user usuario
A partir de este momento, cuando desde un navegador se solicite acceso al directorio protegido,
se presentará una ventana de diálogo que pide el login/password (figura 16.1).
16.2.2 Grupos
Con las directivas anteriores se permite el acceso autenticado de una persona. Cuando se pretende
ofrecer acceso a grupos, se debe utilizar la directiva AuthGroupFile. Se asocia esta directiva con
el nombre de un fichero que contenga la descripción de los grupos. El formato de este archivo
es muy sencillo y puede ser creado con cualquier editor de texto. Por ejemplo, se puede crear un
fichero llamado /usr/local/proyecto/conf/gruposdeacceso, con el siguiente contenido:
1 Dentro de “/bin” en la ruta donde se ha instalado el servidor.
16.2. AUTENTICACIÓN/AUTORIZACIÓN BASIC 255
separador (:)
lista de nombres de usuarios válidos (creados con htpasswd) separadas por espacios.
AuthType Basic
AuthName "Protegido mediante login/password"
AuthUserFile /usr/local/proyecto/conf/controldeacceso
AuthGroupFile /usr/local/proyecto/conf/gruposdeacceso
Require group matematicas
Existe también otra forma para permitir acceso a grupos de usuarios. Consiste en listar los usuarios
con acceso permitido directamente en la configuración de Apache, y no utilizar ningún fichero de
grupos adicional. Esta forma suele utilizarse cuando se tienen pocos grupos y pocos usuarios en
cada grupo. Un ejemplo:
AuthType Basic
AuthName "Protegido mediante login/password"
256 CAPÍTULO 16. AUTENTICACIÓN, AUTORIZACIÓN Y CONTROL DE ACCESO
AuthUserFile /usr/local/proyecto/conf/controldeacceso
AuthGroupFile /dev/null
Require becario1 becario2
Aunque en la mayoría de los sitios basta con los métodos explicados en las secciones anteriores, en
ciertos casos, se puede necesitar algo más. Lo más típico es que el servidor maneje un gran número
de cuentas, lo que obliga a recurrir a soluciones más eficientes de gestión y almacenamiento (como
bases de datos o directorios).
También habrá casos en los que se necesitan métodos de administración para los que no se
encuentra ningún módulo disponible en Apache, en esos casos, no queda otro remedio que recurrir
a la programación.
Varias son las razones para utilizar sistemas avanzados como bases de datos o directorios, frente
al mecanismo estándar basado en ficheros. Entre ellas:
Hay varios módulos de Apache que permiten hacer autenticación de usuarios contra una base de
datos. Alguno de los más conocidos y utilizados se listan a continuación:
mod_auth_mysql: provee las directivas necesarias para manejar autenticación contra bases
de datos con formato MySQL.
...
...
Desde el punto de vista del cliente, estos métodos no suponen ninguna diferencia. Para todos ellos
aparecerá el diálogo estándar pidiendo login/password. Los cambios solamente afectan a como el
servidor chequea la validez de los datos proporcionados por el usuario.
Uno de los casos más típicos en el que se usan programas auxiliares es cuando se trata de
automatizar la gestión de las claves de acceso de usuarios.
Generalmente se recurre a un programa CGI (en cualquier lenguaje de programación) o algún tipo
de código embebido en HTML (PHP, etc.). Lo único realmente importante es que el lenguaje
elegido proporcione de manera sencilla facilidades de encriptación de passwords, manejo de
ficheros y si es necesario, acceso a bases de datos o directorios. Un buen ejemplo de un lenguaje
que da soporte a todo esto es Perl. Podría tenerse un código parecido al siguiente:
# Encriptación de datos
...
use DBI;
my $dbh = DBI->connect(’DBI:mysql:database’, ’username’,’clave_db’);
my $sth = $dbh->prepare("update passwords
set passwd = ’$crypt’ where username = ’$username’");
$sth->execute;
$sth->finish;
$dbh->disconnect;
<Location /private/>
AuthType Digest
AuthName "Área privada"
AuthDigestDomain /private/
AuthDigestFile /usr/local/proyecto/conf/controldigest
Require valid-user
</Location>
Al igual que para autentificación básica se proporciona la utilidad htpasswd, para autentificación
digest, Apache proporciona htdigest que automatiza la creación de los ficheros con las cuentas.
3 También se proporciona una implementación antigua, que probablemente no funcione con los navegadores actuales,
llamada “mod_digest”.
4 Aunque algunos sí, por ejemplo “Amaya”, un proyecto del W3C.
16.4. CONTROL DE ACCESO 259
Order deny,allow
Deny from all
Allow from ei.universidad.es 193.147.87.211
Existe una directiva Satisfy que tiene especial relevancia cuando en la configuración de un recurso
se mezclan directivas de control de acceso (Allow, Deny, etc.) y la directiva de autenticación
Require. Satisfy puede tener dos valores all o any. El comportamiento por defecto es all e
indica que antes de darle acceso a un cliente, este debe cumplir las restricciones impuestas por las
directivas de control de acceso y también proporcionar un login/password válido. Con el valor
any, bastará con cumplir una de las restricciones. Por ejemplo, se puede proteger un recurso de
forma que se permita el acceso a todos los usuarios de la red local, y a cualquier usuario externo
que conozca el login/password:
Si se pretende implantar alguno de los métodos explicados en las secciones anteriores, deben
tenerse en cuenta las siguientes consideraciones de seguridad:
Además debe atenderse a las tres consideraciones típicas sobre cualquier contraseña. Por
un lado se garantizará que la distribución de las contraseñas es segura (PGP, etc.). Por otro,
si un usuario puede cambiar su contraseña, debe hacerlo de manera segura. Por último,
la contraseña debe ser algo lo suficientemente difícil de adivinar, por ejemplo no debería
utilizarse el nombre, dni o fecha de nacimiento.
Capítulo 17
17.1 Introducción
mod_dav es un módulo de Apache que proporciona capacidades DAV (vea la sección 7.3 en la
página 102). Actualmente proporciona todas las capacidades básicas para manipular recursos
remotos. Desde la versión 1.0, mod_dav es suficientemente estable, aunque la versión actual
1.0.2 (Octubre 2000) corrige algunos pequeños errores y mejora los procesos de instalación y
configuración.
Aunque mod_dav [70] se incorpora como un módulo más de la distribución estándar de Apache
2.0, en las versiones 1.3.X debe ser instalado como módulo de tercera parte. Realizar la
configuración correctamente es el objetivo de este capítulo.
261
262CAPÍTULO 17. HABILITANDO LA GESTIÓN REMOTA DE RECURSOS CON WEBDAV
# mv mod_dav-1.0.2-1.3.6.tar.gz /usr/local/proyecto/src
# cd /usr/local/proyecto/src
# gunzip -c -d mod_dav-1.0.2-1.3.6.tar.gz | tar xf -
# cd mod_dav-1.0.2-1.3.6
Aprovechando que se dispone de un servidor Apache que soporta DSO, se puede añadir este nuevo
módulo de manera dinámica2 . Se siguen los siguientes pasos:
En primer lugar se configura la instalación, indicando donde se encuentra el programa apxs que
se encargará de compilar este nuevo módulo:
./configure --with-apxs=/usr/local/proyecto/apache/bin/apxs
1 El nombre del módulo es confuso, pero no se necesita instalar un apache 1.3.6 para utilizarlo. Funcionará
correctamente con las versiones de Apache iguales o superiores a 1.3.6.
2 Aunque puede utilizarse cualquier otro tipo de instalación, más información en la Web de “mod_dav”.
17.4. CONFIGURANDO APACHE PARA MANEJAR MOD_DAV 263
make
su
make install
make construye el código atendiendo a sus reglas internas. Con su se pasa a ser superusuario
de la máquina. Finalmente make install ubica el módulo recién construido libdav.so en la
ubicación adecuada.
Como para cualquier otro módulo DSO, debe informarse a Apache de que el nuevo módulo ha
sido instalado y está disponible. Se añaden las siguientes directivas al fichero de configuración
httpd.conf3 :
Se pueden habilitar las capacidades DAV en secciones específicas del servidor Web. Para ello
dentro de cualquier sección <Directory> o <Location> se inserta la directiva:
DAV On
DAVLockDB /usr/local/apache/var/DAVLock
Esta directiva sólo puede aparecer en los contextos de Apache server config y virtual host (vea la
sección 11.4.1 en la página 152). Llega con que aparezca una vez e indica el nombre de un fichero
especial que mod_dav creará4 para gestionar los bloqueos. Debe garantizarse que sea accesible
por el proceso del servidor Web. Además no estará ubicado en una partición montada por NFS ya
que mod_dav usa llamadas a funciones de sistema no permitidas en volúmenes NFS.
3 Si
se ha utilizado la instalación como módulo dinámico en una plataforma Linux/Unix, este proceso se realiza
automáticamente.
4 En realidad se crean varios ficheros con el nombre especificado y diversas extensiones.
264CAPÍTULO 17. HABILITANDO LA GESTIÓN REMOTA DE RECURSOS CON WEBDAV
DAVMinTimeout 600
Si un cliente solicita un tiempo menor, se ignora, utilizando en cambio el especificado por esta
directiva. Por ejemplo los Web folders de Microsoft establecen un temporizador de 2 minutos (120
segundos), con esta directiva el servidor ignora este valor y utiliza el suyo propio, por ejemplo 10
minutos (600 segundos).
El estándar WebDAV define una petición llamada PROPFIND que se encarga de solicitar las
propiedades de recursos en un servidor WebDAV. Existe un parámetro para PROPFIND, que
define la profundidad (Depth) hasta la que se buscan las propiedades. Depth acepta el valor
Infinity y esto es potencialmente peligroso. Una búsqueda de este estilo recorre todo el repositorio
devolviendo información de cada recurso. Como mod_dav construye las respuestas en memoria
se puede llegar a consumir una cantidad demasiado grande.
Para prevenir este posible problema se proporciona la directiva DAVDepthInfinity, que permite
habilitar(on) o deshabilitar (off), la exploración recursiva. Puede aplicarse tanto a nivel de servidor
como en secciones <Directory> o <Location>. Un ejemplo que deshabilita esta propiedad en todo
el servidor:
DAVDepthInfinity Off
Las peticiones en formato XML se analizan en memoria, esto puede dar lugar a problemas de
desbordamiento. Alguien con malas intenciones podría realizar un ataque “Denial of Service”5 ,
enviando a nuestro servidor peticiones con grandes cantidades de datos.
La directiva proporcionada por Apache LimitRequestBody evita este tipo de peticiones en los
métodos de uso más habitual con HTTP. Desgraciadamente esta directiva no es aplicable en
mod_dav, donde se deben permitir grandes cantidades de datos enviados a través de PUT.
5 Los ataques de este estilo se basan en enviar a un equipo más peticiones de las que puede atender. Finalmente el
Para limitar exactamente los métodos que tengan un cuerpo en XML, mod_dav define la directiva
LimitXMLRequestBody. El valor por defecto es 1000000 de bytes, un valor de 0 deshabilita
esta propiedad. Puede establecerse tanto a nivel de servidor como en secciones <Directory> o
<Location>. Un ejemplo:
LimitXMLRequestBody 2000000
En esta sección se establece una sencilla configuración de prueba del servidor WebDAV, se tiene un
directorio en el servidor (/usr/local/proyecto/dav/)6 , que se podrá utilizar como repositorio
a través de la URL http://localhost/dav/. A continuación se muestran las líneas necesarias
en httpd.conf:
DAVLockDB /usr/local/proyecto/dav/DAVLock
DAVMinTimeout 100
<Directory "/usr/local/proyecto/dav">
DAV On
</Directory>
Tras hacer estos cambios y reiniciar el servidor este ya está configurado, ¿y ahora que? Se
necesita un cliente. Como ya se comenta en una sección anterior (vea la sección 7.3.4 en la
página 104), existen múltiples clientes de WebDAV. Por su sencillez, facilidad de instalación
y disponibilidad para Linux, se ha elegido WebDAV Explorer. Puede descargarse desde la
URL http://www.ics.uci.edu/~webdav/download.html. Se obtiene un programa Java
compactado mediante tar y gzip (DAVExp-0.72.tar.gz). Una vez descomprimido estará listo
para ejecutar7 , mediante un fichero de lotes con un nombre parecido a DAVExplorer.sh .
El programa tiene la típica apariencia de los exploradores de sistemas de ficheros (figura 17.2).
Hay una barra de dirección donde se puede indicar la URL (habilitada para DAV) a la que debe
conectarse, y en los diversos menús pueden realizarse otras operaciones (bloquear, borrar, etc.).
6 El directorio necesita poseer permisos de escritura para el usuario que ejecuta Apache, o no se podrán realizar
operaciones de escritura.
7 Si se tiene instalada la plataforma Java 2. Si ese no es el caso, en una sección anterior (vea la sección 14.2.1 en la
18.1 Introducción
En un capítulo anterior (vea el capítulo 5 en la página 77) se discuten las distintas posibilidades
para conseguir una transferencia de datos más segura sobre el protocolo HTTP.
En Apache existen dos opciones en código abierto para conseguir un servidor Web “seguro”1 :
Apache-SSL [19] : una implementación de un servidor Web Apache con soporte para SSL.
No se usa un módulo, más bien un parche del core de Apache, junto con una serie de
elementos adicionales que se apoyan en OpenSSL.
1 Muchas soluciones comerciales también se basan en Apache. Por ejemplo Stronghold o IBM HTTP Server.
267
268 CAPÍTULO 18. CONFIGURAR CONEXIONES SEGURAS EN APACHE SOBRE SSL
Apache + mod_ssl [72]: es el servidor Apache con un módulo que sirve de enlace hacia
las funcionalidades proporcionadas por OpenSSL. Es una evolución natural a la alternativa
propuesta por Apache-SSL.
Las dos opciones anteriores son completamente diferentes, una es un módulo y la otra un parche,
aunque existe mucha confusión debido a que ambas se basan en OpenSSL y Apache. En
este capítulo se discute la instalación basada en mod_ssl, entre otras cosas porque está mejor
documentada, y es mantenido con mayor frecuencia.
La arquitectura (figura 18.1) para el servidor ”seguro” que se va a instalar a continuación se apoya
en tres elementos básicos:
mod_ssl: [72] esencialmente es un módulo adaptador para Apache que proporciona una
fuerte base criptográfica basada en los protocolos SSL v2/v3 y TLS v1 (implementados en
el conjunto de herramientas OpenSSL). El paquete de mod_ssl consiste en el módulo ssl
y en un conjunto de parches para Apache que entre otras cosas añaden el Extended API
(EAPI).
OpenSSL: [84] una implementación en código libre del protocolo SSL (vea la sección 5.2.5
en la página 83). En ciertos paises, para cumplir con la legalidad, OpenSSL debe utilizar un
conjunto de parches (RSAREF) que limitan sus funcionalidades.
OpenSSL debe estar instalado en el equipo. Las plataformas Linux actuales, como por ejemplo
RedHat 7.X, suelen incluir en sus distribuciones alguna versión. Si por cualquier circunstancia no
18.3. PRERREQUISITO: OPENSSL 269
se dispone del programa, el primer paso será conseguir una versión del código fuente2 en la Web
http://www.openssl.org (figura 18.2) e instalarla siguiendo las instrucciones.
Por ejemplo, una vez descargada la versión en código fuente contenida en el fichero
open_ssl0.9.6a.tar.gz pueden seguirse los siguientes pasos hasta completar la instalación:
# mv open_ssl0.9.6a.tar.gz /usr/local/proyecto/src
# cd /usr/local/proyecto/src
# gzip -d -c open_ssl0.9.6a.tar.gz | tar xvf -
cd openssl-0.9.6a
sh config
make
make test
Para verificar que la instalación fue correcta se prueba el ejecutable openssl escribiendo en la
línea de órdenes:
# openssl version
OpenSSL 0.9.6a 1 Apr 2001
Para que Apache utilice mod_ssl, es absolutamente necesario que sea construido con soporte
para la EAPI (Extended API). Esta se proporciona en el mismo paquete del módulo ssl (como
un parche del código fuente de Apache). Por tanto, a no ser que se consiga un servidor Web en
formato binario con la EAPI preinstalada, se está obligado a partir del árbol de código fuente de
Apache, aplicarle los parches y a continuación instalar de la manera habitual.
Si por el contrario se dispone de un servidor que ya ofrece la EAPI y soporta DSO, se puede
actualizar actualizar simplemente el módulo ssl (libssl.so) de una manera sencilla utilizando
apxs.
Para este ejemplo se supone que es la primera vez que se va a instalar mod_ssl, y no se ha
conseguido ninguna versión preconfigurada que ofrezca la EAPI. A continuación se describen los
pasos a seguir:
Siguiendo la operativa habitual para la instalación desde código fuente, se copian los paquetes
necesarios al directorio temporal de instalación y se descomprimen:
# mv apache_1.3.20.tar.gz /usr/local/proyecto/src
# mv mod_ssl-2.8.4-1.3.20.tar.gz /usr/local/proyecto/src
18.4. INSTALACIÓN DE APACHE + MOD_SSL 271
# cd mod_ssl-2.8.4-1.3.20
# ./configure --with-apache=../apache_1.3.20 \
--with-ssl=SYSTEM
Además pueden indicarse desde la misma línea de órdenes otros parámetros de la configuración
de Apache. Un ejemplo completo podría ser:
# cd mod_ssl-2.8.4-1.3.20
# ./configure --with-apache=../apache_1.3.20 \
--with-ssl=SYSTEM \
--prefix=/usr/local/proyecto/apache_ssl \
--enable-module=most \
--enable-shared=max \
--htdocsdir=/usr/local/proyecto/htdocs/ \
--cgidir=/usr/local/proyecto/cgi-bin/ \
--sysconfdir=/usr/local/proyecto/conf_ssl/ \
--logfiledir=/usr/local/proyecto/logs/ \
--enable-suexec \
--suexec-caller=apache \
--suexec-logfile=/usr/local/proyecto/logs/suexec_log
En pantalla irán apareciendo diversos mensajes, entre ellos los que indican que los parches han
sido aplicados y como se debe continuar con la instalación:
Una vez la configuración ha concluido, se cambia al directorio que contiene el código árbol de
instalación de Apache y se construye el software de la manera habitual:
# cd ..
# cd apache_1.3.20
# make
--- Omitimos varias líneas ---
| % make certificate TYPE=dummy (dummy self-signed Snake Oil cert) |
| % make certificate TYPE=test (test cert signed by Snake Oil CA) |
| % make certificate TYPE=custom (custom cert signed by own CA) |
| % make certificate TYPE=existing (existing cert) |
| CRT=/path/to/your.crt [KEY=/path/to/your.key] |
--- Omitimos varias líneas ---
Tras ejecutar make, se informa en pantalla de cual es el siguiente paso a seguir. El objetivo es
construir un certificado para el servidor4 . Con objeto de poder probar el software, mod_ssl permite
4 Una de las características de SSL es la necesidad de certificados para el servidor (vea la sección 5.2.2 en la página
79).
18.5. REVISANDO LA CONFIGURACIÓN 273
firmar el certificado generado mediante una CA (Autoridad Certificadora) ficticia llamada Snake
Oil CA. Para un servidor real en explotación debería reemplazarse este certificado de prueba con
otro expedido (y pagado) en una autoridad certificadora real, como Verisign [125] o Thawte [121].
El certificado se construye de manera sencilla mediante la siguiente orden:
Elegir algoritmo de PKI (clave pública) para uso con los certificados X.509, ¿RSA o DSA?
Por defecto se elige RSA.
Introducir datos del servidor (URL, nombre de empresa, etc.) para crear una solicitud de
certificado X.509 que luego podrá ser enviada a una autoridad certificadora real. El archivo
generado se llama server.csr.
Obtener certificado X.509 v3 de prueba (no válido para uso en explotación real), firmado
por la entidad certificadora local. El archivo se llama server.crt.
La clave privada server.key, para mayor seguridad, puede ser encriptada usando triple
DES. Si hacemos esto alguien deberá escribir la frase de paso cada vez que se quiera arrancar
el servidor.
Una vez se dispone de un certificado, sólo queda acabar la instalación de Apache de la manera
habitual. Si todo va bien, el servidor Web Apache estará preparado para servir peticiones sobre
SSL:
# su
# make install
ssl.crt : contiene los certificados digitales (servidor, entidad certificadora de prueba, etc.).
274 CAPÍTULO 18. CONFIGURAR CONEXIONES SEGURAS EN APACHE SOBRE SSL
ssl.csr : contiene la petición de firma de certificado X.509 (CSR, Certificate Signing Requests),
listos para ser enviados a una CA real (como Verisign por ejemplo).
ssl.key : contiene las claves privadas RSA (servidor, entidad certificadora de prueba, etc.)
generalmente encriptadas con Triple DES.
ssl.prm : si durante la creación del certificado se ha seleccionado usar el algoritmo DSA, en este
directorio se almacenarán ficheros de parámetros para este algoritmo.
Algunas de las directivas de Apache relacionadas con SSL más importantes se comentan a
continuación:
Las primeras en aparecer son las que indican a Apache que cargue el módulo necesario para SSL:
<IfDefine SSL>
LoadModule ssl_module libexec/libssl.so
</IfDefine>
<IfDefine SSL>
AddModule mod_ssl.c
</IfDefine>
A continuación se definen los puertos por defecto en los que escuchará el servidor, el puerto 443
es el estándar para recibir peticiones SSL (puerto HTTPS por defecto):
<IfDefine SSL>
Listen 80
Listen 443
</IfDefine>
Finalmente se crea un nuevo servidor virtual que responderá a las peticiones realizadas al puerto
443. En su versión más básica podría tener este aspecto5 :
<IfDefine SSL>
<VirtualHost _default_:443>
DocumentRoot "/usr/local/proyecto/htdocs"
5 Esta parte de la configuración, en realidad, aparece muy documentada e indica exactamente que hace cada directiva.
18.5. REVISANDO LA CONFIGURACIÓN 275
ServerName montsfortis.micasa.es
ServerAdmin txapi@montsfortis.micasa.es
ErrorLog /usr/local/proyecto/logs/error_log
TransferLog /usr/local/proyecto/logs/access_log
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH
:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /usr/local/proyecto/conf_ssl/ssl.crt/server.crt
SSLCertificateKeyFile /usr/local/proyecto/conf_ssl/ssl.key/server.key
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/usr/local/proyecto/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
CustomLog /usr/local/proyecto/logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
</IfDefine>
SSLCipherSuite: lista de métodos de cifrado que el servidor permite para negociación con
el cliente.
reference.html
276 CAPÍTULO 18. CONFIGURAR CONEXIONES SEGURAS EN APACHE SOBRE SSL
Modo de ejecución normal: se utiliza la siguiente orden para iniciar un servidor HTTP
estándar (sin soporte SSL) escuchando en el puerto 80:
# /usr/local/proyecto/apache_ssl/bin/apachectl start
Modo de ejecución con SSL: si se quiere que el servidor soporte transacciones “seguras”
tendremos que ser arrancado mediante alguno de las siguientes órdenes (ambas son
equivalentes):
# /usr/local/proyecto/apache_ssl/bin/apachectl startssl
o
# /usr/local/proyecto/apache_ssl/bin/httpd -DSSL
Varios son los navegadores (clientes) que ofrecen soporte para conexiones SSL (Netscape
Navigator, Microsoft Internet Explorer, Opera, etc.). Desde cualquiera de ellos puede visitarse
un sitio “seguro” notando el usuario sólo un par de diferencias respecto a la navegación habitual:
https://localhost/
Aparecen algunas ventanas de diálogo que advierten de la entrada/salida del sitio “seguro”
y presentan información sobre el certificado del servidor (figura 18.4).
278 CAPÍTULO 18. CONFIGURAR CONEXIONES SEGURAS EN APACHE SOBRE SSL
Capítulo 19
19.1 Introducción
Varios son los métodos que los servidores Web pueden utilizar para llevar un registro las
operaciones que se le solicitan (vea la sección 9 en la página 125). En este capítulo se explica
como configurar adecuadamente el servicio de log de Apache y como personalizarlo según las
necesidades particulares. También se presentan los métodos de instalación, configuración y uso
de un par de herramientas relacionadas:
279
280 CAPÍTULO 19. PERSONALIZAR EL REGISTRO Y RECOPILAR ESTADÍSTICAS
Apache incluye por defecto un módulo de log bastante potente: config_log_module1 . Este
proporciona varias funcionalidades interesantes:
Habilita la escritura tanto a fichero como a programas externos mediante tuberías (pipe).
En una configuración por defecto de Apache suelen aparecer una serie de líneas que afectan al
registro, todas ellas usan directivas que han sido comentadas en un capítulo anterior (vea la sección
11.9 en la página 195):
En la tabla (tabla 19.1) se recogen las variables de formato que pueden ser utilizadas con la
directiva LogFormat (vea la sección 11.9.2 en la página 198).
Variable Significado
%{variable}e Contenido de la variable de entorno especificada.
%{header}i Contenido de la línea de encabezado HTTP de petición “header”.
%{header}o Contenido de la línea de encabezado HTTP de respuesta “header”.
%{nota}n Contenido de la nota “nota” proporcionada por otro módulo de Apache.
%{formato}t Hora especificada en el formato indicado. El formato es el mismo que
utiliza la función strftime 2 .
%a Dirección IP.
%b Número de bytes enviados al cliente (sin encabezados HTTP).
%f Nombre de archivo solicitado por cliente.
%h Dirección IP del cliente o nombre completamente cualificado de la
máquina si HostNameLookups está activado.
%l Nombre de cliente remoto, contendrá valores tal y como se especifica en el
rfc1413 [92].
%p Puerto que escucha el servidor que ha atendido la solicitud. Puede ser útil
en servidores que alojan varios servidores virtuales.
%P Id del proceso secundario que atiende la solicitud.
%r Primera línea de la solicitud. generelmente incluyendo método de acceso,
URL y versión de protocolo.
%s Estado de respuesta. En solicitudes que se han redirigido internamente, por
ejemplo algún estado de la serie 300 (vea la sección 2.2.3 en la página 24),
es el estado de la solicitud original. Si queremos obtener el estado de la
última solicitud (esto es lo más habitual), utilizaremos %>s.
%t Hora en el formato espedificado por el formato común de registro.
%T Tiempo en segundos dedicados a atender la solicitud.
%u Nombre de usuario proporcionado para conseguir acceso a secciones del
Web protegidas con “nombe de usuario - contraseña.”
%U Ruta URL de la petición.
%v Nombre del servidor que atiende la solicutud.
Registro de remitente : el remitente (referer) es la anterior URL que ha visitado un cliente que en
este momento accede a nuestro servidor. El formato de registro que aparece a continuación
permite almacenar líneas con información del remitente y cual es la URL que está visitando
en nuestro servidor:
Registro de tipos de contenido : este formato permite almacenar información sobre el tipo de
contenido que el servidor envía como respuesta a una petición del cliente:
282 CAPÍTULO 19. PERSONALIZAR EL REGISTRO Y RECOPILAR ESTADÍSTICAS
Añadir campos extra al common log format (como en el caso del formato combined) puede no ser
muy deseable. Un ejemplo es cuando se dispone de un software de análisis de registro que sólo es
capaz de analizar ficheros en formato común. En casos como este, ¿perdemos información? No,
Apache permite crear cualquier número de ficheros de log en formatos diferentes.
Es habitual tener un fichero para el formato común y otros ficheros independientes para otros
datos significativos como por ejemplo el agente de usuario, el remitente y el idioma de elección
del cliente:
También es posible indicar formatos de log personalizados que dependan de una condición. De
esta forma se registra la información de manera condicional atendiendo al estado de respuesta. Por
ejemplo:
Cuando se alojan varios servidores virtuales resulta interesante poder guardar registro de la
actividad que genera cada uno. Para ello Apache permite utilizar dos técnicas:
19.3. PERSONALIZANDO LOS MÉTODOS DE REGISTRO DE INFORMACIÓN 283
<VirtualHost 193.147.87.211>
--- Omitimos varias líneas ---
ErrorLog /usr/local/apache/logs/virtual1/error_log
CustomLog /usr/local/apache/logs/virtual1/combined_log combined
</VirtualHost>
2. No incluir directivas de log en las secciones <VirtualHost>. En este caso el tráfico del
servidor virtual será registrado en el archivo de log del servidor primario. ¿Pero como se
distingue el tráfico de los distintos servidores virtuales? La solución es incluir el modificador
de formato %v (que indica el nombre del servidor) en el formato de log para el servidor
principal. Por ejemplo:
Un ejemplo: Cronolog
Instalando
# mv cronolog-1.6.1.tar.gz /usr/local/proyecto/src/
# cd /usr/local/proyecto/src/
# gzip -c -d cronolog-1.6.1.tar.gz | tar -xvf -
284 CAPÍTULO 19. PERSONALIZAR EL REGISTRO Y RECOPILAR ESTADÍSTICAS
Se cambia la ubicación hasta el directorio al raíz del árbol de instalación que se ha creado y se
instala siguiendo el método habitual3 :
# cd cronolog-1.6.1
# ./configure --prefix=/usr/local/proyecto/cronolog
# make
# su
# make install
La instalación crea subdirectorios dentro de la ruta indicada por el parámetro --prefix. Hay dos
subdirectorios que contienen la información del paquete instalado (/info y /man) y otro con los
ejecutables (/sbin).
Utilidades proporcionadas
Cronolog puede configurarse para su uso conjunto con Apache mediante canalizado de registros.
En el fichero httpd.conf deberán aparecer las siguientes directivas6 :
CustomLog "|/usr/local/proyecto/cronolog/sbin/cronolog
--symlink=/usr/local/proyecto/logs/combined_log
/usr/local/proyecto/logs/%Y/%m/combined_log" combined
ErrorLog "|/usr/local/proyecto/cronolog/sbin/cronolog
--symlink=/usr/local/proyecto/logs/error_log
/usr/local/proyecto/logs/%Y/%m/error_log"
3 Más información en la documentación que acompaña la instalación.
4 Sinecesita más información puede leer las página de man.
5 Según el formato especificado por la función date de Unix.
6 Cada directiva debe ocupar exactamente una línea aunque por claridad se presentan en tres.
19.4. COOKIES 285
Con las líneas de configuración anteriores se establece a donde envía Apache los datos de log,
lo que cambia respecto a una configuración basada en ficheros es la orden que aparece entre las
comillas. Su significado es el siguiente:
| : la barra vertical indica que los datos de log no se van a enviar a un fichero, sino a un pipe
hacia un programa.
– --symlink: para mantener un enlace simbólico desde la ubicación habitual del fichero
(/usr/local/proyecto/logs/combined_log) al lugar donde reside el fichero
actual que cronolog maneja (/usr/local/proyecto/logs/%Y/%m/combined_log).
– %Y/%m/combined_log: es un patrón que se incluye en el nombre del fichero. Indica
el modelo temporal según el que se particiona el fichero de log. En este caso, se crean
ficheros distintos para cada mes que son almacenados en una estructura de directorios
según el año (%Y) y el mes (%m).
19.4 Cookies
Apache provee por defecto un módulo para la gestión de cookies (mod_usertrack), este permite
manejar los encabezados HTTP relacionados con las cookies, como por ejemplo Set-Cookie:
La utilización es fácil, basta con añadir la directiva CookieTracking On para que se generen
cookies en cada nueva petición en el ámbito de visibilidad de la directiva. Un ejemplo completo
sería:
CookieTracking On
CookieName cookieejemplo
CookieExpires "2 weeks"
Aunque Apache permite el manejo de cookies, suele ser más cómodo utilizarlas desde el propio
código HTML utilizando alguna tecnología añadida. Un buen ejemplo es Client side JavaScript7 ,
un lenguaje de script que puede ser utilizado desde dentro de un documento HTML y es
interpretado en el cliente. Un código típico para el manejo de cookies desde JavaScript es el
siguiente:
En este apartado se explica brevemente como instalar y configurar Analog (vea la sección
9.3.1 en la página 128), una herramienta de análisis de log muy extendida. Se obtiene
el fichero de instalación en el sitio http://www.analog.cx/, existen diversos formatos de
paquete y código fuente. Para este proyecto se utilizará el código fuente incluido en el fichero
analog-5.03.tar.gz.
7 Una explicación completa de Javascript del lado cliente puede encontrarse en la Web de Netscape [80].
19.5. RECOPILACIÓN DE ESTADÍSTICAS. UN EJEMPLO: ANALOG 287
19.5.1 Instalando
# mv analog-5.03.tar.gz /usr/local/proyecto/src/
# cd /usr/local/proyecto/src/
# gzip -c -d analog-5.03.tar.gz | tar -xvf -
Antes de ejecutar make se puede editar el fichero src/anlghead.h para modificar algunas
opciones por defecto, aunque no es necesario ya que una vez instalado el programa también
pueden ser modificadas en el fichero de configuración estándar analog.cfg8 . Para continuar
con la instalación se ejecuta:
# cd analog-5.03
# make
# make clean
Para acabar solo queda mover todo el árbol de instalación (que contendrá el ejecutable analog,
fichero de configuración básico analog.cfg, y archivos auxiliares para presentación de resultados
vía Web) a la localización final del programa:
# cd ..
# mv analog-5.03 /usr/local/proyecto/analog
# cd /usr/local/proyecto/analog
19.5.2 Configurando
Analog es muy configurable, de hecho esta es una de sus mayores virtudes. Ejecutando ./analog
-settings se obtiene un listado completo de las opciones de configuración.
Configuración estándar
La manera más simple de configurar Analog es editar a mano el fichero analog.cfg. La sintaxis
y significado de todas las directivas está bien explicado tanto en los comentarios del propio
fichero, como en la documentación que acompaña al programa (directorio /docs). Algunas de
las directivas más importantes se muestran en la tabla (tabla 19.2).
8 Más información en la documentación que acompaña la instalación, en el directorio /docs.
288 CAPÍTULO 19. PERSONALIZAR EL REGISTRO Y RECOPILAR ESTADÍSTICAS
Directiva Significado
HOSTNAME Nombre del host que se analiza.
HOSTURL URL del host que se analiza.
LOGFILE Fichero de log que contiene los datos a analizar.
OUTFILE Nombre de fichero donde se volcarán los resultados.
LANGUAGE Idioma de presentación.
OUTPUT Formato de salida (ascii o html).
CONFIGFILE Fichero de configuración a incluir.
El uso adecuado de la directiva CONFIGFILE permite realizar una configuración muy flexible y
adecuada para su uso con múltiples servidores virtuales. Una posibilidad es dividir el fichero de
configuración estándar en tres:
SearchQuery.cfg: utilizado en los informes que recopilan información de los remitentes. Los
remitentes generalmente son buscadores, este fichero contiene líneas que permiten extraer
la información relevante de las cadenas de búsqueda:
analoggeneral.cfg: contendrá directivas generales para todos los servidores virtuales (por
ejemplo la directiva LANGUAGE):
19.5. RECOPILACIÓN DE ESTADÍSTICAS. UN EJEMPLO: ANALOG 289
IMAGEDIR /analogwww/
LOGO none
analog.cfg: sustituye al fichero de configuración por defecto, habrá uno distinto con
directivas específicas para cada servidor virtual (por ejemplo HOSTNAME).
CONFIGFILE /usr/local/proyecto/analog/analoggeneral.cfg
19.5.3 Ejecutando
Para proceder al análisis simplemente se ejecuta el programa ./analog, este lee los ficheros de
configuración preparados en la sección anterior y recorre los logs generando informes. Tras un
tiempo, que dependerá del tamaño de los ficheros a analizar, se obtiene el resultado (en formato
HTML o ASCII, dependiendo de la directiva OUTPUT). La ubicación de los informes será la
indicada por la directiva OUTFILE. Caso de haber generado la salida HTML el resultado podría
ser visualizado desde cualquier navegador (figura 19.1).
20.1 Introducción
Pero existen otros módulos [17] que le permiten al servidor realizar las más variadas tareas, una
lista bastante completa puede obtenerse en http://modules.apache.org. En este capítulo no se
describirán todos en profundidad1 , sino que sólo se hará un breve comentario de algunos módulos
1 Describir todos los módulos de Apache podría ser objeto por si sólo de un libro de bastantes hojas. A fecha de
293
294 CAPÍTULO 20. OTROS MÓDULOS Y TECNOLOGÍAS RELACIONADAS
interesantes que le permitirán al lector hacerse una idea más clara de la potencia de Apache.
Asimismo también se dedica un punto a las interfaces gráficas de administración, que aunque no
son módulos de Apache propiamente dichos, se consideran lo suficientemente importantes como
para mencionarlas.
mod_backhand [69] es un módulo que proporciona una solución para realizar redirecciones HTTP
dentro de un cluster de servidores Web, basándose en las peticiones. Esta utilidad permite
construir políticas de balanceo de carga entre máquinas, consiguiendo un mejor aprovechamiento
de los recursos infrautilizados.
La redirección se basa en los recursos disponibles dentro del cluster, el propio módulo se encarga
de anunciarlos mediante difusiones ethernet. Una vez conocidos los recursos, se puede activar
la redirección en base a directorios o localizaciones de Apache. El módulo será capaz de
preservar de manera transparente la información del host remoto para acceso y autenticación,
independientemente del equipo del cluster que responda. Hay más información disponible es
http://www.backhand.org/.
mod_throttle [73] es el módulo que parece ofrecer un conjunto de funcionalidades más completo
(está disponible en http://www.snert.com/Software/mod_throttle/). Para conseguir
controlar el ancho de banda consumido, este módulo monitoriza la dirección IP del cliente y
el nombre de usuario remoto. Además permite implantar limitaciones atendiendo a distintas
políticas. De esta manera se puede limitar el ancho de banda consumido en cada sección de
Apache (<VirtualHost>, <Directory>, <Location>), o en las peticiones de acceso de distintos
usuarios.
Varias son las opciones que se encargan de detectar y/o corregir la actuación de intrusos en el
servidor:
20.5. INTEGRACIÓN CON CORBA 295
Intrusion Detection Module: [52] es una herramienta sencilla que analiza en tiempo real las
peticiones de clientes e intenta determinar los intentos de intrusión. Más información en
http://yunus.hacettepe.edu.tr/~burak/mod_id/
ModCBroker [74] es un módulo de Apache que permite la construcción de interfaces Web para
aplicaciones CORBA. Implementa una traducción transparente de peticiones HTTP, de esta forma,
las interfaces Web se integran fácilmente con los sistemas de información empresariales basados
en CORBA.
...
ModCBroker está escrito en C/C++, las aplicaciones CORBA pueden estar escritas en cualquier
lenguaje con soporte CORBA. El software está disponible en http://www.gradsoft.com.ua/
eng/Products/cbroker/cbroker.html
Apache proporciona mod_proxy que incluye la funcionalidad necesaria para que el servidor
funcione como un proxy/caché2 . Soporta la funcionalidad necesaria para HTTP/0.9, HTTP/1.0
y FTP. Además usando el método CONNECT también se pueden implantar operaciones de proxy
mediante tuneling de otros puertos (443 para SSL, 563 para Snews, etc.). Este módulo se distribuye
con Apache, aunque no se habilita por defecto.
mod_proxy es válido para la mayoría de los administradores debido a su eficiencia y robustez, pero
es básicamente un proxy HTTP. Para aquellos que necesitan implantar un servicio proxy/caché
más general, es recomendable utilizar un servidor específico para estas tareas. Una buena solución
en Squid (http://www.squid-cache.org) un servidor proxy Open-Source muy extendido.
2 En un capítulo anterior (vea la sección 2.3.5 en la página 32) se comenta algo más de lo que es un proxy/caché.
296 CAPÍTULO 20. OTROS MÓDULOS Y TECNOLOGÍAS RELACIONADAS
20.8 Reescritura
Apache sirve los recursos considerando que la URL de la petición representa un path relativo a
DocumentRoot. Pero esta suposición no siempre es cierta, hay ocasiones en las que los recursos
de almacenan en ubicaciones no estándar. Para ello Apache ofrece dos funcionalidades básicas:
mod_rewrite se distribuye con Apache pero no se instala por defecto ya que sus
características no suelen ser necesarias a la mayoría de los usuarios.
Una de las necesidades más demandadas por los usuarios del comercio electrónico es la posibilidad
de realizar pagos seguros a través de la red. Al menos un módulo de Apache CyPay [35], se encarga
de la gestión de transacciones monetarias.
20.10. INTERFACES DE ADMINISTRACIÓN GRÁFICA 297
CyPay, Inc., es una compañía que desarrolla software para comercio electrónico. En febrero de
2000 anunció que había desarrollado un módulo de comercio electrónico para Apache. El módulo
es capaz de manejar transacciones sobre SSL e incluye acceso integrado a los servicios de pago
electrónico que proporciona la empresa CyberSource (http://www.cybersource.com/, entre
ellos:
Cálculos de tasas.
...
Aunque cualquier buen administrador del sistema debe conocer las directivas de Apache y como
utilizarlas, esta no es razón para tener que realizar la configuración directamente editando archivos
de texto. El sitio Web http://gui.apache.org [15] centraliza los proyectos relacionados con
los GUIs para administración de Apache. Se comentan brevemente a continuación cuatro opciones
disponibles públicamente:
Comanche: COnfiguration MANager for apaCHE es una herramienta que funciona sobre el
sistema de ventanas X-Window y utiliza funciones Tcl/Tk. Existen versiones tanto
para Unix/Linux como NT. Más información es el sitio http://www.covalent.net/
projects/comanche/.
Mohawk: también funciona bajo X-Window, está escrito en C y se basa en las librerías gráficas
de GTK/Gnome. Más información es el sitio http://eunuchs.org/linux/Tkapache/.
Linuxconf: es una herramienta de carácter general que se incluye en las distribuciones Linux de
Red Hat. Puede ser utilizado bajo distintos entornos: desde una consola en modo texto,
como una aplicación propia en una ventana X-Window o desde una interface Web. Esta
escrito en C y no necesita librerías especiales (salvo para la versión que funciona en X-
Window). Más información es el sitio http://www.solucorp.qc.ca/linuxconf/
298 CAPÍTULO 20. OTROS MÓDULOS Y TECNOLOGÍAS RELACIONADAS
20.11 Conclusión
Apache es el servidor Web más usado, quizá por ello muchas empresas y desarrolladores
particulares dedican sus esfuerzos a la creación de módulos que lo toman como base. Estos
módulos añaden prácticamente todas las funcionalidades imaginables, haciendo de Apache un
servidor Web aún mejor. La mayoría de los productos son software libre, aunque también hay
algunos de pago o incluso soluciones a medio camino donde se paga cierta cantidad en concepto
de soporte a la instalación.
Parte III
Aplicación práctica 2:
Desplegando soluciones reales basadas
en Web
299
Una posible situación real
Hasta ahora hemos configurado un servidor con los servicios básicos y ciertas extensiones que
potencian su utilidad. Aunque seguro que hay personas3 a las que les llegue con tener un
“super servidor” con todo lo último funcionando para ser feliz, lo interesante es poder desplegar
aplicaciones reales. Actualmente existen multitud de aplicaciones que funcionan sobre la base
de servidores Web, y cada día aparecen más (debido a fenómenos como el boom del comercio
electrónico o la proliferación de las Intranets empresariales).
En esta parte se supone un caso práctico, el servidor Web de una Escuela de Informática
donde el lector es el administrador Web. Concretamente estamos en la Escuela de Informática
de la universidad llamada Universidad. El centro configura un “ecosistema” medianamente
complejo (profesores, alumnos, personal de administración y servicios, diversos departamentos
con docencia, áreas de conocimiento, administración, etc.), y como no, todo el mundo quiere
tener su información en Internet. Supondremos que se parte de “la nada”, es decir, que nadie
tiene ni siquiera una página Web, y que se va a crear un servidor en el que se gestionará toda la
información. A partir de aquí, y con el supuesto paso del tiempo van a surgir necesidades, tanto
de los usuarios como del propio administrador, que llevarán a reconfiguraciones en el servidor,
búsqueda e instalación de nuevos servicios4 , etc.
Sobre este ejemplo, y en lenguaje coloquial, en los siguientes capítulos se narrará la historia de la
evolución del servidor Web.
301
302
Capítulo 21
Primeros pasos
Toda la Escuela de Informática está ilusionada, ¡ya eran horas de estar presentes en Internet! Se
hacen multitud de solicitudes a la dirección para crear un sitio Web. Una comisión especial se
reúne y acuerda nombrar un administrador que se encargará del estudio e implantación de las
soluciones necesarias (y a poder ser lo antes posible).
Linux.
303
304 CAPÍTULO 21. PRIMEROS PASOS
pero sin incluir el servidor HTTP por defecto, ya que sabe que no está muy actualizado (apache
1.3.12).
Nos encontramos por tanto ante un equipo completamente configurado pero sin servidor Web.
Aquí comienza nuestro trabajo.
Decidimos instalar un servidor Web Apache desde código fuente, utilizando APACI y habilitando
todos los módulos estándar como DSO. Una vez instalado, y con la configuración por defecto,
arrancamos el servidor que se pondrá a la escucha en el puerto 80.
Puede encontrar más información sobre este tema en la anterior parte de este proyecto, donde se
dedica un capítulo completo a los diversos métodos de instalación del servidor Web Apache bajo
Linux/Unix (vea el capítulo 10 en la página 133).
Por fin tenemos la infraestructura, hemos instalado el servidor Web y parece que funciona. Ahora
podemos publicar el primer sitio Web de nuestra Escuela. A la página le llamamos index.html y
la ubicamos en el directorio htdocs que se crea durante la instalación de Apache para ubicar los
contenidos HTML. A continuación presentamos el código de esta primera página y la apariencia
(figura 21.1) que ofrece en un navegador que se conecte a ella (http://www.ei.universidad.
es/index.html):
<html>
<title>EUEIE</title>
<body>
<h1 align=center>
Escuela Universitaria de Informática de <b>Ejemplo</b>
</h1>
<br><br>
<hr>
<p>Para dudas o comentarios envie un mail al
<a href="mailto:webmaster@ei.universidad.es">administrador</a>
</p>
21.3. PUBLICAR LA PRIMERA WEB DE LA ESCUELA 305
<hr>
</body>
</html>
El sitio Web de nuestra Escuela comienza a crecer, se incluye distinta información (calendario
de exámenes, normativa, horarios de clase, etc, y también información muy básica sobre los
departamentos con docencia). Con el paso del tiempo, algunos departamentos empiezan a barajar
la idea de poseer su propio servidor, entre otras cosas porque no les gusta su URL actual:
http://www.ei.universidad.es/deptos/<NOMBRE_DEPTO>/index.html
http://<NOMBRE_DEPTO>.ei.universidad.es/
Tras la correspondiente reunión se da el visto bueno a esta propuesta, y se aprueba que todos los
departamentos tengan su propio servidor, al que se podrá acceder con una URL adecuada. Se pone
el asunto en manos del responsable del servidor Web para que estudie las posibilidades.
El administrador desea seguir teniendo el control de todos los sitios Web relacionadas con la
Escuela de Informática, además no hay presupuesto para comprar nuevas máquinas, contratar
personas para que las administren o incluso para conseguir nuevas IPs. La solución parece clara,
necesitamos servidores virtuales.
306 CAPÍTULO 21. PRIMEROS PASOS
La imposibilidad de conseguir nuevas IPs, sólo nos deja una solución, utilizar hosts virtuales
basados en nombre. Como no vamos a alojar un número extremadamente grande de hosts
(supongamos que puede haber 15 departamentos con docencia), no utilizaremos la configuración
dinámica que provee el módulo mod_vhost_alias4 .
Varios son los cambios a realizar en el fichero httpd.conf. En primer lugar y para evitar
posibles olvidos, indicamos nuestra intención de usar hosts virtuales basados en nombre mediante
la directiva NameVirtualHost y definimos el host virtual por defecto (vea la sección 12.5.1 en la
página 222) que atenderá las peticiones que no se dirijan explícitamente a ninguno de los otros
servidores alojados:
NameVirtualHost *:*
<VirtualHost _default_:*>
#Datos generales del servidor por defecto.
ServerAdmin webmaster@ei.universidad.es
DocumentRoot "/usr/local/proyecto/htdocs"
ServerName www.ei.universidad.es
# Definiendo el log.
CustomLog "|/usr/local/proyecto/cronolog/sbin/cronolog
--symlink=/usr/local/proyecto/logs/combined_log
/usr/local/proyecto/logs/%Y/%m/combined_log" combined
ErrorLog "|/usr/local/proyecto/cronolog/sbin/cronolog
--symlink=/usr/local/proyecto/logs/error_log
/usr/local/proyecto/logs/%Y/%m/error_log"
</VirtualHost>
Muchas de las directivas no se incluyen explícitamente, si no que heredan su valor del host
principal. Observe que el host virtual por defecto hace más legible la configuración.
El siguiente paso es incluir una nueva sección <VirtualHost> para cada departamento.
Presentamos aquí la configuración de uno de ellos, los demás se construyen de manera análoga:
<VirtualHost *>
# Cuestiones generales
ServerName matematicas.ei.universidad.es
DocumentRoot /usr/local/proyecto/htdocs/virtual/matematicas/
ScriptAlias /cgi-bin/
/usr/local/proyecto/cgi-bin/virtual/matematicas/
# Log de accesos
CustomLog "|/usr/local/www/cronolog/sbin/cronolog
--symlink=/usr/local/proyecto/logs/matematicas/combined_log
/usr/local/proyecto/logs/matematicas/%Y/%m/combined_log" combined
</VirtualHost>
Si observa el listado, verá que hemos usado la directiva ServerPath que garantiza la
compatibilidad con navegadores que no soportan hosts virtuales5 . Además también se ha
habilitado el registro de accesos6 mediante un fichero propio manipulado por el programa
cronolog7 .
En un navegador antiguo, podremos usar la URL alternativa definida por ServerPath. Para probar
que Apache responde correctamente utilizaremos cualquier navegador antiguo, o en su defecto el
telnet8 :
# telnet www.ei.universidad.es 80
Escape character is ’^]’.
GET /matematicas/ HTTP/1.0
HTTP/1.1 200 OK
Date: Sun, 29 Jul 2001 21:51:09 GMT
Server: Apache/1.3.20 (Unix) mod_jk DAV/1.0.2 PHP/4.0.6
Last-Modified: Sun, 29 Jul 2001 21:46:31 GMT
ETag: "494eb-7a-3b648437"
Accept-Ranges: bytes
Content-Length: 122
Connection: close
Content-Type: text/html
<html>
<body>
<h1>Departamento de matemáticas</h1>
Bienvenido a la página del departamento de matemáticas
</body>
</html>
Por último recuerde que puede chequear la configuración mediante el comando ./httpd -S. En
nuestra configuración obtenemos el siguiente resultado:
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
_default_:* www.ei.universidad.es
(/usr/local/proyecto/conf/httpd.conf:1182)
*:80 is a NameVirtualHost
default server informatica.ei.universidad.es
(/usr/local/proyecto/conf/httpd.conf:1194)
8 Con telnet, enviaremos a mano los encabezados necesarios pare hacerle creer al servidor que somos un cliente
Actualmente en el centro universitario hay una serie de archivos que están enlazados desde una
página Web, y que varían con el tiempo (horarios, fechas de exámenes, etc.). Estos documentos
pueden estar en varios formatos distintos (HTML, PDF, PS, DOC) dándole al usuario la posibilidad
de elegir el que más le interese. Además para cada archivo se ofrece información relevante del
mismo (fecha de modificación y tamaño).
Nos encontramos con el problema del mantenimiento, cada nuevo cambio en un archivo que
afecte al tamaño o fecha de modificación, debe reflejarse en la página Web correspondiente.
Buscamos alguna solución sencilla que permita remediar este problema. No queremos utilizar
recursos avanzados como lenguajes de programación externos o complicados lenguajes de código
embebido.
311
312 CAPÍTULO 22. ZONA DE DOWNLOAD DE MANTENIMIENTO AUTOMÁTICO
22.2.1 FancyIndexing
Probablemente la solución más sencilla sea colocar todos los ficheros a los que queremos dar
acceso en un directorio y emular un FTP utilizando la característica FancyIndexing (vea la
sección 11.6 en la página 174) de Apache. De esta manera podemos colocar un enlace desde
nuestra Web al directorio, y aparecerá un listado de su contenido formateado de la manera
adecuada.
Para obtener una configuración adecuada necesitamos, en primer lugar, configurar el directorio de
download con las siguientes directivas:
<Directory "/usr/local/proyecto/htdocs/p_ssi/download1">
Options +Indexes
AllowOverride None
Order allow,deny
Allow from all
</Directory>
Podemos dar cierta información adicional creando en el directorio los ficheros especiales de
encabezado (HEADER) e información (README). Como ejemplos:
------------------------------
Revise las fechas de actualización y los tamaños de los ficheros
antes de proceder a su descarga.
Por seguridad, es conveniente habilitar el FancyIndexing sólo en los directorios donde sea
absolutamente necesario.
22.2.2 SSI
Una solución un poco más elaborada y aparente consiste en utilizar una página con directivas SSI.
Si recordamos SSI (vea la sección 4.2 en la página 53) se habilita por defecto con Apache y sus
directivas no son extremadamente difíciles de entender o utilizar.
Con esta opción podemos dar un paso más en el diseño de la página de download, integrándola en
la apariencia general del sitio Web, pasando de ser un simple listado a por ejemplo, un conjunto
de tablas HTML.
Partiremos de una configuración básica de SSI (vea la sección 13.2 en la página 226) y habilitamos
el parsing sólo en el directorio de download mediante las siguientes directivas:
<Directory "/usr/local/proyecto/htdocs/p_ssi/download2">
# Habilitamos la posibilidad de ejecutar directivas SSI
# dentro de este directorio
Options +IncludesNOEXEC
AllowOverride None
Order allow,deny
Allow from all
</Directory>
En este directorio residirán los ficheros que están accesibles a la descarga, y una página con
directivas SSI, que ofrece información sobre los mismos. Mostramos a continuación una parte
significativa del código de esta página:
314 CAPÍTULO 22. ZONA DE DOWNLOAD DE MANTENIMIENTO AUTOMÁTICO
<html>
<head><title>EUEE</title></head>
<body>
<!--#config errmsg="" -->
<!--#config sizefmt="Kb" -->
<!--#config timefmt="%d/%m/%y - %H:%M:%S" -->
<br><H1>Calendario de examenes</h1>
<table border=1 cellpadding="1" cellspacing="0" width="100%">
<tr>
<td></td>
<td class=encabezado colspan=2>HTML
<!--#set var="html" value=".htm" --></td>
<td class=encabezado colspan=2>PDF
<!--#set var="pdf" value=".pdf" --></td>
<td class=encabezado colspan=2>PS
<!--#set var="ps" value=".ps" --></td>
<td class=encabezado colspan=2>DOC
<!--#set var="doc" value=".doc" --></td>
</tr>
...
<tr>
<!-- formato HTML -->
<td class=nombrecampo>Febrero
<!--#set var="fichero" value="./examenes/feb" -->
</td>
<td align=center>
<!--#set var="ficherov" value="$fichero$html" -->
<a href="<!--#echo var="ficherov" -->">
<!--#fsize virtual="$ficherov" --> </a>
</td>
<td align=center>
<!--#flastmod virtual="$ficherov" -->
</td>
...
</tr>
</table>
</body>
22.3. EL RESULTADO 315
</html>
22.3 El resultado
De cualquiera de las dos formas propuestas, obtenemos una asociación automática de un archivo
con su información relevante. Esta metainformación sobre el archivo nos ayudará a tomar la
decisión de “bajarlo” o no.
Con la solución basada en FancyIndexes el resultado será parecido a la figura (figura 22.1),
mientras con la solución basada en SSI el resultado sería parecido al de la figura (figura 22.2).
Pasa el tiempo, el sitio Web crece, cada vez hay más documentos HTML estáticos dentro del
directorio htdocs. Un buen día se aprueba en comisión que el sitio Web debe estar en tres idiomas
(gallego, español e inglés) para facilitar la difusión del mismo entre comunidades de hablantes
diferentes.
Al día siguiente por la mañana el administrador tiene el buzón de correo lleno de preguntas
respecto a como abordar esta gran cantidad de trabajo1 . Desafortunadamente no conocemos
ninguna buena herramienta que provea la traducción automática entre los tres idiomas
seleccionados, por tanto cada página deberá ser traducida a mano por sus creadores.
Pero aunque nuestro trabajo no es traducir, si que podemos estudiar cuál es la mejor manera de
ofrecer el servicio en varios idiomas. Se nos ocurren dos soluciones:
Poner enlaces a la versión en cada idioma dentro de la página de entrada al sitio Web. Es una
solución sencilla que no obliga a ningún trabajo por nuestra parte, pero suele ser engorrosa
para el usuario, al que obligamos a elegir su idioma de preferencia.
1 Versiones en tres idiomas implican tres veces más trabajo
317
318CAPÍTULO 23. NEGOCIACIÓN DE CONTENIDO PARA PERSONALIZAR EL IDIOMA
Utilizar la negociación de contenidos (vea la sección 2.3.1 en la página 30), que entre
otras cosas permite conocer la preferencia de idiomas del usuario sin la necesidad de
preguntárselo explícitamente. De esta manera puede presentársele automáticamente la
información en el formato que más le interesa. Esta segunda opción si requiere de algo
de trabajo por parte del administrador.
AddLanguage es .es
AddLanguage en .en
AddLanguage gl .gl
LanguagePriority gl es en
Con AddLanguage2 añadimos idiomas que pueden ser usados en la negociación y sus extensiones
asociadas, mientras que con LanguagePriority3 determinamos la prioridad de cada lenguaje caso
de que el cliente no indique ninguno.
Lo último que queda es traducir cada página e indicar cuál es el idioma en que está escrita. Para
ello se les cambia el nombre incluyendo la extensión adecuada al idioma. Por ejemplo, el archivo
index.html ahora tendrá tres versiones (una por idioma):
index.html.es
index.html.en
index.html.gl
Los clientes (navegadores) de última generación también pueden ser configurados para que
expresen la elección del usuario respecto al idioma. Un ejemplo puede observarse en la figura
(figura 23.1).
Ahora que hemos configurado la negociación de contenido para el idioma, ¿por que no utilizarlo
para mejorar aún más el servicio que ofrece nuestro servidor? Efectivamente, decidimos
aprovechar la negociación de contenido para ofrecer un tratamiento de los errores más amigable y
2 (vea la sección 11.8.3 en la página 190)
3 (vea la sección 11.8.6 en la página 193)
23.3. PERSONALIZAR LOS MENSAJES DE ERROR 319
Pero tenemos un problema, hay ciertos parámetros que cambian en cada petición errónea y que
deberíamos incluir en los mensajes. Por ejemplo, la URL a la que intentamos acceder, el servidor
virtual que aloja la página, etc. Para presentar mensajes personalizados incluyendo este tipo de
información, podemos recurrir a SSI.
head.shtml (.gl, .es, .en): una cabecera con inclusiones SSI. Como ejemplo vea el contenido
del archivo de cabecera en gallego head.shtml.gl:
<HR>
<H2>
[<!--#echo var="REDIRECT_STATUS" -->]
<!--#echo var="title" -->
</H2>
<DIV>
foot.shtml (.gl, .es, .en): un pié con inclusiones SSI. El contenido del archivo de pié en
gallego foot.shtml.gl sería:
</DIV>
<HR>
<DIV ALIGN="center">
<font size=2>
<b>Aloxado en</b>:
23.3. PERSONALIZAR LOS MENSAJES DE ERROR 321
</BODY>
</HTML>
Además, por cada error4 tendremos también tres archivos .shtml (uno para cada idioma al que
vamos a traducir la explicación del error), que incluirán mediante directivas SSI el encabezado
(head.shtml) y pie (foot.shtml) definidos anteriormente. Por ejemplo el archivo que se procesará
cuando se produce un error 404 Not Found y el cliente tiene por idioma preferente el gallego es
404.shtml.gl:
Un ejemplo del resultado para un error 404 Not Found y un cliente que prefiere el gallego puede
observarse en la imagen (figura 23.2).
4 Hay bastantes errores, pero en la mayoría de los casos nos llegará con personalizar los más comunes (404, 500,
etc.)
322CAPÍTULO 23. NEGOCIACIÓN DE CONTENIDO PARA PERSONALIZAR EL IDIOMA
Un usuario con conocimientos de programación nos comenta que le gustaría poder ejecutar sus
propios scripts CGI. Es un usuario en el que confiamos, y decimos darle esa posibilidad.
Podemos habilitar la ejecución de CGIs para todos los usuarios, pero esto no nos interesa ya
que podría no ser muy seguro (vea la sección 13.3.6 en la página 236). La configuración que
realizaremos permitirá la ejecución sólo a los scripts del administrador y del usuario que realmente
necesita utilizar los CGI. Daremos los siguientes pasos:
1. Partimos de una instalación de Apache con el wrapper suEXEC activado (vea la sección
13.3.3 en la página 230).
2. Para permitir la ejecución de los scripts del administrador, utilizamos alguno de los métodos
de configuración básica de CGI que se comentan en un capítulo anterior (vea la sección
13.3.4 en la página 232). Concretamente elegimos la opción más extendida (de hecho suele
venir activada por defecto en el fichero httpd.conf ):
323
324 CAPÍTULO 24. LINKÓMETRO. EJECUCIÓN DE SCRIPTS CGI DE USUARIO
<Directory "/usr/local/proyecto/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
UserDir /home/*/public_html
<Directory /home/*/public_html>
Options Indexes
AllowOverride None
Order allow,deny
Allow from all
</Directory>
ScriptAliasMatch ^/~txapi/cgi-bin/(.*)
/home/txapi/public_html/cgi-bin/$1
<Directory /home/txapi/public_html/cgi-bin>
24.3. CONFIGURAR UN SCRIPT DE USUARIO DE EJEMPLO. “LINKÓMETRO” 325
Options ExecCGI
SetHandler cgi-script
</Directory>
Una vez preparado el soporte por parte del servidor, el usuario ya puede colocar sus scripts CGI.
En este caso, el usuario (txapi) ha hecho un pequeño programa en Perl, que se encarga de gestionar
sus enlaces preferidos (bookmarks) y mantener una página Web en su directorio personal con la
información de los mismos (figura 24.1). Al estar utilizando suEXEC, los scripts se ejecutarán
con los permisos del propietario, además se realizarán todas las comprobaciones de seguridad
asociadas (vea la sección 13.3.2 en la página 229).
Figura 24.1: Apariencia de una página Web de marcadores generada con el Linkómetro.
El programa, al que ha dado en llamar Linkómetro utiliza una serie de ficheros. Se presenta a
continuación la estructura de directorios y los permisos que “garantizan” la seguridad1 .
El usuario organiza su directorio Web en tres subdirectorios, uno para páginas (enlaces), otro para
gráficos (graficos) y uno más que contiene los scripts y ficheros de datos asociados (cgi-bin).
1 “Garantizan”, entre comillas, por que nada está absolutamente seguro en la red.
326 CAPÍTULO 24. LINKÓMETRO. EJECUCIÓN DE SCRIPTS CGI DE USUARIO
Dentro del directorio public_html, los directorios de páginas y gráficos deben tener permisos
755 y el directorio de ejecución de cgi 751.
El programa se compone de tres scripts de Perl (con extensión .pl), ficheros de modelo de páginas
Web (con extensión .htm) y un par de directorios de datos que leerá/escribirá el programa:
Dentro del directorio cgi-bin, nos basta con dar permisos sólo al propietario. Los scripts
CGI enl.pl, criptar.pl, cgi-lib.pl necesitan al menos poder ejecutarse, pero podemos
darle permisos 700. Los modelos de páginas enlaces1.htm, enlaces2.htm, menu.htm,
usuarios.htm se utilizan como plantillas que pueden ser leídas, completadas mediante un script
y presentadas como página Web. Estos modelos tendrán permisos de sólo lectura 400.
Los dos directorios que almacenan datos privados son: datos y linkometro_log. Ambos deben
tener permisos de acceso total para el usuario 700, y su contenido accesos de lectura y escritura
sólo para el usuario 600.
24.4 El resultado
El usuario ha escrito un conjunto de scripts CGI que le permiten manejar sus marcadores. Los
scripts se ejecutan bajo los permisos del propio usuario, lo que limita los riesgos de seguridad a la
vez que le da la posibilidad de crear contenido dinámico propio. El sistema se basa en formularios
que solicitan la información del usuario y la almacenan en un fichero de datos dentro del directorio
personal. Puede verse un ejemplo de la interface en la figura (figura 24.2).
El departamento de Matemáticas, también quiere que sus datos se publiquen en la Web. Han
convocado unas becas de verano para las personas interesadas. Tras el escrutinio de candidatos,
salen elegidos dos chicos que estudian “magisterio”.
En las primeras reuniones se habla del material que va a ser necesario. Ni el departamento, ni los
becarios tienen mucha idea. Finalmente se llega a la conclusión de que será necesario comprar un
ordenador, que viene de fábrica con su Windows Millenium Edition.
El jueves, celebrando con sus amigos de informática la beca recién concedida, los becarios piden
consejo sobre que programa usar para hacer las páginas Web.
- ...
- ¿ Word ?, mejor no.
- ¿Por qué no utilizais Macromedia Dreamweaver 4.0?, es fácil, visual y soporta WebDAV.
- ¿WebDAV? ¿Eso que es?
- Es la solución si quereis trabajar en conjunto, pero cada uno desde vuestra casa ...
El viernes, nueva reunión con el responsable del departamento para que compre dos licencias del
programa en cuestión. El departamento acepta la petición.
329
330 CAPÍTULO 25. DREAMWEAVER Y WEBDAV. GESTIÓN REMOTA DE SITIOS WEB
El lunes, comienza el trabajo. En el departamento piden dos cosas, que la página esté acabada antes
de septiembre, y que se intenten aprovechar las posibilidades más novedosas del Dreamweaver,
para así justificar la inversión realizada1 . Rápidamente se ponen en contacto con el administrador
de la Web, solicitando que se active el soporte WebDAV.
Sobre WebDAV (Web Distributed Authoring and Versioning) y sus entresijos teóricos ya se habló
en la primera parte de esta memoria (vea la sección 7.3 en la página 102). Las posibilidades
DAV de Apache también fueron analizadas anteriormente, comentábamos la existencia del módulo
mod_dav, las nuevas directivas de configuración que aporta e incluso llegamos a mostrar algún
pequeño listado de configuración (vea la sección 17.4 en la página 263).
Pero vamos a ir un poco más allá, partiendo del sitio Web del Departamento de Matemáticas2
habilitaremos WebDAV. De esta manera el sitio podrá ser construido de forma colaborativa
mediante los clientes Macromedia Dreamweaver de cada uno de los becarios. Lo primero será
añadir a httpd.conf las directivas generales de DAV (temporizadores y bloqueos):
DAVLockDB /usr/local/proyecto/dav/DAVLock
DAVMinTimeout 100
Luego se habilita en el servidor principal un directorio que va a tener acceso por DAV y que
coincidirá con el indicado por la directiva DocumentRoot del servidor virtual del Departamento
de Matemáticas. Asimismo estableceremos un alias (/dav) para este directorio. Con esto
conseguimos que todos los cambios realizados en http://www.ei.universidad.es/dav sean
accesibles automáticamente desde la URL del servidor virtual http://matematicas.ei.
universidad.es/:
<Directory "/usr/local/proyecto/htdocs/virtuales/matematicas">
DAV On
</Directory>
<Directory "/usr/local/proyecto/htdocs/virtuales/matematicas">
DAV On
AuthType Basic
AuthName "Directorio accesible mediante DAV"
AuthUserFile /usr/local/proyecto/conf/controlacceso
<Limit GET PUT POST DELETE PROPFIND PROPPATCH MKCOL
COPY MOVE LOCK UNLOCK>
Require user becario1 becario2
</Limit>
</Directory>
Las claves pueden ser creadas con la utilidad ./htpasswd que se distribuye con Apache,
por ejemplo, para introducir un nuevo usuario becario1 dentro del fichero de claves
../../conf/controlacceso:
25.3 El resultado
Desde sus casas los becarios pueden utilizar Macromedia Dreamweaver para crear el sitio Web,
al que accederán de manera controlada mediante su login/password personal. En la figura (figura
25.1) se observa un momento en el proceso de desarrollo.
332 CAPÍTULO 25. DREAMWEAVER Y WEBDAV. GESTIÓN REMOTA DE SITIOS WEB
333
334 CAPÍTULO 26. UDMSEARCH. UN BUSCADOR WEB
Tras unos días de búsqueda por la Web encontramos un programa de código libre1 UDMSearch
[122] que implementa un buscador completo bastante potente.
UDMSearch es un buscador (vea la sección 8.4 en la página 121) que funciona en prácticamente
todas las plataformas Unix/Linux y trabaja con SQL sobre diversos SGBD (Oracle, MySQL,
Interbase, etc.). Las últimas versiones se distribuyen con un API en C y bibliotecas que permiten
a aplicaciones de terceras partes añadir capacidades de búsqueda. Sus componentes básicos son:
2. Motor de búsqueda + interface Web: para recuperar la información de la base de datos. Está
disponible en distintos formatos (PHP, CGI en C, o CGI en Perl).
Utiliza un lenguaje booleano de búsqueda basado en los operadores típicos (and, or, not).
...
En futuras versiones se pretende añadir nuevas mejoras, como diferentes tipos de búsqueda (por
frases, de sinónimos, etc.) o la implementación como módulo de Apache.
1 Existen algunos otros, como por ejemplo Lucene [62].
2 Un protocolo que permite indexar el contenido de páginas obtenidas de una BBDDs.
26.3. INSTALACIÓN BÁSICA 335
# cp udmsearch-3.0.23.tar.gz /usr/local/proyecto/src
# cd /usr/local/proyecto/src
# gunzip -c -d udmsearch-3.0.23.tar.gz | tar xf -
# cd udmsearch-3.0.23
# ./configure --with-mysql \
--prefix=/usr/local/proyecto/aplicaciones/udmsearch
# make
# make install
A continuación se crea una base de datos de nombre udmsearch y sus tablas asociadas. La base de
datos es una parte fundamental en el buscador, en ella se almacenan los índices. Utilizamos una
utilidad estándar de Mysql (mysqladmin):
Actualmente en nuestro servidor existen páginas en tres idiomas: gallego, español e inglés.
UDMSearch permite añadir listas de parada (stopwords) para cada uno de ellos. Dentro del
árbol de instalación, en el directorio /create/stopwords/ se proporcionan listas de parada de
ejemplo. Basándonos en ellas podemos crear las listas de parada en español (stop.es.txt), gallego
(stop.gl.txt) e inglés (stop.en.txt) adecuadas a nuestras necesidades. Cada lista de parada es un
fichero de texto con el siguiente formato:
# idioma palabra
# ^ ^
INSERT INTO stopword(lang, word) VALUES (’es’, ’un’);
INSERT INTO stopword(lang, word) VALUES (’es’, ’una’);
INSERT INTO stopword(lang, word) VALUES (’es’, ’unas’);
336 CAPÍTULO 26. UDMSEARCH. UN BUSCADOR WEB
Una vez preparadas las añadimos a la BBDDs con las siguientes órdenes:
UDMSearch puede apoyarse en el programa Ispell para extraer raíces que se refieran a palabras de
significado parecido (plurales, tiempos verbales, etc.), de esta manera se “normalizan” las palabras
reduciendo el tamaño de la base de datos y mejorando la velocidad de búsqueda, pero se pierde la
capacidad de hacer búsquedas exactas.
El programa soporta de manera nativa la indexación de páginas HTML o de texto, pero también
puede analizar ficheros con otros tipos de datos, para ello se apoya en programas externos que
convierten a formato texto (por ejemplo catdoc que convierte desde documentos de Word o
ps2ascii que convierte desde PostScript).
instalación.
26.4. CONFIGURAR EL ROBOT INDEXADOR DE PÁGINAS 337
programa, contiene una serie de directivas abundantemente comentadas4 , alguna de los más
interesantes pueden verse en la tabla (tabla 26.1).
Directiva Significado
DBAddr Cadena de conexión con la base de datos. Recuerde que una
BBDD es absolutamente necesaria para el funcionamiento de
UDMSearch.
DBMode Establece la estructura de la tabla de vocabulario (dict). Existen
diversas posibilidades: multi, crc y single que es el valor por
defecto. En según que casos, una estructura es más eficiente
que la otra, pero para nosotros nos vale el valor por defecto.
DisAllow Establece tipos de archivo que no se quieren indexar, por
ejemplo *.exe, *.avi, etc.
HTTPHeader Cabeceras de identificación del robot indexador que se le
envían al servidor.
Robots UDMSearch puede respetar o no los estándares de exclusión
de robots. Con esta directiva puede configurarse este
comportamiento.
Server Es la directiva principal de la configuración, indica una URL
de salida para la indexación. Pueden añadirse tantas directivas
Server como se deseen.
Los valores por defecto son válidos para la mayoría de las directivas, los únicos cambios que
haremos en indexer.conf se muestran en el siguiente listado:
...
#######################################################
# Configuración de la cadena de conexión con la
# BBDD MySQL que acabamos de crear.
DBAddr mysql://root@localhost/udmsearch/
...
#######################################################
# Robots yes/no
# Activa/desactiva el uso de las características de
# exclusión de robots. Usar "no", no es ético para su
# uso en la red, pero puede utilizarse por ejemplo en
# la validación de enlaces de nuestro servidor.
4 Más información en las páginas man que se instalan con el programa.
338 CAPÍTULO 26. UDMSEARCH. UN BUSCADOR WEB
...
######################################################
#Server <url>
# Es la directiva principal de indexer.conf
# Añade una URL de comienzo.
Server http://www.ei.universidad.es/
Server http://matematicas.ei.universidad.es/
Server http://informatica.ei.universidad.es/
...
# /usr/local/proyecto/aplicaciones/udmsearch/sbin/indexer
Indexer[1182]: indexer UdmSearch v.3.0.23/MySQL started with
’/usr/local/proyecto/aplicaciones/udmsearch/etc/indexer.conf’
Indexer[1182]: [1] http://www.ei.universidad.es/robots.txt
Indexer[1182]: [1] http://www.ei.universidad.es/
...
Por defecto el programa lee la configuración de indexer.conf y procede con la indexación. Para
mantener la BBDD actualizada debe ejecutarse el programa cada cierto tiempo, no es una mala
idea automatizar la tarea con alguna utilidad, como por ejemplo cron.
Pero con el ejecutable (indexer) pueden hacerse más cosas que simplemente indexar. Para ello
se usan parámetros en la línea de órdenes5 . Por ejemplo:
5 El listado completo de parámetros puede consultarse en las páginas man que se instalan con el programa, mediante
indexer -C: para borrar el contenido de la base de datos, puede utilizarse por ejemplo,
antes de reindexar tras haber añadido nuevas listas de parada. La salida del programa sería
la siguiente:
# ./indexer -C
You are going to delete database ’udmsearch’ content
Are you sure?(YES/no)
indexer -S: para presentar estadísticas del proceso de recuperación de documentos para
indexación. La información proporcionada se parecerá a:
# ./indexer -S
UdmSearch statistics
Un programa CGI compilado hecho en C (search.cgi) que puede encontrarse en /bin, dentro
del directorio de destino del la instalación del programa6 . La interface es una página Web
no configurable que se genera desde el mismo programa.
Una página Web con inclusiones PHP (search.php). Reside dentro del árbol de instalación
bajo el path frontends/php/. La interface es una página Web configurable mediante
cambios en el archivo de modelo frontends/php/search.htm.mysql.
Podemos usar cualquiera de los interfaces (CGI o PHP), pero el más evolucionado es el
proporcionado por la versión PHP, que entre otras cosas soporta completamente la búsqueda con
operadores booleanos. Para configurarla se siguen los siguientes pasos:
6 En nuestro caso /usr/local/proyecto/aplicaciones/udmsearch/bin/search.cgi.
7 En nuestro caso /usr/local/proyecto/src/udmsearch-3.0.23/.
340 CAPÍTULO 26. UDMSEARCH. UN BUSCADOR WEB
1. Copiar los ficheros relacionados con la interface en un directorio adecuado. Por ejemplo:
# cp ./frontends/php/
/usr/local/proyecto/aplicaciones/busqueda/
...
DBAddr mysql://root@localhost/udmsearch/
DBMode single
...
3. Como la interface se apoya en PHP, obviamente necesitamos que nuestro servidor esté
preparado para manejar este tipo de código embebido8 . Posteriormente editamos el
fichero de configuración de Apache httpd.conf e incluimos las siguientes líneas que dan
acceso desde el Web a la búsqueda mediante la URL http://www.ei.universidad.es/
busqueda/:
# Control de acceso
Order deny,allow
Allow from All
</Directory>
</IfModule>
4. Y por fin reiniciamos Apache para que acepte los cambios y ya tenemos preparado el nuevo
motor de búsqueda de nuestro servidor.
8 En un capítulo anterior se explica como hacerlo (vea el capítulo 15 en la página 247)
346 CAPÍTULO 27. JIVE. UN SISTEMA DE FOROS BASADO EN SERVLETS Y JSP
...
<Context path="/jive"
docBase="webapps/jive"
debug="0"
reloadable="true">
</Context>
...
# mv application/classes /var/tomcat/webapps/jive/WEB-INF
# mv application/lib /var/tomcat/webapps/jive/WEB-INF
# jive.properties
# Note: you MUST edit this file to make Jive work.
# After copying this file into the
# the classpath of your servlet engine, change the "path"
# paramater to the full and exact path of where this file
# exists.
path =
/var/tomcat/webapps/jive/WEB-INF/classes/jive.properties
5. Instalar los skins, copiando el contenido del directorio de skins en el directorio creado para
Jive:
# mv skins/* /var/tomcat/webapps/jive
1 En nuestra instalación el fichero reside en /var/tomcat/conf/server.xml.
27.5. PROBAR 347
Tras rearrancar Tomcat para que acepte los cambios, se continua la configuración con una
herramienta basada en Web accesible desde la URL http://localhost:8080/jive/admin
(figura 27.1). Es muy cómoda y funciona como un wizard que nos guía paso a paso en el resto del
proceso:
27.5 Probar
Con la autoconfiguración de Tomcat para Apache activada (vea la sección 14.4.2 en la página
244), el acceso desde Apache a los servicios de Jive es prácticamente inmediato. Al teclear
la URL http://www.ei.universidad.es/jive/admin/ obtendremos acceso a la sección de
administración (figura 27.2).
Mientras que para el acceso de los usuarios se puede elegir entre varios skins o apariencias
distintas2 . En la distribución por defecto se incluyen dos skins, accesibles desde las URLs http:
2 Pueden crearse skins personalizados o conseguir más en el sitio Web de Jive.
348 CAPÍTULO 27. JIVE. UN SISTEMA DE FOROS BASADO EN SERVLETS Y JSP
//www.ei.universidad.es/jive/bay/ y http://www.ei.universidad.es/jive/vodka/
(figura 27.3).
Telnet no proporciona comunicación segura, un intruso podría tener acceso a datos privados
de las bases de datos.
349
350 CAPÍTULO 28. PHPMYADMIN. GESTIÓN WEB DE BASES DE DATOS MYSQL
¿No habrá alguna forma de administrar las BBDDs de manera remota, cómoda y “segura”?
Tras varios días de búsqueda por la Web encontramos phpMyAdmin (http://phpwizard.net/
projects/phpMyAdmin/), una aplicación en PHP que nos ofrece un interface Web para las bases
de datos MySQL. Esto parece ser justo lo que necesitamos y decidimos instalarlo.
El administrador controla un servidor MySQL completo. Para ello se debe abrir una
conexión con el SGBD identificándose como superusuario.
Los usuarios particulares administran sus propios datos. Para ello se establecerá una
conexión como usuario con permisos de lectura y escritura en la base de datos concreta.
28.2.1 Instalación
# cd /usr/local/proyecto/aplicaciones/myadmin/
# tar xvzf phpMyAdmin-2.2.0rc3-php.tar.gz
# cd phpMyAdmin-2.2.0rc3-php
2. Editar el fichero config.inc y establecer los valores necesarios de host, usuario y password
de la base de datos. Estableceremos los valores adecuados para conseguir acceso como
superususario, porque lo que pretendemos es administrar todas las bases de datos de manera
remota.
phpMyAdmin es una aplicación PHP, por tanto para ejecutarla debemos tener un servidor Web
que soporte este lenguaje1 .
Una vez tenemos Apache preparado, podemos configurarlo (editando httpd.conf) para dar
acceso desde la URL http://www.ei.universidad.es/myadmin/ al directorio donde hemos
instalado el programa:
1 En un capítulo anterior se analiza como hacerlo (vea el capítulo 15 en la página 247).
28.2. EL PROGRAMA PHPMYADMIN 351
# Habilitar myadmin
<IfModule mod_alias.c>
# Alias del directorio de instalación
Alias /myadmin/ "/usr/local/proyecto/aplicaciones/myadmin/"
# Configuración de acceso al directorio
<Directory "/usr/local/proyecto/aplicaciones/myadmin/">
Options none
AllowOverride None
DirectoryIndex index.php
Order allow,deny
Allow from all
</Directory>
</IfModule>
Por último se rearranca el servidor Web (apachectl restart) para que se activen los cambios
en la configuración.
phpMyAdmin nos presenta dos frames, a la izquierda el listado de todas las bases de datos de
MySQL y a la derecha distintos enlaces a documentación, cambio de idioma, creación de nuevas
bases de datos, etc.
Tras un tiempo navegando por el sistema, estamos convencidos de proporciona una forma muy
cómoda de gestionar de manera remota el SGBD. Pero ¿es seguro?, desgraciadamente no. Los
datos sobre HTTP se transmiten en claro y ni siquiera estamos controlando el acceso a la URL
http://www.ei.universidad.es/myadmin/. Pero existen algunas soluciones.
Mediante autenticación básica se exige un login/password para el acceso a directorios con datos
relevantes2 . Para nuestro caso crearemos un usuario mysql que será el único con acceso al
directorio donde hemos instalado myadmin. Se utiliza la utilidad htpasswd:
Además, como un sistema de seguridad añadido se puede establecer algún mecanismo de control
de acceso. Limitaremos el acceso por IP, ya que conocemos las IPs de los dos equipos desde los
que se realizan tareas de administración de la base de datos. Dentro del fichero de configuración
de Apache httpd.conf, indicamos las directivas necesarias para añadir la autenticación y control
de acceso:
# Habilitar myadmin
<IfModule mod_alias.c>
# Alias del directorio de instalación
Alias /myadmin/ "/usr/local/proyecto/aplicaciones/myadmin/"
2 En un capítulo anterior (vea la sección 16.2 en la página 254) se explica el concepto más en profundidad
28.3. AÑADIENDO SEGURIDAD 353
# Autenticación básica
AuthType Basic
AuthName "Acceso exclusivo a administrador MySQL"
AuthUserFile /usr/local/proyecto/conf/controldeacceso
Require user mysql
###################
# Control de acceso
###################
Order deny,allow
Deny from All
Allow from 127.0.0.1 193.147.87.211
</Directory>
</IfModule>
28.3.2 SSL
Con los cambios de la sección anterior se consigue un cierto grado de seguridad, pero podemos
mejorarlo utilizando las capacidades SSL de Apache. Más información teórica sobre este tema
puede encontrarse en un capítulo anterior (vea la sección 5.2 en la página 78). También se le ha
dedicado un capítulo a la instalación práctica de SSL con Apache (vea la sección 18 en la página
267).
Se parte de un servidor con el soporte SSL activado, y se introducen algunos cambios en el fichero
de configuración, lo único necesario es incluir las mejoras de seguridad que se presentan en la
sección anterior dentro del servidor virtual que maneja las peticiones https:
<VirtualHost _default_:443>
...
<IfModule mod_alias.c>
# Alias del directorio de instalación
354 CAPÍTULO 28. PHPMYADMIN. GESTIÓN WEB DE BASES DE DATOS MYSQL
# Autenticación básica
AuthType Basic
AuthName "Acceso exclusivo a administrador MySQL"
AuthUserFile /usr/local/proyecto/conf/controldeacceso
Require user mysql
# Control de acceso
Order deny,allow
Deny from All
Allow from 127.0.0.1 193.147.87.211
</Directory>
</IfModule>
</VirtualHost>
Y con esto por fin conseguimos cumplir los objetivos, hemos establecido un sistema para
administrar las BBDDs de manera remota, que a la vez es cómodo de manejar desde una
interface hipertexto basada en Web y bastante seguro si consideramos las tecnologías disponibles
actualmente.
Parte IV
355
Conclusión y trabajos futuros
Conclusión
En esta memoria se cubren los aspectos más relevantes de la World Wide Web desde el punto de
vista de un Webmaster. Se ha pretendido dar una visión global de las tecnologías y servicios que
se pueden utilizar en un servidor Web o de aplicaciones, con pequeños ejemplos prácticos de las
mismas.
El sector está creciendo muy deprisa, haciendo que algunos productos pasen a explotación,
cuando no son todo lo estables que deberían.
Trabajos futuros
Probar un poco más a fondo las posibilidades reales los servidores Web y de aplicaciones
del mercado, haciendo una comparativa completa de los mismos. En este proyecto, la base
de todos los ejemplos prácticos ha sido el servidor Web Apache (el de más difusión en la
actualidad), aunque también han sido probados algunos otros servidores (como Jigsaw o
Enhydra).
Seguir la evolución de las nuevas tecnologías asociadas a los servidores Web, manteniendo
siempre una visión global de todas ellas. Es un campo interesante y amplio, debido a la
velocidad con que aparecen nuevas soluciones.
Por último, hacer un estudio parecido al que se presenta en esta memoria pero aplicado al
lado cliente. Por ejemplo, podrían analizarse los clientes Web del mercado (navegadores,
gestores de download, etc.), tecnologías asociadas (JavaScript, Flash, etc.), ...
357
358
Parte V
Apéndices
359
Apéndice A
El lenguaje HTML
A.1 Introducción
HTML (HyperText Markup Language) [46] es un lenguaje de marcado simple diseñado para crear
documentos de hipertexto independientes de la plataforma. HTML se deriva de otro lenguaje de
mucha mayor complejidad, el SGML (Standard Generalized Markup Language) que estandariza
el concepto de lenguaje de marcado definiendo las partes del documento y los tipos de etiquetas
que se utilizan para definir su composición. HTML incluye una gran cantidad de etiquetas, las
que determinan las partes de un documento (cabeceras, listas, etc.), las que permiten incrustar
objetos (imágenes, aplicaciones “applets” Java, etc.), las de petición de datos (formularios), etc.
Un navegador será capaz de interpretar estas etiquetas visualizando un documento correctamente
formateado. Por ejemplo:
HTML se ha venido usando como el lenguaje estandard de la Web desde 1990, aunque la
primera especificación oficial (HTML 2.0) data de 1994. A continuación se resume brevemente la
historia1 :
HTML 2.0: [95] fue desarrollado por el IETF desde 1994 hasta 1996.
HTML 3.2: es la versión de HTML que recomendó el W3C en 1996, basándose en ciertas
características de HTML 2.0 y añadiendo características muy utilizadas como tablas,
applets, etc.
1 Si necesia más datos sobre esta historia, con algunas anécdotas de los comienzos de la Web, puede leerla en
http://www.w3.org/Markup/.
361
362 APÉNDICE A. EL LENGUAJE HTML
HTML 4.0: fue la siguiente recomendación del W3C, apareció en 1997. Incorpora algunas
características muy utilizadas (frames, etc.) y marca como obsoletas algunas otras (center.
etc.).
HTML 4.01: es la última versión de HTML y apareció en diciembre de 1999 para arreglar los
pequeños errores aparecidos en la especificación HTML 4.0.
XHTML: [128] es la más reciente recomendación del W3C sobre lenguajes de marcado y esta
llamado a sustituir a HTML. Básicamente es una reformulación en XML del lenguaje
HTML 4.01. En un capítulo anterior tratamos en más profundidad este lenguaje (vea la
sección 6.3 en la página 93).
El listado de etiquetas es cambiante y varia en cada nueva versión de la especificación HTML. Esto
es una consecuencia lógica de la evolución de la Web, hay etiquetas que van quedando obsoletas
y otras que necesitan crearse para dar soporte a las nuevas necesidades de contenido. A modo de
ejemplo se presenta una tabla con las más significativas (tabla A.2):
Categoría Semántica
Comentarios <!--comentario -->
Estructura de documento <html> <head> <body> <title> <meta>
<h1> <h2> <h3> <h4> <h5> <h6>
<div> <span>
Párrafos y líneas <p><br>
Listas <ul> <li> <dl> <dt> <dd>
Tipos de letra <b> <font> <i> <b> <u> <sub> <sup>
Enlaces <a>
Imágenes <img>
Tablas <table> <tr> <th> <td> <caption>
Formularios <form> <input> <select> <option> <textarea>
En este proyecto se dedican bastantes hojas a las tecnologías para conseguir presentaciones de
contenido dinámico en la Web. Todas ellas se apoyan en páginas codificadas con HTML. En
este sentido son especialmente importantes algunas etiquetas, los formularios, que se utilizan para
solicitarle al usuario la introducción de datos. Los formularios son básicos en las aplicaciones que
se construyen sobre la Web y por ello se comentan aquí de manera un poco más extensa.
A.3. FORMULARIOS HTML 363
Los formularios HTML no son más que la parte de una página Web delimitada por las etiquetas
<form>...</form>. La etiqueta de inicio <form> puede contener atributos:
enctype: esquema de codificación que van a utilizar los datos del formulario. El valor por defecto
es application/x-www-form-urlencoded, aunque existen otros como multipart/form-data.
Una formulario urlencoded se transmite codificado según el siguiente esquema:
action: especifica el programa CGI, JSP, etc. que se debe ejecutar para procesar el formulario en
el servidor.
method: indica la manera en la que se debe enviar la entrada del usuario. Existen dos métodos
básicos GET y POST.
Existe un grupo de etiquetas HTML que siempre deben aparecer dentro de un formulario. Son las
que especifican los diferentes campos:
password: el campo de entrada es una linea simple de texto pero al escribir se oculta como
si fuese una contraseña.
radio: el campo de entrada es una casilla de botón radio. Estos se usan para visualizar
distintas opciones de las cuales el usuario tendrá que elegir una.
reset: da lugar a un botón de reseteo, al pulsarlo el formulario se restaura a sus valores por
defecto.
button: da lugar a un botón de acción programable por medio de lenguajes en el lado cliente
(por ejemplo javascript).
<select name="nombrecampolista">
<option value="1">1</option>
<option value="2">2</option>
</select>
A.3.2 Ejemplo
<OPTION VALUE="1">1</OPTION>
<OPTION VALUE="2">2</OPTION>
</SELECT>
<BR>
Chequea:<INPUT TYPE="checkbox" NAME="chequear">
<BR>
Radio:
<INPUT TYPE="radio" NAME="radio1">
<INPUT TYPE="radio" NAME="radio2">
<BR>
Area de texto:<BR>
<TEXTAREA NAME="areatexto" ROWS="3" ></TEXTAREA>
<BR>
Botones<BR>
<INPUT TYPE="reset" VALUE="botonreset">
<INPUT TYPE="submit" NAME="submit">
<INPUT TYPE="reset" VALUE="boton">
</FORM>
Este apéndice ha sido adaptado de la traducción hecha por el proyecto ApacheES [21] del documento
Soporte de Objetos Compartidos Dinámicos (Dynamic Shared Object - DSO)
Originalmente escrito por:
Ralf S. Engelschall <rse@apache.org>, Abril 1998
En los sucesores modernos de Unix existe un ingenioso mecanismo llamado carga/enlace dinámico
de Objetos Compartidos y Dinámicos (DSO), que proporciona un modo de construir un trozo de
código en un formato especial y que permite cargarlo en tiempo de ejecución en el espacio de
direcciones de un programa ejecutable.
367
368 APÉNDICE B. DYNAMIC SHARED OBJECTS EN APACHE
Del primer modo los DSO son llamados bibliotecas compartidas o bibliotecas DSO y nombrados
como libfoo.so o libfoo.so.1.2. Residen en un directorio específico (generalmente
/usr/lib) y el enlace al programa ejecutable se establece en tiempo de compilación especificando
el parámetro -lfoo al enlazador (linker). Las bibliotecas así codificadas hacen referencia al
ejecutable, de modo que al arrancar el cargador de Unix es capaz de localizar libfoo.so en
/usr/lib1 . A partir de aquí resuelve cualquier símbolo en el programa ejecutable que esté
disponible en el DSO.
Los símbolos en el programa ejecutable normalmente no son referenciados desde el DSO (porque
es una biblioteca reutilizable de código general) y por tanto no se debe hacer ningún tipo de
resolución. El programa ejecutable no necesita hacer nada por su cuenta para utilizar los símbolo
de DSO porque la resolución completa la lleva a cabo el cargador de Unix. De hecho el código para
invocar ld.so, forma parte del código de arranque que es enlazado a cada programa ejecutable no
estático. La ventaja de la carga dinámica de código común de biblioteca es obvia: el código de
biblioteca necesita ser almacenado sólo una vez, ahorrando espacio en disco para cada programa.
Los DSO son normalmente llamados objetos compartidos o ficheros DSO y se les puede asignar
un nombre con cualquier extensión (aunque el nombre estándar es foo.so). Cuando se realiza la
carga de los módulo compartidos de forma manual, los ficheros DSO suelen permanecer dentro
de un directorio específico de cada programa y no se establece ningún link (enlace) automático
al programa ejecutable donde son usados. En lugar de esto, el programa ejecutable carga
manualmente el DSO en tiempo de ejecución a un espacio de direcciones por medio de dlopen().
En ese momento DSO realiza ninguna resolución de símbolos para el programa ejecutable. En
su lugar el cargador de Unix automáticamente resuelve cualquier símbolo en el DSO del conjunto
de símbolos exportados por el programa ejecutable y que ya ha sido cargado por las librerías
DSO (especialmente todos los símbolos de libc.so). De este modo DSO tiene conocimiento del
conjunto de símbolos del programa ejecutable como si hubiera sido enlazado estáticamente con él
desde el principio.
Finalmente, para aprovechar el API de DSO el programa ejecutable debe resolver símbolos
particulares de DSO a través de dlsym() , de esta forma podrán ser utilizados posteriormente
dentro de tablas enviadas etc. En otras palabras, el programa ejecutable debe resolver
manualmente cada símbolo que necesita a fin de poder utilizarlo. La ventaja de este mecanismo
es que las partes opcionales del programa no necesitan ser cargadas (y de este modo no gastan
memoria) hasta que el programa en cuestión las necesite. Cuando sean requeridos, estas partes del
programa pueden ser cargadas dinámicamente para extender la funcionalidad básica del programa.
1 O en otras rutas que se le pueden indicar al linker como un parámetro o por medio de la variable de entorno
LD_LIBRARY_PATH.
B.2. UTILIZACIÓN PRÁCTICA 369
Aunque este mecanismo del DSO parece sencillo, se da un paso difícil: la resolución de símbolos
desde el programa ejecutable para el DSO. ¿Porqué? Porque resolver de modo inverso símbolos
DSO desde el símbolo del programa ejecutable va en contra del diseño de la biblioteca (la
biblioteca no tiene conocimiento del programa que lo está usando) y ni está disponible en todas
las plataformas ni estandarizado. En la práctica los símbolos globales del programa ejecutable no
son a menudo reexportados y, de este modo, no están en disposición de ser usados en un DSO.
Cuando se usa DSO para extender un programa en tiempo de ejecución, el principal problema que
se debe resolver es encontrar un modo de forzar al enlazador para que exporte todos los símbolos
globales.
Hasta 1998 sólo había unos pocos paquetes disponibles que usaran el mecanismo DSO para
extender su funcionalidad en tiempo de ejecución: Perl 5 (por medio de su mecanismo XS y
el módulo DynaLoader), Netscape Server, etc. Empezando con la versión 1.3, Apache se unió al
grupo comenzando a usar el concepto de módulo para extender su funcionalidad.
B.3 Implementación
El soporte DSO para cargar módulos individuales de Apache está asentado en un módulo llamado
mod_so.c, que debe ser estáticamente compilado en el núcleo de Apache. Es el único módulo,
además de http_core.c, que no puede ser añadido a DSO por sí mismo, ya que forman parte
del bootstrapping (secuencia de instrucciones iniciales). Prácticamente todos los otros módulos
distribuidos de Apache pueden ser emplazados en DSO habilitando para ello el soporte DSO en
la construción de Apache2 . Después de que un módulo sea compilado en un DSO, por ejemplo,
mod_foo.so puede usarse el comando LoadModule en el fichero httpd.conf para cargar este
módulo cuando arranque el servidor.
Para simplificar la creación de ficheros DSO para módulos Apache (especialmente para módulos
de terceros) se dispone de un programa llamado apxs (APache eXtenSion). Se puede usar para
construir módulos DSO fuera del árbol fuente de Apache.
Para emplazar dentro de una biblioteca DSO el núcleo completo de Apache (sólo requerido
en algunas de las plataformas soportadas para forzar al enlazador a exportar los símbolos del
2 Usando configure -enable-shared. Para más información consulte el fichero INSTALL en el árbol de
instalación Apache.
370 APÉNDICE B. DYNAMIC SHARED OBJECTS EN APACHE
Las solución DSO proporcionada en Apache 1.3 tienen las siguientes ventajas:
El paquete del servidor es más flexible en tiempo de ejecución porque el proceso actual
del servidor puede ser ensamblado en tiempo de ejecución por medio de LoadModule en
httpd.conf en lugar de hacerlo por medio de la configuration en tiempo de compilación.
De este modo se pueden arrancar diferentes instancias del servidor (estándar, versión SSL,
mínima, versión potenciada [PHP, etc. ], etc.) con una única instalación de Apache.
El paquete del servidor puede ser fácilmente ampliado con módulos de terceros incluso
después de la instalación. Esto representa un gran beneficio para los que mantienen
paquetes, ya que les permite crear el paquete del núcleo de Apache y adicionalmente
paquetes que contengan extensiones como PHP, mod_perl, mod_fastcgi, ...
Mayor facilidad en los prototipos de módulos Apache porque con DSO y apxs se puede
trabajar fuera del árbol fuente de Apache y necesitar un único comando apxs -i seguido
3 Usando configure -enable-rule=SHARED_CORE. Para más información consulte el fichero INSTALL en el
de un apachectl restart para cargar una nueva versión del módulo desarrollado en el
servidor Apache que esté funcionando actualmente.
El mecanismo DSO no puede ser usado en todas las plataformas porque no todos los
sistemas operativos soportan carga dinámica del código en el espacio de direcciones de
un programa.
No se puede usar DSO para todo tipo de módulos, debido a que los módulos DSO no pueden
ser enlazados con otras bibliotecas basadas en DSO (ld -lfoo) en todas las plataformas4 . En
otras palabras, los módulos compilados como ficheros DSO están restringidos a utilizar sólo
símbolos del núcleo de Apache, de las biblioteca C (libc) y todas las demás bibliotecas
dinámicas o simbólicas usadas por el núcleo de Apache o desde archivos de bibliotecas
estáticas (libfoo.a) que contengan PIC. La única ocasión de usar otro código es, o bien
asegurarse de que el núcleo de Apache ya contenga una referencia a él, cargando uno mismo
el código por medio de dlopen(), o bien habilitando la regla SHARED_CHAIN cuando se
compila Apache y la plataforma soporta el enlace de ficheros DSO contra bibliotecas DSO.
Bajo algunas plataformas (varios sistemas SVR4) no hay forma de forzar al enlazador para
que exporte todos los símbolos globales cuando se enlaza el programa ejecutable httpd. Pero
sin la visibilidad de los símbolos del núcleo de Apache, ningún módulo estándar de Apache
podría ser usado como DSO. La única posible solución es compilar el sistema con la opción
SHARED_CORE porque de este modo los símbolos globales se fuerzan a ser exportados.
4 Por ejemplo las basadas en a.out normalmente no proporcionan esta funcionalidad, mientras las basadas en ELF sí.
372 APÉNDICE B. DYNAMIC SHARED OBJECTS EN APACHE
Apéndice C
Expresiones regulares
C.1 Introducción
Circunflejo (^) y dólar ($) : son metacaracteres que concuerdan con la cadena vacía al comienzo
y al final de línea respectivamente. Por ejemplo:
#--------
# Concuerda con la palabra "inicio" al principio
# de una línea
^inicio
#--------
# Concuerda con la palabra "fin" al final de
# una línea
fin$
Punto (.) : concuerda con cualquier carácter simple excepto el salto de línea. Un ejemplo:
373
374 APÉNDICE C. EXPRESIONES REGULARES
#--------
# concuerda con cualquier palabra o frase que
# comienze por "t" y acabe por "i", por ejemplo
# txapi, te pregunto así, ...
t.*i
Operadores de repetición : existen unos cuantos operadores (tabla C.1) que provocan que una
expresión regular empareje con patrones construidos mediante repetición de caracteres.
Cualquier expresión regular que concuerde con un solo carácter puede ser seguida por uno
de estos varios operadores de repetición. Dos de los más conocidos son el asterisco * y
el interrogante ?. El asterisco empareja con el caracter precedente repetido 0 o más veces,
mientras el interrogante empareja con el caracter precedente repetido cero o una vez. Un
ejemplo:
#----------
# Concuerda con cualquier nombre del estilo
# pagina0.htm
# pagina01.htm
# ...
# (\d concuerda con cualquier número [0-9])
^pagina\d*.htm
#----------
# Puede concordar con la palabra "nota", si la
# "s" se repite 0 veces o con "notas" si se
# repite una vez.
^notas?
Patrón Semántica
? El elemento precedente puede aparecer 0 o 1 veces.
* El elemento precedente concordará cero o más veces.
+ El elemento precedente concordará una o más veces.
{n} El elemento precedente concuerda exactamente n veces.
{n,} El elemento precedente concuerda n o más veces.
{,m} El elemento precedente es opcional y concuerda como mucho m veces.
{n,m} El elemento precedente concuerda como poco n veces, pero no más de m veces.
Listas de caracteres : una lista de caracteres rodeados por [] concuerda con cualquier carácter
de esa lista. Se puede especificar un rango de caracteres ASCII dando el primero y el
último, separados por un guión. Si el primer carácter de la lista es ^, entonces concuerda
con la negación de los caracteres de la lista. También puede expresarse la alternancia
entre expresiones regulares de una lista mediante el operador infijo | . La expresión
regular resultante concuerda con cualquier cadena que concuerde con cualquiera de las
subexpresiones. Un ejemplo:
#----------
# concuerda con cualquier letra entre la "a" y la "z"
[a-z]
#----------
# concuerda con alguno de las letras "a", "i", "u"
[a|i|u]
#----------
# concuerda con cualquier caracter que no sea una letra
# de la "a" a la "z"
[^a-z]
Patrones predefinidos : también existen ciertas clases de patrones predefinidos1 (tabla C.2).
1 Los corchetes son parte de los nombres de clases y no indican lista de caracteres.
376 APÉNDICE C. EXPRESIONES REGULARES
Patrón Semántica
[:alnum:] Alfanumérico [0-9A-Za-z]
[:digit:] Dígitos [0-9]
[:graph:] Cualquier caracter imprimible, menos los de
la clase [:space:]
[:lower:] Cualquier letra en minúsculas [a-z]
[:print:] Cualquier caracter imprimible
[:punct:] Cualquier signo de puntuación
[:space:] Cualquier caracter que deja espacio, es decir,
tabulado, tabulado vertical, salto de línea,
form feed, retorno de carro y espacio.
[:upper:] Cualquier letra en mayúscula.
[:xdigit:] Un dígito en hexadecimal [0-9A-Fa-f]
[:cntrl:] Cualquier expresión que no forme parte de las
clases anteriores
##
## httpd.conf -- Apache HTTP server configuration file
##
#
# Based upon the NCSA server configuration files originally by
# Rob McCool.
#
# This is the main Apache server configuration file. It contains
# the configuration directives that give the server its
# instructions. See <URL:http://www.apache.org/docs/> detailed
# information about the directives.
#
# Do NOT simply read the instructions in here without understanding
# what they do. They’re here only as hints or reminders. If you are
# unsure consult the online docs. You have been warned.
#
# After this file is processed, the server will look for and process
# /usr/local/proyecto/conf/srm.conf and then
377
378 APÉNDICE D. CONFIGURACIÓN POR DEFECTO DEL SERVIDOR APACHE
# /usr/local/proyecto/conf/access.conf
# unless you have overridden these with ResourceConfig and/or
# AccessConfig directives here.
#
# The configuration directives are grouped into three basic sections:
# 1. Directives that control the operation of the Apache server
# process as a whole (the ’global environment’).
# 2. Directives that define the parameters of the ’main’ or ’default’
# server, which responds to requests that aren’t handled by a
# virtual host.
# These directives also provide default values for the settings
# of all virtual hosts.
# 3. Settings for virtual hosts, which allow Web requests to be sent
# to different IP addresses or hostnames and have them handled by
# the same Apache server process.
#
# Configuration and logfile names: If the filenames you specify for
# many of the server’s control files begin with "/" (or "drive:/"
# for Win32),# the server will use that explicit path. If the
# filenames do *not*
# begin with "/", the value of ServerRoot is prepended -- so
# "logs/foo.log" with ServerRoot set to "/usr/local/apache" will be
# interpreted by the server as "/usr/local/apache/logs/foo.log".
#
#
# ServerType is either inetd, or standalone. Inetd mode is only
# supported on Unix platforms.
#
ServerType standalone
#
# ServerRoot: The top of the directory tree under which the server’s
379
#
# The LockFile directive sets the path to the lockfile used when
# Apache is compiled with either USE_FCNTL_SERIALIZED_ACCEPT or
# USE_FLOCK_SERIALIZED_ACCEPT. This directive should normally be left
# at its default value. The main reason for changing it is if the
# logs directory is NFS mounted, since the lockfile MUST BE STORED ON
# A LOCAL DISK. The PID of the main server process is automatically
# appended to the filename.
#
#LockFile /usr/local/proyecto/apache/logs/httpd.lock
#
# PidFile: The file in which the server should record its process
# identification number when it starts.
#
PidFile /usr/local/proyecto/apache/logs/httpd.pid
#
# ScoreBoardFile: File used to store internal server process
# information.
# Not all architectures require this. But if yours does (you’ll
# know because this file will be created when you run Apache)
# then you *must* ensure that no two invocations of Apache share
# the same scoreboard file.
#
ScoreBoardFile /usr/local/proyecto/apache/logs/httpd.scoreboard
#
# In the standard configuration, the server will process
# httpd.conf (this file, specified by the -f command line option),
# srm.conf, and access.conf in that order. The latter two files
# are now distributed empty, as it is
380 APÉNDICE D. CONFIGURACIÓN POR DEFECTO DEL SERVIDOR APACHE
ResourceConfig /dev/null
AccessConfig /dev/null
#
# Timeout: The seconds before receives and sends time out.
#
Timeout 300
#
# KeepAlive: Whether or not to allow persistent connections (more
# than one request per connection). Set to "Off" to deactivate.
#
KeepAlive On
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited
# amount.
# We recommend you leave this number high, for maximum
# performance.
#
MaxKeepAliveRequests 100
#
# KeepAliveTimeout: Number of seconds to wait for the next
# request from the
# same client on the same connection.
#
KeepAliveTimeout 15
381
#
# Server-pool size regulation. Rather than making you guess
# how many server processes you need, Apache dynamically
# adapts to the load it sees --- that is, it tries to maintain
# enough server processes to
# handle the current load, plus a few spare servers to handle
# transient load spikes (e.g., multiple simultaneous requests
# from a single Netscape browser).
#
# It does this by periodically checking how many servers are
# waiting for a request. If there are fewer than
# MinSpareServers, it creates a new spare. If there are more
# than MaxSpareServers, some of the spares die off. The default
# values are probably OK for most sites.
#
MinSpareServers 5
MaxSpareServers 10
#
# Number of servers to start initially --- should be a reasonable
# ballpark figure.
#
StartServers 5
#
# Limit on total number of servers running, i.e., limit on the number
# of clients who can simultaneously connect --- if this limit is ever
# reached, clients will be LOCKED OUT, so it should NOT BE SET TOO
# LOW.
# It is intended mainly as a brake to keep a runaway server from
# taking the system with it as it spirals down...
#
MaxClients 150
#
# MaxRequestsPerChild: the number of requests each child process is
# allowed to process before the child dies. The child will exit so
# as to avoid problems after prolonged use when Apache (and maybe the
# libraries it uses) leak memory or other resources. On most systems
# this isn’t really needed, but a few (such as Solaris) do have
# notable leaks
382 APÉNDICE D. CONFIGURACIÓN POR DEFECTO DEL SERVIDOR APACHE
#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, in addition to the default. See also the <VirtualHost>
# directive.
#
#Listen 3000
#Listen 12.34.56.78:80
#
# BindAddress: You can support virtual hosts with this option. This
# directive is used to tell the server which IP address to listen to.
# It can either contain "*", an IP address, or a fully qualified
# Internet domain name.
# See also the <VirtualHost> and Listen directives.
#
#BindAddress *
#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as
# a DSO you have to place corresponding ‘LoadModule’ lines at this
# location so the directives contained in it are actually available
# _before_ they are used.
# Please read the file README.DSO in the Apache 1.3 distribution for
# more details about the DSO mechanism and run ‘httpd -l’ for the
# list of already built-in (statically linked and thus always
# available) modules in your httpd binary.
#
# Note: The order in which modules are loaded is important. Don’t
383
AddModule mod_vhost_alias.c
AddModule mod_env.c
AddModule mod_log_config.c
AddModule mod_mime_magic.c
AddModule mod_mime.c
AddModule mod_negotiation.c
AddModule mod_status.c
AddModule mod_info.c
AddModule mod_include.c
AddModule mod_autoindex.c
AddModule mod_dir.c
AddModule mod_cgi.c
AddModule mod_asis.c
AddModule mod_imap.c
AddModule mod_actions.c
AddModule mod_speling.c
AddModule mod_userdir.c
AddModule mod_alias.c
AddModule mod_rewrite.c
AddModule mod_access.c
AddModule mod_auth.c
AddModule mod_auth_anon.c
AddModule mod_auth_dbm.c
AddModule mod_digest.c
AddModule mod_proxy.c
AddModule mod_cern_meta.c
AddModule mod_expires.c
AddModule mod_headers.c
AddModule mod_usertrack.c
AddModule mod_unique_id.c
AddModule mod_so.c
AddModule mod_setenvif.c
#
# ExtendedStatus controls whether Apache will generate "full"
# status information (ExtendedStatus On) or just basic
# information (ExtendedStatus Off) when the "server-status"
# handler is called. The default is Off.
#
#ExtendedStatus On
385
#
# If your ServerType directive (set earlier in the ’Global
# Environment’ section) is set to "inetd", the next few directives
# don’t have any effect since their settings are defined by the
# inetd configuration. Skip ahead to the ServerAdmin directive.
#
#
# Port: The port to which the standalone server listens. For
# ports < 1023, you will need httpd to be run as root initially.
#
Port 80
ScriptLog /usr/local/proyecto/cgi-bin/cgi.log
#
# If you wish httpd to run as a different user or group, you must
# run httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run
# httpd as.
# . On SCO (ODT 3) use "User nouser" and "Group nogroup".
# . On HPUX you may not be able to use shared memory as nobody,
# and the suggested workaround is to create a user www and use
# that user.
# NOTE that some kernels refuse to setgid(Group) or semctl
# (IPC_SET)
# when the value of (unsigned)Group is above 60000;
# don’t use Group nobody on these systems!
386 APÉNDICE D. CONFIGURACIÓN POR DEFECTO DEL SERVIDOR APACHE
#
User nobody
Group nobody
#
# ServerAdmin: Your address, where problems with the server should
# be e-mailed. This address appears on some server-generated
# pages, such as error documents.
#
ServerAdmin txapi@montsfortis.micasa.es
#
# ServerName allows you to set a host name which is sent back to
# clients for your server if it’s different than the one the
# program would get (i.e., use "www" instead of the host’s real
# name).
#
# Note: You cannot just invent host names and hope they work. The
# name you define here must be a valid DNS name for your host. If
# you don’t understand this, ask your network administrator.
# If your host doesn’t have a registered DNS name, enter its IP
# address here.
# You will have to access it by its address (e.g.,
# http://123.45.67.89/)
# anyway, and this will make redirections work in a sensible way.
#
# 127.0.0.1 is the TCP/IP local loop-back address, often named
# localhost. Your machine always knows itself by this address. If
# you use Apache strictly for local testing and development, you
# may use 127.0.0.1 as the server name.
#
#ServerName montsfortis.micasa.es
#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory,
# but symbolic links and aliases may be used to point to other
# locations.
#
DocumentRoot "/usr/local/proyecto/htdocs"
387
#
# Each directory to which Apache has access, can be configured with
# respect to which services and features are allowed and/or disabled
# in that directory (and its subdirectories).
#
# First, we configure the "default" to be a very restrictive set of
# permissions.
#
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
#
# Note that from this point forward you must specifically allow
# particular features to be enabled - so if something’s not working
# as you might expect, make sure that you have specifically enabled
# it below.
#
#
# This should be changed to whatever you set DocumentRoot to.
#
<Directory "/usr/local/proyecto/htdocs">
#
# This may also be "None", "All", or any combination of "Indexes",
# "Includes", "FollowSymLinks", "ExecCGI", or "MultiViews".
#
# Note that "MultiViews" must be named *explicitly* "Options All"
# doesn’t give it to you.
#
Options Indexes FollowSymLinks MultiViews Includes
#
# This controls which options the .htaccess files in directories
# can override. Can also be "All" or any combination of "Options",
# "FileInfo", "AuthConfig", and "Limit"
#
AllowOverride None
388 APÉNDICE D. CONFIGURACIÓN POR DEFECTO DEL SERVIDOR APACHE
#
# Controls who can get stuff from this server.
#
Order allow,deny
Allow from all
</Directory>
#
# UserDir: The name of the directory which is appended onto a
# user’s home directory if a ~user request is received.
#
<IfModule mod_userdir.c>
UserDir disabled root public_html
</IfModule>
#
# Control access to UserDir directories. The following is an example
# for a site where these directories are restricted to read-only.
#
#<Directory /home/*/public_html>
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
# <Limit GET POST OPTIONS PROPFIND>
# Order allow,deny
# Allow from all
# </Limit>
# <LimitExcept GET POST OPTIONS PROPFIND>
# Order deny,allow
# Deny from all
# </LimitExcept>
#</Directory>
<Directory /home/*/public_html>
Options Indexes ExecCGI
AllowOverride None
Order allow,deny
Allow from all
</Directory>
#
389
#
# AccessFileName: The name of the file to look for in each directory
# for access control information.
#
AccessFileName .htaccess
#
# The following lines prevent .htaccess files from being viewed by
# Web clients. Since .htaccess files often contain authorization
# information, access is disallowed for security reasons. Comment
# these lines out if you want Web visitors to see the contents of
# .htaccess files. If you change the AccessFileName directive above,
# be sure to make the corresponding changes here.
#
# Also, folks tend to use names such as .htpasswd for password
# files, so this will protect those as well.
#
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>
#
# CacheNegotiatedDocs: By default, Apache sends "Pragma: no-cache"
# with each document that was negotiated on the basis of content.
# This asks proxy servers not to cache the document. Uncommenting
# the following line disables this behavior, and proxies will be
# allowed to cache the documents.
#
#CacheNegotiatedDocs
#
# UseCanonicalName: (new for 1.3) With this setting turned on,
# whenever Apache needs to construct a self-referencing URL (a URL
390 APÉNDICE D. CONFIGURACIÓN POR DEFECTO DEL SERVIDOR APACHE
#
# TypesConfig describes where the mime.types file (or equivalent) is
# to be found.
#
<IfModule mod_mime.c>
TypesConfig /usr/local/proyecto/conf/mime.types
</IfModule>
#
# DefaultType is the default MIME type the server will use for a
# document if it cannot otherwise determine one, such as from
# filename extensions.
# If your server contains mostly text or HTML documents,
# "text/plain" is a good value. If most of your content is binary,
# such as applications or images, you may want to use
# "application/octet-stream" instead to keep browsers from trying
# to display binary files as though they are text.
#
DefaultType text/plain
#
# The mod_mime_magic module allows the server to use various hints
# from the contents of the file itself to determine its type. The
# MIMEMagicFile directive tells the module where the hint
# definitions are located.
# mod_mime_magic is not part of the default server (you have to add
# it yourself with a LoadModule [see the DSO paragraph in the Global
# Environment section], or recompile the server and include
# mod_mime_magic as part of the configuration), so it’s enclosed in
# an <IfModule> container.
# This means that the MIMEMagicFile directive will only be processed
# if the module is part of the server.
#
391
<IfModule mod_mime_magic.c>
MIMEMagicFile /usr/local/proyecto/conf/magic
</IfModule>
#
# HostnameLookups: Log the names of clients or just their IP addresses
# e.g., www.apache.org (on) or 204.62.129.132 (off).
# The default is off because it’d be overall better for the net if
# people
# had to knowingly turn this feature on, since enabling it means that
# each client request will result in AT LEAST one lookup request to the
# nameserver.
#
HostnameLookups Off
#
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a <VirtualHost>
# container, that host’s errors will be logged there and not here.
#
ErrorLog /usr/local/proyecto/apache/logs/error_log
#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn
#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"
\"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
392 APÉNDICE D. CONFIGURACIÓN POR DEFECTO DEL SERVIDOR APACHE
#
# The location and format of the access logfile (Common Logfile
# Format).
# If you do not define any access logfiles within a <VirtualHost>
# container, they will be logged here. Contrariwise, if you *do*
# define per-<VirtualHost> access logfiles, transactions will be
# logged therein and *not* in this file.
#
CustomLog /usr/local/proyecto/apache/logs/access_log common
#
# If you would like to have agent and referer logfiles,
# uncomment the following directives.
#
#CustomLog /usr/local/proyecto/apache/logs/referer_log referer
#CustomLog /usr/local/proyecto/apache/logs/agent_log agent
#
# If you prefer a single logfile with access, agent, and referer
# information
# (Combined Logfile Format) you can use the following directive.
#
#CustomLog /usr/local/proyecto/apache/logs/access_log combined
#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (error documents, FTP directory
# listings, mod_status and mod_info output etc., but not CGI generated
# documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of: On | Off | EMail
#
ServerSignature On
# EBCDIC configuration:
# (only for mainframes using the EBCDIC codeset, currently one of:
# Fujitsu-Siemens’ BS2000/OSD, IBM’s OS/390 and IBM’s TPF)!!
# The following default configuration assumes that "text files"
# are stored in EBCDIC (so that you can operate on them using the
# normal POSIX tools like grep and sort) while "binary files" are
# stored with identical octets as on an ASCII machine.
393
#
# The directives are evaluated in configuration file order, with
# the EBCDICConvert directives applied before EBCDICConvertByType.
#
# If you want to have ASCII HTML documents and EBCDIC HTML documents
# at the same time, you can use the file extension to force
# conversion off for the ASCII documents:
# > AddType text/html .ahtml
# > EBCDICConvert Off=InOut .ahtml
#
# EBCDICConvertByType On=InOut text/* message/* multipart/*
# EBCDICConvertByType On=In application/x-www-form-urlencoded
# EBCDICConvertByType On=InOut application/postscript model/vrml
# EBCDICConvertByType Off=InOut */*
#
# Aliases: Add here as many aliases as you need (with no limit). The
# format is Alias fakename realname
#
<IfModule mod_alias.c>
#
# Note that if you include a trailing / on fakename then the
# server will
# require it to be present in the URL. So "/icons" isn’t aliased
# in this
# example, only "/icons/". If the fakename is slash-terminated,
# then the
# realname must also be slash terminated, and if the fakename
# omits the
# trailing slash, the realname must also omit it.
#
Alias /icons/ "/usr/local/proyecto/apache/icons/"
<Directory "/usr/local/proyecto/apache/icons">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
394 APÉNDICE D. CONFIGURACIÓN POR DEFECTO DEL SERVIDOR APACHE
#
# ScriptAlias: This controls which directories contain server
# scripts.
# ScriptAliases are essentially the same as Aliases, except that
# documents in the realname directory are treated as
# applications and
# run by the server when requested rather than as documents sent
# to the client.
# The same rules about trailing "/" apply to ScriptAlias
# directives as to Alias.
#
ScriptAlias /cgi-bin/ "/usr/local/proyecto/cgi-bin/"
#
# "/usr/local/proyecto/cgi-bin" should be changed to whatever
# your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "/usr/local/proyecto/cgi-bin">
AllowOverride None
Options None ExecCGI
Order allow,deny
Allow from all
</Directory>
</IfModule>
# End of aliases.
#
# Redirect allows you to tell clients about documents which used
# to exist in
# your server’s namespace, but do not anymore. This allows you to
# tell the
# clients where to look for the relocated document.
# Format: Redirect old-URI new-URL
#
#
# Directives controlling the display of server-generated
# directory listings.
#
395
<IfModule mod_autoindex.c>
#
# FancyIndexing is whether you want fancy directory indexing
# or standard
#
IndexOptions FancyIndexing
#
# AddIcon* directives tell the server which icon to show for
# different
# files or filename extensions. These are only displayed for
# FancyIndexed directories.
#
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
396 APÉNDICE D. CONFIGURACIÓN POR DEFECTO DEL SERVIDOR APACHE
#
# DefaultIcon is which icon to show for files which do not
# have an icon explicitly set.
#
DefaultIcon /icons/unknown.gif
#
# AddDescription allows you to place a short description
# after a file in
# server-generated indexes. These are only displayed for
# FancyIndexed
# directories.
# Format: AddDescription "description" filename
#
#AddDescription "GZIP compressed document" .gz
#AddDescription "tar archive" .tar
#AddDescription "GZIP compressed tar archive" .tgz
#
# ReadmeName is the name of the README file the server will
# look for by
# default, and append to directory listings.
#
# HeaderName is the name of a file which should be prepended to
# directory indexes.
#
# If MultiViews are amongst the Options in effect, the server will
# first look for name.html and include it if found. If name.html
# doesn’t exist, the server will then look for name.txt and include
# it as plaintext if found.
#
ReadmeName README
HeaderName HEADER
#
# IndexIgnore is a set of filenames which directory indexing
# should ignore
# and not include in the listing. Shell-style wildcarding is
# permitted.
397
#
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
</IfModule>
# End of indexing directives.
#
# Document types.
#
<IfModule mod_mime.c>
#
# AddEncoding allows you to have certain browsers
# (Mosaic/X 2.1+) uncompress
# information on the fly. Note: Not all browsers support this.
# Despite the name similarity, the following Add* directives
# have nothing
# to do with the FancyIndexing customization directives above.
#
AddEncoding x-compress Z
AddEncoding x-gzip gz tgz
#
# AddLanguage allows you to specify the language of a document.
# You can
# then use content negotiation to give a browser a file in a
# language
# it can understand.
#
# Note 1: The suffix does not have to be the same as the language
# keyword --- those with documents in Polish (whose net-standard
# language code is pl) may wish to use "AddLanguage pl .po" to
# avoid the ambiguity with the common suffix for perl scripts.
#
# Note 2: The example entries below illustrate that in quite
# some cases the two character ’Language’ abbreviation is not
# identical to the two character ’Country’ code for its country,
# E.g. ’Danmark/dk’ versus ’Danish/da’.
#
# Note 3: In the case of ’ltz’ we violate the RFC by using a
# three char
398 APÉNDICE D. CONFIGURACIÓN POR DEFECTO DEL SERVIDOR APACHE
#
# AddType allows you to tweak mime.types without actually editing
# it, or to
# make certain files to be certain types.
#
# For example, the PHP 3.x module (not part of the Apache
# distribution - see
# http://www.php.net) will typically use:
#
#AddType application/x-httpd-php3 .php3
#AddType application/x-httpd-php3-source .phps
#
# And for PHP 4.x, use:
#
#AddType application/x-httpd-php .php
#AddType application/x-httpd-php-source .phps
#
# AddHandler allows you to map certain file extensions to
# "handlers",
# actions unrelated to filetype. These can be either built into the
400 APÉNDICE D. CONFIGURACIÓN POR DEFECTO DEL SERVIDOR APACHE
# server
# or added with the Action command (see below)
#
# If you want to use server side includes, or CGI outside
# ScriptAliased directories, uncomment the following lines.
#
# To use CGI scripts:
#
#AddHandler cgi-script .cgi
#
# To use server-parsed HTML files
#
AddType text/html .shtml
AddHandler server-parsed .shtml
#
# Uncomment the following line to enable Apache’s send-asis HTTP
# file feature
#
#AddHandler send-as-is asis
#
# If you wish to use server-parsed imagemap files, use
#
#AddHandler imap-file map
#
# To enable type maps, you might want to use
#
#AddHandler type-map var
</IfModule>
# End of document types.
#
# Action lets you define media types that will execute a script
# whenever a matching file is called. This eliminates the need
# for repeated URL
# pathnames for oft-used CGI file processors.
# Format: Action media/type /cgi-script/location
401
#
# MetaSuffix: specifies the file name suffix for the file containing
# the
# meta information.
#
#MetaSuffix .meta
#
# Customizable error response (Apache style)
# these come in three flavors
#
# 1) plain text
#ErrorDocument 500 "The server made a boo boo.
# n.b. the single leading (") marks it as text, it does not
# get output
#
# 2) local redirects
#ErrorDocument 404 /missing.html
# to redirect to local URL /missing.html
#ErrorDocument 404 /cgi-bin/missing_handler.pl
# N.B.: You can redirect to a script or a document using
# server-side-includes.
#
# 3) external redirects
#ErrorDocument 402 http://some.other_server.com/subscription_info.html
# N.B.: Many of the environment variables associated with the original
# request will *not* be available to such a script.
#
# Customize behaviour based on the browser
402 APÉNDICE D. CONFIGURACIÓN POR DEFECTO DEL SERVIDOR APACHE
#
<IfModule mod_setenvif.c>
#
# The following directives modify normal HTTP response behavior.
# The first directive disables keepalive for Netscape 2.x and
# browsers that
# spoof it. There are known problems with these browser
# implementations.
# The second directive is for Microsoft Internet Explorer 4.0b2
# which has a broken HTTP/1.1 implementation and does not properly
# support keepalive when it is used on 301 or 302 (redirect)
# responses.
#
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0
force-response-1.0
#
# The following directive disables HTTP/1.1 responses to browsers
# which
# are in violation of the HTTP/1.0 spec by not being able to grok a
# basic 1.1 response.
#
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0
</IfModule>
# End of browser customization directives
#
# Allow server status reports, with the URL of
# http://servername/server-status
# Change the ".your_domain.com" to match your domain to enable.
#
#<Location /server-status>
# SetHandler server-status
# Order deny,allow
# Deny from all
# Allow from .your_domain.com
403
#</Location>
#
# Allow remote server configuration reports, with the URL of
# http://servername/server-info (requires that mod_info.c be loaded).
# Change the ".your_domain.com" to match your domain to enable.
#
#<Location /server-info>
# SetHandler server-info
# Order deny,allow
# Deny from all
# Allow from .your_domain.com
#</Location>
#
# There have been reports of people trying to abuse an old bug
# from pre-1.1 days. This bug involved a CGI script distributed
# as a part of Apache.
# By uncommenting these lines you can redirect these attacks to a
# logging script on phf.apache.org. Or, you can record them
# yourself, using the script support/phf_abuse_log.cgi.
#
#<Location /cgi-bin/phf*>
# Deny from all
# ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi
#</Location>
#
# Proxy Server directives. Uncomment the following lines to
# enable the proxy server:
#
#<IfModule mod_proxy.c>
# ProxyRequests On
# <Directory proxy:*>
# Order deny,allow
# Deny from all
# Allow from .your_domain.com
# </Directory>
#
404 APÉNDICE D. CONFIGURACIÓN POR DEFECTO DEL SERVIDOR APACHE
#
# To enable the cache as well, edit and uncomment the
# following lines:
# (no cacheing without CacheRoot)
#
# CacheRoot "/usr/local/proyecto/apache/proxy"
# CacheSize 5
# CacheGcInterval 4
# CacheMaxExpire 24
# CacheLastModifiedFactor 0.1
# CacheDefaultExpire 1
# NoCache a_domain.com another_domain.edu joes.garage_sale.com
#</IfModule>
# End of proxy directives.
#
# Use name-based virtual hosting.
#
#NameVirtualHost *
#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for requests without a known
# server name.
#
#<VirtualHost *>
# ServerAdmin webmaster@dummy-host.example.com
# DocumentRoot /www/docs/dummy-host.example.com
# ServerName dummy-host.example.com
# ErrorLog logs/dummy-host.example.com-error_log
# CustomLog logs/dummy-host.example.com-access_log common
#</VirtualHost>
Este listado incluye la configuración por defecto de un servidor Web Apache 1.3.20, en la versión
2.0 probablemente aparezcan multitud de cambios. La documentación más completa y actualizada
sobre las directivas puede encontrarse en el sitio http://httpd.apache.org/.
406 APÉNDICE D. CONFIGURACIÓN POR DEFECTO DEL SERVIDOR APACHE
Bibliografía
[8] MySQL.
Paul Dubois. (2000).
New Riders Publishing.
407
408 BIBLIOGRAFÍA
[11] Structured Generalized Markup Language and Interchange Format (ISO 8879)
(International Organization for Standardization, 1986.)
URLs
[19] Apache-SSL.
http://www.apache-ssl.org
[36] Debian.
http://www.debian.org/
[44] Generación de contenido dinámico para la Web: revisión, alternativas y soluciones Java..
Florentino Fernandez Riverola; Dpto. Informática; Universidad de Vigo (2001).
http://lsi2.ei.uvigo.es/proa/download/apuntes/ContenidoDinamico.zip
[64] Microsoft.
http://www.microsoft.com/
[84] OpenSSL.
http://www.openssl.org
[85] Oracle
http://www.oracle.com.
[93] (RFC 1847) Security Multiparts for MIME: Multipart/Signed and Multipart/Encrypted
http://www.ietf.org/rfc/rfc1847.txt
(Octubre 1995)
[99] (RFC 2045) Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet
Message Bodies
http://www.ietf.org/rfc/rfc2045.txt
(Noviembre 1996)
[100] (RFC 2046) Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types
http://www.ietf.org/rfc/rfc2046.txt
(Noviembre 1996)
414 BIBLIOGRAFÍA
[101] (RFC 2047) MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header
Extensions for Non-ASCII Text
http://www.ietf.org/rfc/rfc2047.txt
(Noviembre 1996)
[102] (RFC 2048) Multipurpose Internet Mail Extensions (MIME) Part Four: Registration
Procedures
http://www.ietf.org/rfc/rfc2048.txt
(Noviembre 1996)
[103] (RFC 2049) Multipurpose Internet Mail Extensions (MIME) Part Five: Conformance
Criteria and Examples
http://www.ietf.org/rfc/rfc2049.txt
(Noviembre 1996)
[108] (RFC 2617) HTTP Authentication: Basic and Digest Access Authentication
http://www.ietf.org/rfc/rfc2617.txt
(Junio 1999)
[120] Sybase
http://www.sybase.com.
[128] XHTML
http://www.w3.org/MarkUp/
417
418 ÍNDICE DE MATERIAS
Listas de parada . véase Listas de parada CFML, ColdFusion Markup Language . . 15,
Motor de búsqueda . . . . véase Motor de 76
búsqueda CGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36–43
Robot . . . . . . . . . . . . . . . . . . . véase Robot configuración . . . . . . 228–236, 313, 323
Balanceo de carga . . . . . . . . . . . . . . . . . . . . 294 nph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Bases de datos . . . . . . . . . . . . . . . . . . . 108–120 Chili!Soft . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
ADO . véase ADO, Active Data Objects Cipher method protocol . . . . . . . . . . . . . . . . 81
JDBC . . . . . . . . . . . . . . . . . . . véase JDBC CLASSPATH, variable de entorno. . . . . . 239
LiveWire . . . . . . . . . . . . . véase LiveWire ClearModuleList, directiva Apache . . . . . 159
ODBC . . . . . . . . . . . . . . . . . . véase ODBC cliente/servidor . . . . . . . . . . . . . . . . . 6, 21, 109
Perl:DBI . . . . . . . . . . . . . . véase Perl:DBI Cocoon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Productos Comanche . . . . . . . . . . . . . . . . . . . . . . . . 12, 297
Informix . . . . . . . . . . . . véase Informix Common log format . . . . . . . . . . . . . . . . . . 126
mSQL . . . . . . . . . . . . . . . . véase mSQL config.status . . . . . . . . . . . . . . . . . . . . . . . . . 138
MySQL . . . . . . . . . . . . . véase MySQL config_log_module, módulo Apache . . . 280
Oracle . . . . . . . . . . . . . . . . véase Oracle Configuration . . . . . . . . . . . . . . . . . . . . . . . . 136
SQL Server . . . . . . . véase SQL Server Configuration.tmpl . . . . . . . . . . . . . . . . . . . 136
Sybase . . . . . . . . . . . . . . . véase Sybase Configure . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Propiedades ACID . . . . . . . . véase ACID configure . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
SGBDR . . . . . . . . . . . . . . . véase SGBDR Content-type . . . . . . . . . . . . . . . . . . . . . . . . . . 41
SQL . . . . . . . . . . . . . . . . . . . . . . véase SQL CONTENT_LENGTH, variable de entorno
biblioteca jk . . . . . . . . . . . . . . . . . . . . . . . . . 243 CGI . . . . . . . . . . . . . . . . . . . . . . . . . . 38
BindAddress, directiva Apache . . . . . . . . 205 CONTENT_TYPE, variable de entorno CGI
Bitácora . . . . . . . . . . . . . . . . . . . . . . . véase Log 38
BrowserMatch, directiva Apache . . . . . . . 207 Control ancho de banda . . . . . . . . . . . . . . . 294
BrowserMatchNoCase, directiva Apache207 Control de acceso . . . . . . . . . . . . . . . . . . . . 253
Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
C configuración. . . . . . . . . . . . . . . . 285–286
C, C++ embebido. . . . . . . . . . . . . . . . . . . . . . 75 CookieTracking, directiva Apache . . . . . . 285
Código embebido . . . . . . . . . . . . . . . . . . 52–76 CORBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
ASP . . . . . . . . . . . . . . . . . . . . . . véase ASP Covalent Intrusion Detector, módulo Apache
HotWired XSSI . véase HotWired XSSI 295
JSP . . . . . . . . . . . . . . . . . . . . . . . . véase JSP CRL, Certificate Revocation Lists . . . . . . 273
JSSI . . . . . . . . . . . . . . . . . . . . . . véase JSSI cron . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Mason HQ . . . . . . . . . . véase Mason HQ Cronolog . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Perl embebido . . . . . . . . véase PEE, Perl configuración. . . . . . . . . . . . . . . . 283–285
Embebed Engine utilidades
PHP . . . . . . . . . . . . . . . . . . . . . . véase PHP cronolog . . . . . . . . . . . . . . . . . . . . . . 284
SSI . . . . . . . . . . . . . . . . . . . . . . . . véase SSI cronosplit . . . . . . . . . . . . . . . . . . . . . 284
Caché . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33, 295 CSR, Certificate Signing Requests . . . . . 273
CERN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 CSS, Cascading Style Sheets . . . . . . . . . . . 94
420 ÍNDICE DE MATERIAS
Listen, directiva Apache . . . . . . . . . . . . . . . 170 mod_alias, módulo Apache . . . 181, 186, 296
LiveConnect . . . . . . . . . . . . . . . . . . . . . . . . . . 75 mod_auth, módulo Apache . . . . . . . . . . . . 253
LiveWire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 mod_auth_db, módulo Apache . . . . . . . . . 256
LoadModule, directiva Apache . . . . 152, 161 mod_auth_dbm, módulo Apache . . . . . . . 256
Location . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 mod_auth_digest, módulo Apache. . . . . .258
Log . . . . . . . . . . . . . . . . . . . . . . . . 125–130, 195 mod_auth_ldap, módulo Apache . . . . . . . 257
Análisis. . . . . . . . . . . . . . . . . . . . . 128–129 mod_auth_mysql, módulo Apache . . . . . 257
Formato véase Variables de formato log mod_auth_nis, módulo Apache . . . . . . . . 257
Rotación . . . . . . . . . . . . . . . . . . . . . . . . 130 mod_auth_oraX, módulo Apache . . . . . . 257
Utilidades mod_auth_pgsql, módulo Apache . . . . . . 257
Cronolog . . . . . . . . . . . véase Cronolog mod_auth_smb, módulo Apache . . . . . . . 257
Logrotate . . . . . . . . . . . véase Logrotate mod_autoindex, módulo Apache. . .174–180
LogFormat, directiva Apache . . . . . . . . . . 198 mod_backhand, módulo Apache . . . . . . . 294
LogLevel, directiva Apache. . . . . . . . . . . . 198 mod_cgi, módulo Apache . . . . . . . . . 230, 280
Logrotate . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 mod_dav, módulo Apache . . . . . . . . . . . . . 261
mod_digest, módulo Apache . . . . . . 253, 258
M mod_dir, módulo Apache. . . . . . . . . . . . . . 177
Método DELETE . . . . . . . . . . . . . . . . . . . . . 102 mod_include, módulo Apache . . . . . . . . . 226
Método GET . . . . . . . . . . . . . . . . . . . . . . 23, 38 mod_info, módulo Apache . . . . . . . . . . . . 214
Método HEAD . . . . . . . . . . . . . . . . . . . . . . . . 23 mod_jk, módulo Apache . . . . . . . . . . . . . . 243
Método POST . . . . . . . . . . . . . . . . . . . . . 24, 38 mod_jk.conf-auto. . . . . . . . . . . . . . . . . . . . . 244
Método PUT . . . . . . . . . . . . . . . . . . . . . . . . . 102 mod_jserv, módulo Apache . . . . . . . . . . . . 243
magic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 mod_log_config, módulo Apache . . . . . . 195,
make . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 198–200
Makefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 mod_mime, módulo Apache . 151, 189, 190,
Mason HQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 192
MaxClients, directiva Apache . . . . . . . . . . 164 mod_mime_magic, módulo Apache151, 194
MaxKeepAliveRequests, directiva Apache mod_negotiation, módulo Apache . . . . . . 193
171 mod_perl, módulo Apache . . . . . . . . . . . . . . 49
MaxRequestsPerChild, directiva Apache 165 mod_php4, módulo Apache . . . . . . . . . . . 250
MaxSpareServers, directiva Apache . . . . 166 mod_proxy, módulo Apache . . . . . . . . . . . 295
MD5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 mod_redundancy, módulo Apache. . . . . . 296
Mediciones de mercado mod_rewrite, módulo Apache . . . . . 195, 296
Netcraft . . . . . . . . . . . . . . . . . . . . . . . . . . 10 mod_session, módulo Apache . . . . . . . . . 128
Security Space . . . . . . . . . . . . . . . . . . . . 10 mod_setenvif, módulo Apache . . . . . . . . . 207
MIME . . . . . . . . . . . . . . . . . . . . 28, 41, 96, 188 mod_so, módulo Apache . . . . . . . . . . . . . . 161
mime.types . . . . . . . . . . . . . . . . . . . . . . . . . . 151 mod_ssl, módulo Apache . . . . . . . . . . 84, 267
MIMEMagicFile, directiva Apache . . . . . 194 mod_status, módulo Apache . . . . . . . . . . . 213
MinSpareServers, directiva Apache. . . . . 166 mod_throttle, módulo Apache . . . . . . . . . 294
mod_access, módulo Apache . 200, 204, 253 mod_userdir, módulo Apache . . . . . . . . . . 209
mod_actions, módulo Apache. . . . . . . . . . 233 mod_usertrack, módulo Apache . . . . . . . . 285
ÍNDICE DE MATERIAS 423