educatica!

educación, informática y demás

Redes de computadores, Servicios en Red, XUbuntu 20.04

Apache2. Servidor HTTP

En esta entrada vamos a instalar un servidor HTTP apache2 en un sistema XUbuntu 20.04. Esta máquina está conectada a una LAN privada, creada con una Red NAT en VirtualBox, a la que estarán conectados otros equipos y a la que tendrán acceso a dicho servidor desde la red.

Instalando Apache2

Primero actualizamos la lista de paquetes de software disponibles en los repositorios de software configurados en nuestro sistema. De esta forma tenemos la información actualizada de software disponible.

Vamos a probar que funciona…

Pero, ¿podrán acceder otros equipos de la red?. Si, si conocen la dirección IP y tienen un navegador web, si podrán acceder.

Desde una máquina virtual con un sistema Windows nos vamos a conectar al servidor http que acabamos de instalar. Para ello, tan solo tenemos que conocer la dirección IP de la máquina que tiene el servidor.

Ahora, desde la máquina de Windows lanzamos un navegador web y nos conectamos.

Si no ha funcionado o si queremos asegurarnos de que hay conexión entre ambos equipos podemos utilizar el comando ping para comprobar la conexión.

Páginas web dentro del documeto raíz web

Apache2 guarda el ráiz del sitio web principal por defecto (DocumentRoot) en el directorio /var/www/html.

Es decir, todo lo que metamos en ese directorio estará accesible a través del servidor web apache2, siempre y cuando los permisos de los ficheros lo permitan.

Por ejemplo, podemos crear un nuevo fichero html con el nombre que queramos dentro del directorio raíz web y estará accesible a través de conexión HTTP.

Ejercicios

En todos los ejercicios deberás probar que funciona la conexión desde otro equipo de la LAN privada (Red NAT) con un sistema operativo preferiblemente Microsoft Windows.

Ejercicio 1

Crea una nueva página web llamada saludo.html dónde proporciones un pequeño saludo a los visitantes de tu sitio web.

URL: http://192.168.100.4/saludo.html

Dónde 192.168.100.4 será la dirección IP que tengas en tu caso en el equipo GNU/Linux xubuntu 20.04 dónde esté el servidor Web.

Solución

Creamos la página web.

Copiamos el fichero al raíz del sitio web.

Hemos copiado el fichero, así que debería estar disponible para que apache2 pueda servirlo si algún cliente web lo solicita. Vamos a probarlo desde nuestro propio equipo.

La conexión desde nuestro propio equipo ha funcionado. Ahora vamos a acceder desde otra máquina distinta, la máquina virtual de Windows.

Ejercicio 2

Renombra la página web índice de tu sitio web, index.html, con el nombre apache2.html. Ahora crea una nueva página web index.html que sirva de índice de tu sitio web.

En esta página, presentate, habla de ti un poco y crea un enlace a la página saludo.html y a apache2.html.

URL: http://192.168.100.4

URL: http://192.168.100.4/apache2.html

Dónde 192.168.100.4 será la dirección IP que tengas en tu caso en el equipo GNU/Linux xubuntu 20.04 dónde esté el servidor Web.

Solución

Renombramos el fichero.

Vamos a acceder al sitio web principal ahora que no hay página de índice.

Apache2, por defecto, si no encuentra página de índice en el directorio al que se está accediendo muestra un listado con el cóntenido de dicho directorio.

Ahora tenemos que crear una página de índice nueva con un enlace a saludo.html y apache2.html.

La copiamos al directorio raíz del servidor web.

Ahora vamos a probar que funciona todo correctamente si accedemos desde otro sistema informático a través de la red.

Ejercicio 3

Crea un nuevo sitio web llamado sistemas dentro del ráiz de tu sitio web. Para ello deberás crear un directorio llamado sistemas dentro del directorio raíz por defecto de apache2.

Dentro del directorio sistemas, tendrás que crear una nueva página de índice, index.html, dónde pondrás información sobre sistemas informáticos así como tu nombre y apellidos y un enlace a la página índice del sitio principal.

También vamos a modificar la página de índice principal para añadir un enlace a sistemas.

URL: http://192.168.100.4/sistemas

