-Configuración del servidor
Comando para compilar el servidor web:
/usr/sbin/apache2 -f /usr/lab/alum/0406552/http/httpd/[Link]
[Link] tu cuenta, descargando los archivos necesarios en ella y
creando la siguiente estructura de directorios, donde d indica que se trata
de un directorio o carpeta y f de un fichero:
Creamos en nuestra máquina Linux una carpeta (directorio) httpd y dentro de esta todo lo que
se nos indica en este apartado, creando así la estructura de directorios.
2. A continuación, modificaremos ciertas directivas para que apunten a
ficheros en nuestra cuenta y para determinar ciertos parámetros de
ejecución. Abre [Link] y cambia las directivas.
-ServerRoot:
-Listen:
En realidad, coger los últimos tres dígitos de nuestra dirección IP es orientativo, con coger un
puerto que no esté restringido es suficiente.
-ServerName:
[Link] una página web sencilla [Link] en
httpd/defaultdocs, por ejemplo:
En la carpeta (directorio) “defaultdocs” creamos un fichero html y añadimos las líneas que nos
dicen:
[Link] podemos arrancar nuestro servidor indicando el fichero de
configuración que hemos adaptado. Se hace con el comando:
Arrancamos el servidor con el comando:
Comprobamos que tenemos el hijo, es decir, el servidor está ejecutándose:
En el directorio “log” se crean los ficheros [Link] y [Link]:
Vemos que aparece el [Link]:
5. Accede a la página recién creada ([Link]) a través del navegador en
la URL [Link] Intenta acceder también
usando simplemente [Link]
Buscando en la misma máquina Linux desde un navegador la página, poniendo
“[Link] y obtenemos como resultado lo siguiente en el
navegador:
Viendo el fichero de “[Link]” se puede observar la petición HTTP que se realizó al servidor:
Ahora probando con “[Link]
No encuentra la página ya que no se está especificando el fichero [Link]. Lo que devuelve
es la página por defecto asignada del servidor. Pero no hay ninguna página por defecto creada.
En la directiva “DirectoryIndex” está establecida como página por defecto el fichero
“[Link]” pero este fichero no se ha creado en nuestro servidor aún.
Viendo el fichero “[Link]” vemos que se hizo una petición por la página principal del
servidor:
Comprobamos la directiva DirectoryIndex:
-Peticiones y respuestas HTTP.
6. Haz las peticiones realizadas anteriormente con el navegador
[Link] y
[Link] usando telnet
Primero nos conectamos al servidor web de alojado en nuestra máquina con el comando telnet:
Después hacemos una petición HTTP para obtener el recurso [Link] del servidor web:
-Petición a [Link]
El servidor nos devuelve la página html que solicitamos y cerró la conexión, lo que significa que
no está usando HTTP/1.1 en la petición y en la respuesta.
-Petición a [Link]
Vemos que nos devuelve el mismo resultado que en el apartado anterior al preguntar por la
página por defecto.
7. Repite las peticiones usando HTTP/1.1 ¿Qué cabecera debes incluir en
la petición? ¿cierra el servidor la conexión inmediatamente? ¿qué se debe
incluir en la petición para que lo haga? Pruébalo.
Al usar HTTP/1.1, en la petición se tiene que incluir la cabecera obligatoria de HOST. Esta
cabecera se usa para informar al servidor de a qué máquina se pretende conectar el cliente en
el caso de que una misma máquina (con misma dirección IP) sirva varios webs (hosts virtuales)
La conexión no se cerrará cuando obtengamos la respuesta del servidor, porque HTTP/1.1 tiene
conexiones persistentes, es decir, no se hace una conexión por recurso como en HTTP/1.0 Y
HTTP/0.9, sino que se mantiene abierta hasta que el cliente desee cerrarla.
-Petición a [Link]
Se observa que la conexión se queda abierta al recibir la respuesta del servidor.
Para que se cierre la conexión con el servidor el cliente debe incluir la cabecera Connection:
close en la petición del mensaje para que la conexión se cierre al recibir la respuesta del servidor:
-Petición a [Link]
Ocurre lo mismo que en los apartados anteriores: “NOT FOUND”
8. Aún si no manda nada en la petición HTTP/1.1 para que cierre la
conexión de forma inmediata, el servidor lo hace tras un tiempo de
inactividad. Mide cuánto es este tiempo y comprueba que coincide con el
que viene especificado en la directiva KeepAliveTimeout.
Para medir el tiempo que tarda en cerrarse la conexión se puede usar el cronómetro del móvil.
Se obtiene que tarda en cerrar la conexión por inactividad aproximadamente 15 segundos.
Ahora comprobamos el valor de la directiva KeepAliveTimeout en el fichero [Link]
Tiene un valor establecido de 15 segundos
9. Mira el fichero [Link] y explica para qué sirven las directivas
KeepAlive y MaxKeepAliveRequests.
Notar que encima de cada directiva viene una explicación sobre esta.
-La directiva KeepAlive On es la que permite establecer conexiones persistentes, si esta directiva
la ponemos a OFF ya no se podrían establecer conexiones persistentes. Es decir, permitir más
de una petición o no por conexión
-La directiva MaxKeepAliveRequests establece el máximo número de peticiones que se
permiten en una conexión persistente, es decir, el máximo número de peticiones que un cliente
puede hacer antes de que la conexión se cierre. Si se establece a 0 esta directiva significa que se
permiten infinitas peticiones.
-Matar el proceso del servidor ([Link])
Primero hay que buscar los procesos que ejecuta [Link] con el comando “ps aux | grep
apache”:
Seleccionamos el pid del primer proceso que sale y lo matamos con el comando “kill”
Si volvemos a ver la carpeta donde se creaba el “[Link]” veremos que ya no está.
- Procesos y recursos en el servidor web
10. Mira cuántos procesos se están ejecutando. Para ello ejecuta el
comando ps -x. Este número se puede controlar con la directiva
StartServers. El servidor arranca inicialmente este número de procesos
hijo para atender tráfico, aunque arranca y para dinámicamente nuevos
procesos hijo según lo necesita (el número máximo se controla con la
directiva MaxClients, ver también MinSpareServers y MaxSpareServers).
Ejecutando el comando “px -x” vemos los procesos del servidor web que se están ejecutando:
En total hay 6 procesos, teniendo en cuenta que 1 es el proceso padre entonces hay 5 procesos
hijos
Mirando la directiva StartServers vemos que coincide con el número de procesos hijos que se
crean al principio (al ejecutar el servidor)
-Cambiando la configuración para que arranque con 8 procesos hijos por defecto tenemos que
modificar el valor de la directiva StartSevers y ponerlo a 8:
Ahora se arranca el servidor web con 8 procesos hijos ( en total 9 procesos si contamos el
proceso padre):
-Gestión de "Logs"
11. El registro de errores está en el fichero indicado por la directiva
ErrorLog. Con la directiva LogLevel se puede variar el nivel de detalle del
registro. Observa el fichero de registro de errores y aumenta el nivel de
detalle a "debug", arranca de nuevo el servidor y comprueba cómo para
el mismo tipo de peticiones se almacena un mayor número de registros.
Lo que teníamos en el fichero “[Link]” antes de modificar la directiva LogLevel:
Modificamos la directiva LogLevel, ponemos el modo debug:
Lo que tenemos en el fichero “[Link]” después de modificar la directiva LogLevel:
12. La directiva CustomLog nos indica el fichero donde se va a guardar
registro de los accesos a nuestro web. Examina el fichero de registro de
accesos. Como ves, se identifica a las máquinas únicamente por su IP.
Averigua qué directiva de [Link] tienes que cambiar para conseguir
que en el registro de accesos aparezca el nombre de la máquina
("hostname") en lugar de la IP. Haz el cambio y comprueba que funciona.
Lo que teníamos en el fichero “[Link]” antes de modificar la directiva CustomLog:
Para que salga el nombre de la máquina (hostname) hay que modificar la directiva
HostnamesLookups, en nuestro caso esta directiva venía con el valor de OFF, hay que ponerla
con el valor de ON:
La directiva CustomLog no es necesario tocarla, el párametro %h en LogFormat devuelve el
hostname (nombre de la máquina que hizo la petición) si la directiva HostnamesLookups está
en ON:
- Tipos de contenido en Apache
13. Crea una copia del fichero [Link] con nombre [Link] y cambia
la directiva para que [Link] sea el fichero que se envía por defecto.
Realiza las peticiones a [Link] con un
navegador y con telnet ¿Cómo ves el fichero en el navegador? ¿cuál es el
tipo MIME con él que se nos envía el fichero? ¿por qué?
El tipo de MIME que nos devuelve el servidor es una cabecera opcional de la respuesta del
servidor:
La directiva que hay que cambiar para que “[Link]” sea el fichero que se envía por defecto
es DirtectoryIndex:
Cambiamos [Link] por a [Link]
Tener en cuenta que la directiva DocumentRoot sirve para establecer una carpeta/directorio
por defecto:
El problema antes que en este directorio no existía el fichero por defecto [Link] que estaba
en la directiva DirtectoryIndex. Por ese motivo al hacer “GET /” obteníamos un error.
Ahora al hacer “GET /” nos devuelve la página que pusimos por defecto:
Por defecto el tipo de MIME, si no se puede especificar el tipo de MIME que es como en el
caso de [Link] que devuelve un ContentType: text/html, está establecido como text/plain
en la directiva DefaultType:
Tener en cuenta que como no se especificó el Content-type cuando se trata de un fichero
.aptel se devuelve el MIME por defecto establecido.
14. Cambia la configuración para que cuando la extensión sea "aptel"
devuelva el tipo MIME application/x-type-aptel. Comprueba que funciona
correctamente ¿Qué hace ahora el navegador web? Prueba con varios
navegadores, [Link]., Chrome y Firefox.
Enlace a página web que explica las directivas relacionadas con MIME:
[Link]
En la directiva TypesConfig añadimos la extensión que nos piden con un AddType:
Ahora si hacemos una petición HTTP al recurso de [Link] obtenemos el tipo de MIME que le
especificamos en la directiva:
Con el navegador Chrome se obtiene lo siguiente:
-Gestión de Directorios y seguridad
Añadimos el código que nos dan:
15. Crea el directorio DOCUMENT_ROOT/internal (dentro de tu
carpeta especificada en la directiva DocumentRoot, defaultdocs) y
copia en él el fichero [Link]. Recuerda añadir este nombre de
fichero a los ficheros que se envía por defecto. ¿Qué pasa ahora cuando
intentas acceder con un navegador a la URL
[Link]
Tenemos que cambiar el fichero por defecto a “[Link]”:
En el navegador obtengo al buscar [Link]
Me devuelve como fichero por defecto el fichero [Link] del directorio “internal”
16. Deberás generar el fichero de passwords
(DOCUMENT_ROOT/passwd), que se puede hacer con la utilidad
htpasswd. Crea con esta utilidad un fichero con un usuario aptel y
contraseña redes. Prueba a entrar con este usuario y password usando un
navegador web.