Apuntes DAW – Introducción a los Servidores Web

La asignatura de Despliegue de Aplicaciones Web, según lo visto con los compañeros es una de las que más dificultades nos presenta en el ciclo de Desarrollo de Aplicaciones Web, y es que aunque es importante conocerla y a ella le dedicaremos buena parte de nuestras horas de aprendizaje, se nota que es una rama que pertenece más a la Administración de Sistemas Informáticos… y parece que nos cuesta un poco cambiar el chip.

No obstante, como siempre, todo es proponérselo y echarle horas para que todo pueda salir (esperemos jeje).

En estos primeros apuntes, dejaré nociones sobre el protocolo HTTP, principales características del Servidor Web Apache, su instalación, configuración y la creación de un Virtual Host al que nos podamos dirigir tanto por nombre, ip o puerto.

Protocolo HTTP

HTTP es un protocolo de comunicaciones estándar que comunica servidores, proxies y clientes. Permite la transferencia de documentos web, sin importar cuál es el cliente o cuál es el servidor.

Es un protocolo basado en el esquema de petición/respuesta.

Funcionamiento:

El usuario escribe una URL, indicando el protocolo, servidor y recurso que quiere obtener, el servidor procesa dicha información y devuelve un mensaje de respuesta, normalmente con el HTML de la página que se va a visualizar.

Métodos de envío de los datos

  • GET: solicita un documento al servidor.
  • HEAD: similar a GET, pero sólo pide las cabeceras HTTP.
  • POST: manda datos al servidor para su procesado.
  • PUT: almacena el documento enviado en el cuerpo del mensaje.
  • DELETE: elimina el documento referenciado en la URL.

Códigos de estado

  • 1XX: Mensaje informativo
  • 2XX: Éxito
    • 200: OK
    • 201: Created
    • 202: Accepted
    • 204: No Content
  • 3XX: Redirección
    • 300 Multiple Choice
    • 301 Moved Permanently
    • 302 Found
    • 304 Not Modified
  • 4XX: Error del cliente
    • 400 Bad Request
    • 401 Unauthorized
    • 403 Forbidden
    • 404 Not Found
  • 5XX: Error del Servidor
    • 500 Internal Server Error
    • 501 Not Implemented
    • 502 Bad Gateway
    • 503 Service Unavailable

Cabeceras

  • Host: el cliente indica en esa cabecera el nombre del servidor al que se conecta.
  • User-Agent: el navegador manda al servidor información del cliente mediante el que se conecta.
  • Server: cuando el servidor contesta, la respuesta indica  “quien es y que versión es”.
  • Cache-control
  • Content-type: tipo de contenido, tipo MIME
  • Content-Encoding: codificación en la que va el contenido
  • Expires: si hay un momento en el que expira el recurso
  • Location: cuando se produce una redirección, el servidor indica donde se encuentra el recurso para poder hacer la redirección.
  • Set-Cookie: donde se encuentran las cookies

Otras características

  • Cookies: Las cookies son información que el navegador guarda en memoria o en el disco duro dentro de ficheros de texto, a solicitud del servidor.
  • Sesiones: HTTP es un protocolo sin manejo de estados. Las sesiones nos permiten definir estados, para ello el servidor almacenará la información necesaria para llevar el seguimiento de la sesión.
  • Autentificación: a veces, debido a cuestiones de personalización o a políticas de restricción, las aplicaciones Web deben conocer y verificar la identidad del usuario, mediante nombre de usuario y contraseña.
  • Conexiones persistentes: permiten que varias peticiones y respuestas sean transferidas usando la misma conexión TCP.

Servidor Web Apache

  • Servidor web HTTP de código abierto.
  • Plataformas Linux, Windows, Mac y otras (multiplataforma)
  • Implementa el protocolo HTTP/1.1
  • Se desarrolla dentro del proyecto HTTP Server (httpd) de la Apache Software Fundation
  • Extremadamente estable
  • Servidor más utilizado en la actualidad.

Instalación Servidor Apache

Instalación en Debian/Ubuntu

apt-get install apache2

Gestión del servicio