Dónde 192.168.100.4 será la dirección IP que tengas en tu caso en el equipo GNU/Linux xubuntu 20.04 dónde esté el servidor Web.

Solución

Lo primero que tenemos que hacer es crear un directorio que será el que almacene todo el sitio web de sistemas. El nombre del directorio será sistemas y estará dentro del directorio raíz de apache2.

Ahora tenemos que crear una página de índice propia para dicho sitio web.

Una vez creada, la situamos en el directorio de sistemas.

Ahora vamos a probar que tenemos acceso al sitio web de sistemas.

Por último, actualizamos la página de índice principal

Ahora habría que probarlo en el sistema remoto de Windows.

Ejercicio 4 – Sitio web de sistemas

Queremos configurar el sitio web de sistemas para que lo gestione marinapg. Es decir, marinapg será el webmaster de dicho sitio web. El webmaster podrá gestionar a su antojo el contenido de dicho sitio web, que al final no es más que un conjunto de ficheros: html, jpg, css, js, etc.

Como un sitio web está compuesto por muchos ficheros, se suele guardar en un directorio propio para tenerlo organizado. En nuestro caso, el directorio será sistemas.

Como marinapg es la webmaster, tan solo ella podrá acceder al directorio del sitio web de sistemas para realizar operaciones de lectura y escritura. Apache2 podrá acceder para realizar operaciones de lectura y el resto de usuarios no podr´á hacer nada. ( Aquí tenemos la configuración de permisos, propietario y grupo que deberíamos utilizar el el directorio sistemas)

Investiga para ver cómo solucionas el problema.

Solución

La solución al problema pasa por conocer el usuario y grupo que utiliza apache2 para acceder a los recursos del sistema. Apache2 es un servidor web, un programa que lleva a cabo la función de servidor web, sirviendo peticiones a través de la red del protocolo HTTP/HTTPS.

Si tuvieramos un servidor FTP estaríamos hablando de un programa que sirve peticiones FTP a través de la red. Por tanto, un servidor es un programa que se ejecuta en un sistema informático, que habitualmente se llama servidor, en un sistema operativo, que habitualmente se denomina sistema operativo servidor. Por tanto, la nomenclatura es un poco difusa, hay que tener en cuenta el contexto cuando se habla de servidor.

Nosotros nos vamos a centrar en servidor como aplicación que sirve peticiones de un protocolo de red a través de una conexión de red. Dependiendo del tipo de servidor las peticiones serán de distinto tipo, por ejemplo en este caso las peticiones serán de acceso a una página web.

Para poder proporcionar las páginas web, apache2, tiene que poder acceder a ellas en el sistema de ficheros del sistema informático en el que está funcionando. Para ello, utiliza una cuenta de usuario y una cuenta de grupo. Esta cuenta es www-data.

Nosotros ya hemos estudiado la configuración de permisos, propietario y grupo que se utiliza en los sistemas UnixLike.

Vamos a echar un vistazo a la configuración de la cuenta www-data en el sistema.

Como curiosidad, podemos ver que el grupo principal del usuario www-data es el grupo www-data y, además, que el directorio personal de ese usuario est /var/www, el directorio padre del directorio raíz del servidor web: /var/www/html.

Por tanto, si queremos que apache2 tenga acceso a ficheros y directorios, debemos asegurarnos de que el usuario www-data o los miembros del grupo www-data tienen acceso.

En nuestro caso nos dicen que marinapg debe ser la única que pueda acceder para realizar operaciones de lectura y escritura, por tanto vamos a echar un vistazo a los permisos del directorio sistemas.

Según estos permisos el propietario tanto del directorio como de su contenido es el único que puede escribir, por tanto si cambiamos el propietario al directorio y todo su contenido, habremos solucionado el problema del webmaster.

* SPOILER! – Vamos a meter la pata a posta, deberíamos cambiar el propietario y el grupo, pero lo vamos a hacer así para ver los efectos de este error.

Si accedemos desde un navegador funcionará

Ahora debemos evitar que otros usuarios puedan ver el contenido del sitio web de sistemas.

Con esta configuración, ahora mismo, apache2 no podrá acceder a las páginas web que estén dentro de sistemas. Según los permisos solo el propietario, marinapg, y el grupo, que ahora mismo es root, podrán acceder al directorio.

