Servidor Web Apache

Apache es uno los servidores http más extendidos actualmente para la implementación de servidores web. Es un servidor de código abierto y multiplataforma, muy robusto y que destaca por su seguridad y rendimiento.

31-Ene-2016

A lo largo de este módulo vamos a ir viendo los pasos para instalar el componente principal de nuestro servidor web.

  • Conexión remota con el servidor (putty)
  • Instalar el servidor APACHE
  • Comando apachectl (controlar el servicio httpd de Apache)
  • Configuración básica de Apache

Apache es uno los servidores http más extendidos actualmente para la implementación de servidores web. Es un servidor de código abierto y multiplataforma, muy robusto y que destaca por su seguridad y rendimiento.

Será el encargado de procesar las peticiones de recursos (páginas, archivos, etc.) que hagan los clientes que visiten nuestro sitio web, gestionar si se entregan esos contenidos o no al cliente dependiendo de las políticas de seguridad.

Aparte del soporte para HTTP implícito, también nos ofrece soporte para la implementación de cifrados SSL y la configuración de conexiones seguras por medio de HTTPS que abordaremos en próximos módulos.

Conexión remota con el servidor (putty)

Las instalaciones y configuraciones de nuestro servidor las realizaremos desde una terminal remota, utilizando el servicio SSH activado en FreeBSD por medio del programa putty que se describió en el módulo ‘software necesario’ el cual nos permite conectarnos al servidor de forma remota sin tener que actuar directamente con el ordenador donde está instalado el sistema.

Conectarnos al servidor:

Suponiendo que ya tenemos nuestro servidor (máquina virtual) en funcionamiento, seleccionándola en la ventana de VirtualBox y pulsando el botón Iniciar.

  • Abrir el programa putty
  • Introducir la IP del servidor en el recuadro ‘Host Name’.
  • Asegurarnos de dejar marcada la opción SSH en ‘Connection type’.
  • Introducir una descripción en el recuadro ‘Saved Sessions’ y pulsar el botón ‘Save’. De esta manera cada vez que deseemos conectarnos al servidor no tendremos que indicar la Ip, simplemente seleccionaremos de la lista el nombre y pulsaremos ‘Load’.
  • Pulsar el botón ‘Open’ para iniciar la conexión con el servidor.
Ventana Conexión con Putty

La primera vez que nos conectemos, se nos mostrará una ventana de advertencia de seguridad sobre las claves ssh por si deseamos almacenarlas en el registro de Windows para usos posteriores. Simplemente pulsaremos el botón ‘Sí’ para que las recuerde.

Alerta Seguridad Putty

Se abrirá una ventana que hará las funciones de terminal, donde se nos solicitará el  login y la clave del usuario con el que nos deseamos conectar.

En nuestro caso utilizaremos el usuario ‘super’ creado durante la instalación del sistema (ver ‘Instalar SO FreeBSD 10.2’).

Una vez logeados, ya estaremos preparados para trabajar con nuestro servidor.

Login sesión telnet con el servidor

Instalar el servidor APACHE

Instalar el paquete apache24

Como ya comentamos en el módulo anterior, para poder realizar las instalaciones de paquetes debemos tener privilegios de administrador, lo que nos obliga a convertirnos en administrador de forma temporal.

Ejecutamos el comando ‘su’ e introducimos la clave del administrador (root).

$ su
Password:
root@srvweb_peam:/usr/home/super #

La instalación la realizaremos con los paquetes ya compilados del repositorio de FreeBSD por medio del comando pkg install apache24.

Este comando iniciará primero una comprobación del catálogo local de repositorios por si fuese necesaria su actualización y posteriormente nos mostrará el paquete que se tiene que instalar, sus dependencias y el espacio necesario para su instalación, esperando la confirmación del usuario.

Si en alguna de las instalaciones, se detecta que existen actualizaciones del programa pkg, primero nos preguntará si deseamos realizar su actualización antes de continuar con el paquete solicitado.

# pkg install apache24
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/FreeBSD:10:amd64/quarterly, please wait...
Verifying signature with trusted certificate pkg.freebsd.org.2013102301... done
Installing pkg-1.6.2...
Extracting pkg-1.6.2: 100%
Message from pkg-1.6.2:
If you are upgrading from the old package format, first run:

 # pkg2ng