apache2ctl [-k start | restart | graceful | graceful-stop | stop]

Restart -> reinicia los servicios de forma abrupta
Graceful -> renicio suave, esperando que terminen los procesos que hay en curso.

apache2ctl -t
comprueba sintaxis de los ficheros de configuración.
apache2ctl -M
módulos cargados en este momento
apache2ctl – S
sitios virtuales disponibles
apache2ctl -V
opciones de compilación

Gestión con systemd

systemctl [start | stop | restart | reload | status] apache2.service

reload -> equivale al graceful.

Nota de interés: ver procesos activos en Ubuntu, para comprobar si apache está activo:

ps -A|grep apache2

Configuración de Apache

La configuración de Apache se encuentra descentralizada en Ubuntu, es decir, la configuración del servidor se encuentra distribuida en varios ficheros.

Archivo principal: /etc/apache2/apache2.conf

Resto de archivos destacados:

IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf

Include ports.conf
configuración de los puertos de escucha de Apache.

IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf

configuración de los diferentes sitios virtuales

/etc/apache2/apache2.conf

<Directory /var/www/>
            Optiones Indexes FollowSymLinks
            AllowOverride None
            Require all granted
</Directory>

Este archivo especifica las características que tiene el directorio base donde van a estar ubicados nuestros sitios virtuales, y se aplica a sus carpetas “hijas”.

Por defecto, el directorio base es /var/www/ esto puede ser modificado cambiando la ruta, de forma predeterminada, el archivo apache2.conf dispone de otra configuración comentada con la carpeta /srv/ aunque podrías editarla a tu gusto.

a2en / a2dis

Estas instrucciones, acompañadas de su terminación correspondiente, son las encargadas de habilitar o deshabilitar las configuraciones, módulos o sitios en Apache, esto quedaría del siguiente modo:

# a2encof prueba
esta instrucción crea un enlace simbólico del archivo que se encuentra dentro de la carpeta conf-available en conf-enabled para activarlo.

#a2disconf prueba
esta instrucción elimina el enlace simbólico disponible en la carpeta conf-enabled, pero el archivo original seguirá estando en conf-available para una posible nueva activación.

#a2ensite prueba
esta instrucción crea un enlace simbólico del archivo que se encuentra dentro de la carpeta sites-available en sites-enabled para activarlo.

#a2dissite prueba
esta instrucción elimina el enlace simbólico disponible en la carpeta sites-enabled, pero el archivo original seguirá estando en sites-available para una posible nueva activación.

#a2enmod prueba
esta instrucción crea un enlace simbólico del archivo que se encuentra dentro de la carpeta mods-available en mods-enabled para activarlo.

#a2dismod prueba
esta instrucción elimina el enlace simbólico disponible en la carpeta mods-enabled, pero el archivo original seguirá estando en mods-available para una posible nueva activación.

Directivas en Apache

Estas son algunas de las directivas que pueden aparecer en el fichero de configuración /etc/apache2/apache2.conf

Timeout
tiempo de espera para recibir una petición o enviar una respuesta por parte del servidor (300 segundos por defecto).

KeepAlive
activar las conexiones persistentes.

MaxKeepAliveRequests
indica el número de peticiones y respuestas que se pueden ofrecer en una misma conexión persistente.

KeepAliveTimeout
tiempo que espera el servidor dentro de una conexión persistente para que el cliente continúe hacienda peticiones.

User
indica el usuario que utiliza apache para trabajar.

Group
grupo del usuario que utiliza apache para trabajar.

LogLevel
controla el nivel de información que se guarda en los ficheros log.

LogFormat
formato de la información que se guarda en los ficheros logs.

Directory

DirectoryMatch
no pone el directorio en concreto sino una expresión regular, estableciendo las opciones que le vamos a dar a un directorio y sus subdirectorios

Files
establece contexto o serie de opciones para un determinado fichero.

FilesMatch
establece contexto o serie de opciones para un grupo de ficheros.

He decidido dividir este artículo en dos, y he pasado la parte relacionada con la configuración de VirtualHost en un nuevo artículo, el cual puedes ver aquí.