Si intentamos acceder desde cualqueir navegador con cualquier usuario no se puede acceder

Es el servidor el que no puede acceder al recurso, por los permisos del directorio.

La solución, darle permiso, para ello tan solo tenemos que cambiar el grupo. Podemos cambiar el grupo solo al directorio o al directorio y todo su contenido. Dependerá de cada caso concreto. En este caso nos da igual.

Ahora si, apache2 podrá accdeder con su usuario, que pertenece al grupo www-data, al directorio sistemas.

Ejercicio 5 – Búscate la vida

Nos gustaría que por defecto todos los usuarios de nuestro sistema tengan una página web personal. Dicha página web estará almacenada dentro de su directorio personal con un nombre concreto, por ejemplo public_html.

Deberás configurar apache2 para que esto funcione. Busca información en Internet. También deberás configurar los directorios personales de los usuarios, no estaría mal que crearas un script.

Solución

Apache2 tiene un módulo que permite la funcionalidad que estamos buscando. En concreto este módulo se llama userdir.

¿Qué es un módulo?. Un módulo es un pequeño programa que aumenta la funcionalidad de apache2. Es como un plugin.

Para habilitar un módulo tenemos que usar el comando a2enmod seguido del nombre del módulo a habilitar.

Una vez habilitado, nos indica que debemos reiniciar el servidor apache2. Para ello tenemos que ejecutar systemctl restart apache2.

Vamos a echar un vistazo al fichero de configuración del módulo userdir

Según la configuración, hacemos un acto de fe, el directorio dónde se guardará el sitio web personal de cada usuario se llama public_html.

Es decir, que si el usuario alumno, el que estamos usando, quiere tener su propio página web tan solo tiene que crearun directorio llamado public_html dentro de su directorio personal. Dentro de dicho directorio, estaría bien crear una página de índice.

Para acceder a la página personal de un usuario hay que utilizar la siguiente URL.

URL: http://DirecciónHOST/~usuario

Dónde: DireccionHOST es la dirección de la máquina o equipo dónde esté el servidor Web.

Usuario. Es el nombre del usuario que debe ir precedido por ~.

OOOOOOH!!!! Puede ser que apache2 no tenga permiso de acceso.

Ahora le damos permiso de acceso y lectura al grupo.

Vamos a probar de nuevo.

¿Qué pasa con el resto de usuarios?

Tendremos que:

  1. Configurar sus directorios personales
  2. Crear si no existe el directorio public_html en los directorios personales de los usuarios.
  3. Crear una página de índice base en cada directorio public_html
  4. Configurar los permisos para que puedan gestionarlos.

Todo esto se podría haber automatizado habiendo creado un directorio public_html dentro del directorio /etc/skel. De hecho, deberíamos hacerlo para que las nuevas cuentas de usuarios que se creen en el sistema cuenten con un sitio web base de forma incial. No obstante, para los directorios personales de los usuarios que ya existían, habrá que llevar a cabo este proceso de forma manual o, mejor todavía, con un script.

Paso 1. Configurando el directorio /etc/skel

Sabemos que el directorio /etc/skel guarda el esqueleto base con el que se crearán los directorios personales de los usuarios del sistema cuando los creamos con adduser.

Lo que hacemos es crear el directorio public_html dentro de dicho directorio esqueleto.

El directorio public_html está vacío, lo acabamos de crear. Estaría bien que tuviera una página html de índice, index.html, que el usuario pudiera modificar a su antojo. Así no parte de cero.

Vamos a aprovechar un index.html que hemos creado previamente para modificarlo y hacerlo genérico.

Ahora copiamos el fichero de índice para que esté dentro de public_html que está dentro de /etc/skel

Vamos a probar que funciona correctamente. Para ello, vamos a añadir una nueva cuenta de usuario: javiergp.

Ahora vamos a ver el contenido del directorio personal del usuario javiergp.

Vamos a intentar acceder a la página personal del usuario javiergp.

Apache puede acceder al sitio web personal de javiergp porque:

  1. Existe el directorio public_html y dentro hay una página web de índice: index.html.
  2. Los permisos del directorio personal del usuario permiten el acceso a otros, entre los que está el usuario de apache2 www-data.

Paso 2. Configurando los directorios personales de los usuarios