Updating FreeBSD repository catalogue...
Fetching meta.txz: 100%  944 B  0.9kB/s  00:01
Fetching packagesite.txz: 100%  5 MiB  2.8MB/s  00:02
Processing entries: 100%
FreeBSD repository update completed. 24677 packages processed.
Updating database digests format: 100%
The following 9 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
    apache24: 2.4.18
    expat: 2.1.0_3
    apr: 1.5.2.1.5.4
    gdbm: 1.11_2
    indexinfo: 0.2.4
    gettext-runtime: 0.19.6
    db5: 5.3.28_3
    perl5: 5.20.3_8
    pcre: 8.37_4

The process will require 130 MiB more space.
31 MiB to be downloaded.

Proceed with this action? [y/N]: y

Al confirmar esta acción, se iniciara la descarga del paquete, la instalación, la creación del usuario  y grupo ‘www’ y al finalizar nos mostrará una serie de comentarios acerca de cómo activar el servicio durante el arranque del sistema y de cómo tenemos que tratar el uso de las DNS.

Una vez realizada la instalación, editaremos el fichero /etc/rc.conf para que cargue el servidor durante el proceso de inicio del sistema.

Para ello nos vamos a servir del editor de textos  ‘ee’ incluido en FreeBSD ya que es uno de los más sencillos y fáciles de aprender.

$ ee /etc/rc.conf

Añadiremos la línea apache24_enable = “YES”, guardaremos los cambios y saldremos del editor.

  • Para guardar los cambios accederemos al menú pulsando la tecla ESC, seleccionaremos la opción ‘c) file operations’y a continuación ‘c) save file’.
  • Para salir del editor pulsaremos la tecla ESC y seleccionaremos la opción ‘a) leave editor’.

Reiniciaremos el servidor con el comando ‘reboot’.

Tras reiniciarse el servidor, vamos a comprobar que el servicio está en funcionamiento listando los procesos net con el comando netstat

$ netstat -a

Si nos muestra estas líneas el servicio estará preparado

tcp4    0   0 *.http         *.*          LISTEN
tcp6    0   0 *.http         *.*          LISTEN

Comprobar desde otro pc el funcionamiento abriendo el navegador y escribiendo la ip de nuestro servidor, si funciona se mostrará el mensaje 'It works!'.

Si obtenemos el siguiente mensaje de error cuando se esté iniciando el servidor:

Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message.

Añadiremos la siguiente línea en el fichero de configuración de Apache /usr/local/etc/apache24/httpd.conf

ServerName 127.0.0.1 ó ServerName localhost

Esto lo comentaremos en el siguiente apartado de forma más amplia.

Comando apachectl

Controlar el servicio httpd de Apache

Si deseamos realizar las operaciones de puesta en marcha, detener o comprobar el servidor web de forma manual tendremos que utilizar el comando apachectl situado en el directorio /usr/local/sbin/

  • Mostrar la versión de apache (-v)
# cd /usr/local/sbin
# apachectl -v
Server version: Apache/2.4.18 (FreeBSD)
Server built:  Jan 28 2016 02:16:15
  • Realiza una comprobación del archivo de configuraciones (configtest)
# apachectl configtest
Performing sanity check on apache24 configuration:
Syntax OK
  • Iniciar el servidor (start)
# apachectl start
Performing sanity check on apache24 configuration:
Syntax OK
Starting apache24.
  • Nos indica cual el identificador de proceso asociado al servidor y si se encuentra en funcionamiento
# apachectl
httpd (pid 690) already running
  • Detiene el servidor (stop)
# apachectl stop
Stopping apache24.
Waiting for PIDS: 690.
  • Reiniciar el servidor (restart)
# apachectl restart
Performing sanity check on apache24 configuration:
Syntax OK
Stopping apache24.
Waiting for PIDS: 690.
Performing sanity check on apache24 configuration:
Syntax OK
Starting apache24.

Configuración básica de Apache

Ahora que ya tenemos instalado y funcionando el servidor Apache, vamos a comentar y realizar una serie de configuraciones básicas.

Para configurar el servidor modificaremos el fichero /usr/local/etc/apache24/httpd.conf que es donde guarda los parámetros y opciones de su funcionamiento.

Ejecutamos el comando su y luego editamos el fichero de configuración de apache

$ su
Password:
# ee /usr/local/etc/apache24/httpd.conf

Poner comentarios