Sabemos que, para que un usuario tenga un sitio web personal, debe contar con el directorio public_html dentro de su directorio personal y con, al menos, una página de índice index.html dentro del directorio public_html.

Vamos a ver cómo haríamos el proceso como operadores humanos y después vamos a tratar de crear un script que lleve a cabo esta tarea para cada usuario del sistema.

Lo primero que comprobaría, como administrador humano, es si existe el directorio public_html en el directorio personal del usuario. Vamos a elegir un usuario concreto, por ejemplo, marinapg.

¿Cúal es la ruta del directorio personal del usuario marinapg?. No lo se! ¿Dónde puedo verlo?.

Como humano, veo el campo número 6 de la línea de configuración de la cuenta de usuario de marinapg. La ruta del directorio personal es /home/marinapg.

Vamos a comprobar si existe el directorio /home/marinapg/public_html.

Esto me recuerda, que tengo que cambiar los permisos de acceso para que apache, www-data, pueda acceder.

Si no existe el directorio, entonces lo creamos y dentro creamos un fichero de índice genérico. Pero… eso ya lo tenemos hecho! está en /etc/skel. Así que nos aprevechamos. Si no existe, entonces copiamos el directorio /etc/skel y todo su contenido al directorio /home/marinapg.

Vamos a comprobar que se ha copiado el directorio con su contenido.

Los permisos me están indicando que el sitio web personal del usuario marinapg pertecene a root y al grupo root. Tenemos que hacerlo accesible a apache2 y que lo pueda gestionar el usuario marinapg. Así que tendremos que cambiar propietario y grupo.

Con esto, parece que debería funcionar, y sin embargo…

Tenemos un problema con los permisos. Estamos totalmente seguros de que al directorio /home/marinapg/public_html y todo su contenido apache2 tiene permiso de acceso.

Tenemos que estar seguros de que puede acceder por toda la ruta de directorios que llevan a /home/marinapg/public_html.

Aquí lo lógico sería cambiar el grupo a www-data y proporcionar permiso de acceso y lectura al grupo. Así garantizamos que solo apache2 podrá acceder para realizar operaciones de lectura dentro del directorio personal del usuario marinapg. Marinapg, que es la propietaria, además podrá realizar operaciones de lectura y escritura.

Ahora debería funcionar!

Ahora tenemos que utilizar todos estos pasos en un script. Para cada usuario del sistema, que son aquellos que usan /bin/bash como shell, menos root si no existe directorio public_html en su directorio personal lo creamos copiándolo de /etc/skel, configuramos permisos de acceso a dicho directorio y al directorio personal del usuario para que apache2 tenga acceso y el usuario tenga permisos de gestión de lectura y escritura.

Soluciones propuestas

Solución 01

Solución 02

Solución 03

Ejercicio 06

Resulta que hemos cambiado de opinión, el directorio public_html no nos gusta, ahora queremos que se llame «web».

Deberás cambiar el nombre del directorio public_html tanto en el esqueleto como en cada uno de los directorios personales de los usuarios del sistema que lo tengan.

Por último, y esto lo tienes que hacer manualmente fuera del script, deberás modificar el fichero de configuración del módulo userdir y reiniciar apache.

Vamos a crear el script que cambia el nombre del directorio public_html, si existe en los directorios personales de los usuarios, por el nuevo nombre de directorio «web».

Para cada usuario del sistema tendremos que comprobar si existe el directorio public_html en su directorio personal, si existe entonces lo renombramos.

Además, nos damos cuenta de que en el directorio /etc/skel también está el directorio public_html, que también tendremos que renombrar.

Esta es la primera versión del script:

Vamos a hacer una pequeña mejora. Realmente el dato que utilizamos en el bucle es la ruta del directorio personal de cada usuario del sistema, así que vamos a recorrer la lista de los directorios personales de los usuarios del sistema.

Si nos fijamos hay muchas similitudes en las líneas que comprueban y cambian el nombre del directorio.

Vamos a crear una función

Ahora debemos cambiar la configuraci´ón del módulo userdir. Para ello editamos el fichero de configuración que está en el directorio de configuración de apache2, dentro del directorio modules-available.

Deja un comentario

Tema creado por Anders Norén