Cuando necesitemos comentar alguna línea de este archivo simplemente pondremos al principio de la línea el carácter ‘#’.

# De esta manera establecemos comentarios en el archivo de configuración

Listen

El comando Listen identifica los puertos en los que el servidor Web aceptará las peticiones entrantes. Por defecto, el Servidor Apache HTTP está configurado para escuchar en el puerto 80 para comunicaciones Web no seguras y en el puerto 443 para comunicaciones seguras.

Listen 80

ServerAdmin

Esta variable (directriz) establece la dirección de correo del administrador del servidor web. Esta dirección de correo aparecerá en los mensajes de error en las páginas generadas por el servidor Web, de tal manera que los usuarios pueden comunicar errores enviando correo al administrador.

Una forma típica de configurar ServerAdmin es configurarlo en a webmaster@ejemplo.com.

ServerAdmin  webmaster@minubeinformatica.com

ServerName

Esta variable para configurar un nombre de servidor y un número de puerto (que coincida con la directriz Listen) para el servidor. El ServerName no necesita coincidir con el nombre real de la máquina. Por ejemplo, el servidor Web puede ser www.example.com pero el nombre del servidor es en realidad foo.example.com.

En nuestro caso como no tenemos configurado un nombre de dominio utilizaremos localhost o 127.0.0.1 que hacen referencia a nuestra máquina.

ServerName   localhost:80

DocumentRoot

DocumentRoot es el directorio que contiene la mayoría de los archivos HTML que se entregarán en respuesta a peticiones. El directorio predeterminado DocumentRoot para servidores web seguros y no seguros es /usr/local/www/apache24/data. Por ejemplo, el servidor puede recibir una petición para el siguiente documento:

http://192.168.1.10/cursos.html

El servidor buscará el archivo en el directorio por defecto (DocumentRoot):

/usr/local/www/apache24/data/cursos.html

Si deseamos establecer otra ubicación para la estructura de directorios visible desde la web, indicaremos la nueva ruta en esta directiva.

DocumentRoot "/mnt/webapps/www"
<Directory "/mnt/webapps/www">

Hemos cambiado la carpeta predeterminada donde se ubican los archivos de las webs a /mnt/webapps/www. También tendremos que cambiar el grupo principal de esta carpeta a www con el comando chgrp www /mnt/webapps/www y darle permisos de escritura con chmod 775 /mnt/webapps/www.

# cd /mnt/webapps 
# mkdir www
# chgrp www /mnt/webapps/www
# chmod -R 775 /mnt/webapps/www

Para comprobar que funciona este cambio vamos a crear una página básica html en este directorio con el editor ee que la guardaremos con el nombre index.html.

<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF8">
<title>PAGINA INICIO</title>
</head>
<body>
<h1>FUNCIONA</h1>
<p>Si consigues leer este texto estarás en la nueva ubicación de los documentos web de apache 24</p>
</body>
</html>

Ahora cuando escribamos la ip de nuestro servidor en el navegador, si funciona se mostrará lo siguiente:

Página de inicio

Para evitar que se muestren los listados de archivos en los directorios web que no dispongan de archivo index.html o index.php, incluiremos la directiva Options en la sección Directory de la siguiente manera.

<Directory "/mnt/webapps/www">
       Options -Indexes

Con esta modificación evitaremos que cuando un usuario solicite una ruta a un directorio web, se le muestre un listado con el contenido del mismo.

Por ejemplo si disponemos de un directorio de nombre documentos en nuestro servidor y un usuario escribe en el navegador http://192.168.1.10/paginas y en este directorio no se encuentra un archivo de índice (index.html o index.php) el servidor web en lugar de mostrarle un listado del contenido del directorio le mostrará un mensaje indicando que no tiene permiso para acceder a este directorio.

Permiso denegado acceso directorio

Alias

La directiva Alias ​​permite que los documentos se almacenen en un directorio del sistema de archivos local que no sea el especificado por DocumentRoot.

Si vamos a crear un alias en un directorio fuera del de DocumentRoot, puede que tengamos que permitir explícitamente el acceso al directorio de destino.

Por ejemplo podemos tener una web en desarrollo en el directorio /var/www/miweb que no es el especificado en la directiva DocumentRoot de Apache, por lo que no podemos acceder a su contenido. Por medio de Alias podemos mapear su dirección a una carpeta virtual como si se encontrara dentro de nuestro DocumentRoot.

Alias /miweb /var/www/miweb
<Directory /var/www/miweb >
 AllowOverride none
 Require all granted
</Directory> 

A partir de este momento podremos acceder al contenido de miweb desde nuestro navegador simplemente indicando la URL del servidor seguida del nombre del alias (http://192.168.1.10/miweb).

// CREAMOS DIRECTORIO PARA LA DIRECTIVA ALIAS DE APACHE
 --------------------------------------------------------------------------------------
 # cd /var
 # mkdir www
 # cd www
 # mkdir miweb
 # cd miweb

// CREAMOS FICHERO INDEX DE PRUEBAS -------------------------------------------------------------------------------------- # ee index.html ^[ (escape) menu  ^y search prompt  ^k delete line   ^p prev li   ^g prev page ^o ascii code     ^x search         ^l undelete line ^n next li   ^v next page ^u end of file    ^a begin of line  ^w delete word   ^b back 1 char ^t top of text    ^e end of line    ^r restore word  ^f forward 1 char ^c command        ^d delete char    ^j undelete char ^z next word =====line 10 col 0 lines fr                         =========================== <!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF8"> <title>PAGINA INICIO ALIAS MIWEB</title> </head> <body> <h1>PAGINA WEB EN DESARROLLO</h1> <p>Si consigues leer este texto estarás en el directorio /var/www/miweb que se encuentra fuera del DocumentRoot de Apache</p> </body> </html> "index.html" 12 lines, 282 characters

// EDITAMOS EL FICHERO DE CONFIGURACIÓN DE APACHE PARA CREAR EL ALIAS -------------------------------------------------------------------------------------- # ee /usr/local/etc/apache24/httpd.conf ^[ (escape) menu  ^y search prompt  ^k delete line   ^p prev li   ^g prev page ^o ascii code     ^x search         ^l undelete line ^n next li   ^v next page ^u end of file    ^a begin of line  ^w delete word   ^b back 1 char ^t top of text    ^e end of line    ^r restore word  ^f forward 1 char ^c command        ^d delete char    ^j undelete char ^z next word =====line 274 col 27 lines                          =========================== # # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: #   AllowOverride FileInfo AuthConfig Limit # AllowOverride None # # Controls who can get stuff from this server. # Require all granted </Directory> Alias /miweb /var/www/miweb <Directory "/var/www/miweb">         AllowOverride none         Require all granted </Directory> # # DirectoryIndex: sets the file that Apache will serve if a directory "/usr/local/etc/apache24/httpd.conf" 526 lines, 20441 characters

// REINICIAMOS EL SERVIDOR APACHE -------------------------------------------------------------------------------------- # apachectl restart Performing sanity check on apache24 configuration: Syntax OK Stopping apache24. Waiting for PIDS: 910. Performing sanity check on apache24 configuration: Syntax OK Starting apache24.

Página web con directiva alias de Apache

DirectoryIndex

DirectoryIndex es la página web por defecto que entrega el servidor cuando hay una petición de índice de un directorio especificado con una barra (/) al final del nombre del directorio.

<IfModule dir_module>
 DirectoryIndex index.html
</IfModule> 

Se pueden ir añadiendo distintos nombres de archivos separados por un espacio en blanco entre cada nombre de archivo.

Esta directiva la modificaremos más adelante cuando incluyamos los servicios php en nuestro servidor web.

ErrorDocument

El comando ErrorDocument nos permite crear respuestas de error personalizables cuando se produzca algún error en el servidor.

Admite tres valores posibles:

  1. Texto plano con el mensaje que se mostrará cuando se produzca un error
  2. Página web local que se mostrará cuando se produzca un error
  3. Página web externa al servidor con el contenido del mensaje

Por defecto Apache nos ofrece algunos ejemplos comentados que podemos utilizar para crear los mensajes personalizados.

#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html

Podríamos crearnos una carpeta en el DocumentRoot del servidor llamada “/errores” para guardar las páginas de error y luego crear una página con el nombre “no_encontrada.html” con el diseño y mensaje que deseamos que se muestre cuando se produzca el típico error 404 “página no encontrada”. Posteriormente utilizaríamos el comando ErrorDocument para mostrarla cuando se produzca el error 404.

ErrorDocument 404 /errores/no_encontrada.html