Práctica 1 - Instalación y configuración de las aplicaciones

1. Objetivos

El objetivo de esta práctica es aprender a instalar y configurar un servidor con servicio Web, en concreto el de Apache. También instalaremos un servidor de base de datos MySQL y un módulo de PHP para Apache con soporte para MySQL. Además en la parte final nos familiarizaremos con la configuración del servidor web Apache. Este programa dispone de un gran número de opciones de configuración. Veremos algunas de ellas y a medida que otras hagan falta se presentarán en las siguientes prácticas.

2. Introducción

En el Laboratorio de Telemática 2 (primera planta del mismo edificio) emplearemos cualquier máquina.

Los programas que vamos a instalar en esta práctica son:

  • Apache 2.0.54: El fichero a instalar es /opt3/lir/ficheros/httpd-2.0.54.tar.gz
  • PHP 5.0.4: Fichero /opt3/lir/ficheros/php-5.0.4.tar.gz
  • MySQL 5.0.45: Fichero /opt3/lir/ficheros/mysql-5.0.45.tar.gz

Generalmente existen versiones pre-compiladas de estos programas para diferentes sistemas operativos y microprocesadores y una solución fácil y rápida es descargarse la adecuada e instalarla mediante el sistema que disponga el sistema operativo (.rpm, .pkg, .deb, etc). Sin embargo en esta práctica vamos a compilar los programas a partir de sus códigos fuente porque esto nos ofrece una mayor flexibilidad a la hora de escoger qué incluir en ellos de las numerosas opciones que ofrecen.

Para ahorrar tiempo hemos descargado ya unas de las últimas versiones de estos programas y se han dejado disponibles en los directorios mencionados. En cualquier caso, lo único que hay que hacer para obtenerlas es dirigirse a sus sitios web y descargarlas dado que son todas software abierto (http://www.apache.org, http://www.php.net, http://www.mysql.com). Para que no haya problemas para seguir las instrucciones presentes en los guiones de prácticas por favor empleen los fichero ya descargados.

Lo primero que hay que hacer es descomprimir los ficheros en el directorio /tmp local de nuestra máquina (aunque vayamos a instalar en nuestra cuenta). Para ello pueden utilizar gzip y tar o simplemente tar. Si no sabe emplear estas herramientas consulte las correspondientes páginas del manual en línea. Por ejemplo podemos hacer:

[1]%> cp /opt3/lir/ficheros/httpd-2.0.54.tar.gz /tmp
[2]%> cd /tmp
[3]%> gzip -d httpd-2.0.54.tar.gz

Para descomprimir (opción -d) el fichero httpd-2.0.54.tar.gz, con lo que nos quedará el fichero httpd-2.0.54.tar y ahora para sacar los ficheros del tarball basta con hacer:

[4]%> tar xvf httpd-2.0.54.tar

Donde la opción x significa extraer, la opción f es porque le vamos a dar un fichero de entrada y la opción v hace que nos vaya diciendo cómo evoluciona el programa extrayendo los ficheros.
Con una versión suficientemente moderna del programa tar se pueden hacer ambos pasos en uno añadiendo la opción z al tar, es decir, podría haberse ejecutado:

[5]%> tar xzvf httpd-2.0.54.tar.gz

Llegado este punto tendremos un directorio llamado httpd-2.0.54 donde se encuentran las fuentes del programa Apache. Parte de las explicaciones sobre cómo instalar Apache están extraídas de la documentación del mismo (versión 2.0) que se puede encontrar en http://httpd.apache.org/docs-2.0/.

En esta práctica también les será muy útil el manual del Apache que pueden encontrar en la página web de la asignatura o en su propia instalación del Apache. Las referencias a secciones de la documentación se harán con URLs a la página de la asignatura pero pueden visitar cualquier otra copia de la documentación.

3. Instalación de Apache 2.0.54

A. Sobre los módulos

Apache es un servidor modular. Esto quiere decir que acepta añadirle funcionalidades a través de módulos sin necesidad de recompilar el servidor. Solo las funcionalidades básicas suelen estar incluidas en el programa del servidor. Durante la compilación del servidor se puede escoger qué módulos queremos que se compilen para emplear con el mismo. Además, estos módulos podrían incluirse dentro del propio ejecutable del servidor o, si el sistema operativo soporta cargar módulos de forma dinámica (módulos DSO), pueden ser compilados como ficheros separados .so para ser cargados cuando se requieran. Podemos especificar qué módulos cargar dinámicamente de los compilados mediante directrices en el fichero de configuración del Apache. Un módulo que siempre estará incluido en Apache será el mod_so que es precisamente el que se encarga de la carga de módulos de forma dinámica (más información en http://httpd.apache.org/docs-2.0/en/dso.html)

Podemos compilar los módulos bien cuando compilamos el programa httpd (el nombre del ejecutable del Apache) o los podemos compilar posteriormente uno a uno cuando decidamos añadirlos. En esta práctica vamos a compilar el servidor Apache con unos módulos básicos y con soporte para posteriormente cargar otros (es decir, con el módulo mod_so).

B. Configurar

Primero debemos seleccionar las opciones en concreto que queremos que se apliquen cuando compilemos el servidor. En esta etapa es cuando especificaríamos los módulos a compilar. Esto se hace mediante el script configure que se encuentra en el directorio httpd-2.0.54. Este script acepta un gran número de opciones según cómo queramos compilar el Apache. Podemos ver estas opciones ejecutando:

[6]%> cd httpd-2.0.54
[7]%> ./configure --help

Echen una ojeada a las opciones disponibles. Puede que llegado al momento alguna nos sea útil.

Vamos a emplear ahora solo dos de ellas:

  • --enable-so para incluir el módulo que permite cargar otros de forma dinámica
  • --prefix para especificar dónde queremos que se instale el software del servidor

Así pues, podemos ejecutar algo como:

[8]%> ./configure --enable-so --prefix="/opt3/lir/lirXY/apache"

Donde lirXY debe sustituirse por su número de grupo de forma que especificamos un directorio de instalación dentro del HOME del grupo de prácticas. No hace falta que creemos el directorio apache, el proceso de instalación lo creará por nosotros.

Cuestiones:
Si no especificáramos el directorio donde debe instalarse, ¿en dónde se instalaría Apache?
¿Puede usted instalar en ese directorio? ¿Por qué?

C. Compilar

El script configure, si se ha completado con éxito, habrá preparado los ficheros Makefile necesarios para compilar el programa con las opciones que le hayamos indicado. Ahora solo debemos hacer:

[9]%> make

Y esperar... (aproveche el tiempo para seguir leyendo)

D. Instalar

Solo queda instalar el software compilado, y no puede ser más simple que hacer:

[10]%> make install

El resultado será una estructura de directorios bajo /opt3/lir/lirXY/apache con el servidor Apache y otros programas y scripts asociados. Debería tener un aspecto como:

[11]%> ls /opt3/lir/lirXY/apache
bin cgi-bin error icons lib man modules
build conf htdocs include logs manual

Y con esto ya hemos compilado el servidor de Web Apache.

Podemos comprobar los módulos que se han incluido en el ejecutable lanzándolo con la opción -l. El ejecutable httpd se encuentra en www/bin

[12]%> /opt3/lir/lirXY/apache/bin/httpd -l
Compiled-in modules:
core.c
mod_access.c
mod_auth.c
...

A continuación borren el directorio (si no se acuerdan miren en la ayuda del comando 'rm') con las fuentes del Apache (ocupa mucho espacio en disco) y el .tar.gz.

4. Instalación de MySQL 5.0.45

Vamos a ver que la instalación de MySQL sigue unos pasos muy similares y tampoco entraña ninguna complicación (http://dev.mysql.com/doc/refman/5.0/en/installing-source.html).

Descomprima el fichero con las fuentes de MySQL de forma análoga a como descomprimió el de Apache. Con eso debería tener un directorio mysql-5.0.45 con las fuentes.

A. Configurar

MySQL dispone también de un script configure. Primero empleamos la opcion --help para familiarizarnos con las opciones disponibles. Vamos a emplear una configuración sin embargo muy sencilla:

[13]%> cd /tmp/mysql-5.0.45
[14]%> ./configure --prefix=/opt3/lir/lirXY/mysql

Donde simplemente indicamos el directorio donde queremos que se instale el software y el resto de las opciones son las que estén por defecto.

B. Compilar

No tiene más complicación que hacer:

[15]%> make

Es un proceso muy-muy lento, no se desesperen y aprovechen para leer el resto del guión mientras compila.

C. Instalar

Finalmente:

[16]%> make install

El directorio /lir/mysql contendrá algo como:

[17]%> ls /opt3/lir/lirXY/mysql
bin include info lib libexec man mysql-test share sql-bench

A continuación borren el directorio con las fuentes de MySQL (ocupa mucho espacio en disco) y el .tar.gz.

5. Instalacion de PHP 5.0.4

Vamos a compilar un módulo de PHP para Apache, con soporte para conectarse a un servidor de base de datos MySQL. Podemos encontrar la documentacion sobre PHP en http://www.php.net/docs.php.

A. Configurar

De nuevo nos encontramos con un configure. Las opciones que vamos a utilizar son las siguientes:

  • --prefix="directorio donde instalar"
  • --with-apxs2="path al ejecutable apxs" Aquí debemos indicar el directorio donde está el programa apxs2. Éste es un programa que instala Apache en su directorio bin. El programa sirve para compilar ficheros fuente en C con las opciones correctas para que el resultado sea un modulo que Apache pueda emplear. Así que PHP necesita saber dónde está este programa para compilar el modulo de PHP que va a crear para Apache. Dado que estamos compilando para Apache 2.x empleamos --with-apxs2 (para más información en http://httpd.apache.org/docs-2.0/programs/apxs.html)
  • --with-mysql="directorio base de mysql" Aquí le vamos a indicar dónde tenemos instalado MySQL para que utilice la librería que hemos compilado con anterioridad.

En nuestro caso vamos a ejecutar:

[18]%> cd /tmp/php-5.0.4
[19]%> ./configure --prefix=/opt3/lir/lirXY/php
--with-apxs2=/opt3/lir/lirXY/apache/bin/apxs
--with-mysql=/opt3/lir/lirXY/mysql
Cuestiones:
Si quisiéramos compilar el módulo para Apache 1.x qué cambiaría en las opciones para el configure?

B. Compilar

Ahora solo tenemos que compilar:

[20]%> make

C. Instalar

Y finalmente instalar:

[21]%> make install

De nuevo borre las fuentes para ahorrar espacio

6. Probando el Apache

A continuación lo primero que vamos a hacer es comprobar que la instalación de Apache funciona correctamente. Para ello vamos a lanzarlo y solicitarle alguna página HTML de prueba.

Si lanzáramos el Apache ahora mismo éste emplearía la configuración por defecto que incluye emplear el puerto 80 para ejercer sus funciones de servidor Web en el puerto reservado a tal efecto. En máquinas con sistema operativo de tipo UNIX, el rango de puertos bien conocidos (well-known ports) está controlado, de forma que sólo el administrador (root) puede lanzar programas que actúen como servidor sobre uno de esos puertos. Así que si deseásemos lanzar Apache sobre el puerto 80 necesitaríamos privilegios de superusuario.

Dado que no disponemos de privilegios de superusuario lo que vamos a hacer es configurar el Apache para que emplee otro puerto como servidor, uno fuera del rango de reservados y que no se esté empleando. Para ello tenemos que realizar una simple modificación en el fichero de configuración del Apache.

A. httpd.conf

A lo largo de las diferentes versiones de Apache los ficheros de configuración han cambiado un poco su ubicación y la forma de repartir las directrices de configuración entre un fichero o varios. Se pueden crear varios ficheros de configuración para Apache y luego incluirlos en el principal (como con un #include de C). Incluso podemos especificar el fichero de configuración que debe emplear cuando lo lanzamos (con la opción -f). Por simplicidad vamos a emplear un solo fichero de configuración, el que emplea por defecto, llamado httpd.conf y que el programa busca al arrancar en el directorio /opt3/lir/lirXY/apache/conf/

i) Sintaxis del fichero de configuración

El fichero de configuración es texto simple. Contiene directrices que entiende Apache o alguno de los módulos que tenga instalados. Se emplea una directriz por línea y podemos incluir líneas de comentario comenzándolas con el carácter "#".

Se puede comprobar si se ha escrito el fichero sin errores de sintaxis ejecutando apachectl configtest. Este programa se encuentra en el directorio /opt3/lir/lirXY/apache/bin/

ii) Directriz Listen

Con la directriz Listen podemos especificar el puerto que va a emplear el servidor. A partir de Apache 2.0 ésta es una directriz obligatoria. Lo único que hemos de hacer es buscarla en el fichero de configuración y cambiar el valor de puerto por otro fuera del rango de reservados. Por ejemplo lo podemos cambiar por:

Listen 8080
Cuestiones:
Cuál es el valor máximo de puerto que se podría especificar?
Podríamos tener dos programas httpd ejecutándose al mismo tiempo en la misma máquina (la cual tiene una sola dirección IP)? Cómo?

B. Lanzando Apache

Podemos lanzar el servidor Apache simplemente ejecutando el programa httpd. Sin embargo, es mucho más cómodo emplear un script preparado para lanzarlo correctamente. Este script es el apachectl que se encuentra en el directorio /opt3/lir/lirXY/apache/bin/. El script lanzará el servidor, el cual crea varios procesos para atender a las peticiones de los clientes.

Lanzamos Apache:

[22]%> /opt3/lir/lirXY/apache/bin/apachectl start
Podemos ver los procesos que quedan corriendo en la máquina como demonios:
[234]%> ps ax | grep httpd
29635 ? S 0:00 /opt3/lir/lirXY/apache/bin/httpd -k start
29636 ? S 0:00 /opt3/lir/lirXY/apache/bin/httpd -k start
29637 ? S 0:00 /opt3/lir/lirXY/apache/bin/httpd -k start
29638 ? S 0:00 /opt3/lir/lirXY/apache/bin/httpd -k start
29639 ? S 0:00 /opt3/lir/lirXY/apache/bin/httpd -k start
29640 ? S 0:00 /opt3/lir/lirXY/apache/bin/httpd -k start
29641 ? S 0:00 /opt3/lir/lirXY/apache/bin/httpd -k start

Donde los primeros procesos son el servidor web que ya tenía corriendo la máquina y los restantes son el que acabamos de lanzar.

C. Probando

Ahora lo si solicitamos una página web a la máquina en la que nos encontramos debería mostrarnos la página por defecto que trae el servidor. Para ello escriba en un navegador la siguiente dirección: http://localhost:8080

Cuestiones:
Pruebe a solicitar la página por defecto desde otra máquina del laboratorio. Recuerde que localhost hace referencia a la máquina local en la que se está ejecutando el programa, en este caso el navegador, así que no puede emplear el URI anterior.
Si tiene configurado un proxy en el navegador Web le recomienzo que le indique al navegador que no use el proxy para las conexiones con máquinas dentro del dominio net.tlm.unavarra.es , para ello, en la sección de preferencias avanzadas de un Netscape o Mozilla, en la subsección de Proxies añada a "No Proxy for" algo como .net.tlm.unavarra.es para que cuando intente acceder a una máquina en una máquina cuyo nombre de dominio termine así no le haga la solicitud al proxy. Recuerde que los nombre de las máquinas del laboratorio siguen la forma tlmXY.net.tlm.unavarra.es

7. Probando el módulo de PHP

A continuación vamos a comprobar que hemos añadido correctamente el módulo de PHP a Apache.

A. Configuración necesaria para Apache

Hay dos directrices necesarias en el fichero de configuración de Apache httpd.conf para que emplee el módulo PHP y reconozca las páginas PHP.
En primer lugar debemos decirle que cargue el módulo de PHP. Cargar módulos se realiza con la directriz LoadModule. Esta directriz es procesada por el módulo mod_so. Su sintaxis es la siguiente:

LoadModule nombre_del_modulo fichero_del_modulo

En nuestro caso debemos tener la siguiente línea en el fichero de configuración:

LoadModule php5_module modules/libphp5.so

Como podemos ver el último argumento incluye el path para llegar al fichero desde el directorio donde se instaló el Apache. Probablemente esta línea ya aparezca en el fichero httpd.conf

Lo segundo que debemos modificar en la configuración del Apache es indicarle cómo reconocer los ficheros que contienen código PHP. Lo normal para esto es emplear la extensión del fichero de forma que cuando el servidor vaya a servir un fichero con esa extensión lo reconozca como un fichero con código PHP y lo procese a través del módulo de PHP. La extensión típica es .php aunque ha habido otras como .php3.
La forma de configurar esto es indicándole al servidor un nuevo tipo MIME asociado a la extensión que hayamos escogido. El tipo MIME para los ficheros PHP debe ser: application/x-httpd-php y la forma que tenemos de declararlos en el fichero de configuración es mediante la directriz AddType.
La sitanxis de AddType es:

AddType MIME_type extension

Donde podemos poner varias extensiones que asociar al mismo tipo MIME La línea que debemos incluir será simplemente:

AddType application/x-httpd-php .php

Reiniciamos el servidor apache para que cargue la nueva configuración.

[24]%> /opt3/lir/lirXY/apache/bin/apachectl restart

B. Configuración necesaria para PHP

Hay una directiva de PHP que hay que establecer en el fichero de configuración de PHP php.ini para que funcione de la manera óptima. Hay que decirle que no use magic quotes, ni que use register globales;. Para esto es suficiente que en opt3/lir/lirXY/php/php.ini introduzcamos:

magic_quotes_gpc = Off
register_globals = Off

Nota: si el fichero no existe, hay que crearlo.

C. Página PHP de prueba

Creamos un fichero llamado prueba.php en el directorio /opt3/lir/lirXY/apache/htdocs con el siguiente código:

	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Ejemplo</title>
</head>
<body>
Si despues de esta linea no ves nada es que PHP no funciona<br>
<?php
echo "Vaya, pues funciona!";
?>
</body>
</html>

Y solicitamos esa página desde un navegador poniendo el siguiente URI: http://localhost:8080/prueba.php
El resultado debe ser el siguiente, si no tenemos algún error:

Si despues de esta linea no ves nada es que PHP no funciona
Vaya, pues funciona!

8. Probando la instalación de MySQL

Ahora vamos a comprobar que hemos instalado correctamente MySQL y para ello vamos a arrancar el servidor de base de datos que incluye.

A. Pasos previos

Antes de lanzar por primera vez el servidor de base de datos debemos ejeutar un script que termina la configuración necesaria. Este script creará la base de datos en la que se guardan los permisos de acceso que demos a las diferentes bases de datos que se creen, así como información de los usuarios. También se crea una base de datos para pruebas y un usuario inicial (root). Con la opción --datadir le podemos decir dónde queremos tener las bases de datos (las ponemos en nuestro directorio) y con la opción --socket indicamos dónde se creará el socket UNIX para la comunicación local con la base de datos (para cuando no se hace por la red sino en la misma máquina), que también colocamos en el directorio del usuario.

[25]%> cd /opt3/lir/lirXY/mysql/bin
[26]%> ./mysql_install_db --datadir=/opt3/lir/lirXY/mysql/var --socket=/opt3/lir/lirXY/socket.sock

El programa servidor de la base de datos se llama mysqld (la 'd' viene de 'daemon' o 'demonio', igual que en 'httpd'). Hay scripts para lanzarlo pero en estas prácticas vamos a comenzar lanzándolo directamente con el ejecutable:

[27]%> ../libexec/mysqld --datadir=/opt3/lir/lirXY/mysql/var --socket=/opt3/lir/lirXY/mysql/socket.sock &

Ahora podemos comprobar que el servidor está corriendo correctamente empleando el programa mysqladmin que permite realizar algunas tareas de gestión.

[28]%> ˜/mysql/bin/mysqladmin --socket=/opt3/lir/lirXY/mysql/socket.sock -u root version

Deberíamos obtener información sobre el servidor. Como por ejemplo:

bin/mysqladmin  Ver 8.40 Distrib 5.0.45, for pc-linux on i686 Copyright (C) 2000 MySQL AB &
MySQL Finland AB & TCX DataKonsult AB This software comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to modify and redistribute it under the GPL license

Server version 5.0.45
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /opt3/lir/lirXY/mysql/socket.sock
Uptime: 41 sec

Threads: 1 Questions: 1 Slow queries: 0 Opens: 6 Flush tables: 1 Open tables: 0 Queries per second avg: 0.024
Cuestiones:
Averigüe cómo detener el servidor de base de datos con la opción shutdown del comando mysqladmin

El servidor de la base de datos controla los accesos a las mismas mediante un sistema de usuarios y privilegios. Inicialmente existe un usuario llamado root que tiene todos los privilegios posibles y carece de password. No se deben confundir los usuarios de la base de datos con los usuarios de una máquina Unix. Ambos conjuntos de usuarios son independientes. Se emplea el nombre root para ese superusuario por la tradición existente en máquinas Unix pero el usuario root de nuestro servidor de base de datos es independiente del usuario root de la máquina.

Podemos cambiar la password de este usuario empleando el siguiente comando:

[29]%> ./mysqladmin --socket=/opt3/lir/lirXY/mysql/socket.sock -u root password nuevapassword

La instalación de MySQL ofrece un cliente para realizar comandos sobre la base de datos. Este cliente es un programa para la shell llamado mysql:

[30]%> ./mysql --socket=/opt3/lir/lirXY/mysql/socket.sock -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8 to server version: 4.0.21

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

Como se puede ver empleamos la opción -u para especificar el usuario con el que nos queremos conectar a la base de datos y con la opción -p hacemos que nos solicite la password del usuario.

Para salir del programa basta con emplear el comando QUIT:

mysql> quit
Bye

Vamos a comprobar la correcta instalación realizando algunas consultas básicas al servidor.
Primero solicitamos una lista de las bases de datos existentes. Si estamos empleando el usuario root tendremos acceso a ver todas las que hay que al instalar son:

[31]%> ./mysql --socket=/opt3/lir/lirXY/mysql/socket.sock -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13 to server version: 4.0.21

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.00 sec)

mysql> quit
Bye

Las bases de datos mysql y test fueron creadas por el script mysql_install_db. La primera contiene la información referente a los usuarios y sus privilegios de acceso al servidor y por eso solo es visible para el superusuario. La segunda (test) es una base de datos creada para realizar pruebas.

Ahora vamos a conectarnos al servidor y a crear una nueva tabla dentro de la base de datos de pruebas:

[32]%> ./mysql --socket=/opt3/lir/lirXY/mysql/socket.sock -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 18 to server version: 4.0.21

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use test;
Database changed
mysql> create table precios (nombre varchar(50), valor double(6,2));
Query OK, 0 rows affected (0.00 sec)

mysql> describe precios;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| nombre | varchar(50) | YES | | NULL | |
| valor | double(6,2) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert into precios values ("El taxi", 10000);
Query OK, 1 row affected (0.00 sec)

mysql> insert into precios values ("Un duro", .03);
Query OK, 1 row affected (0.01 sec)

mysql> select * from precios;
+---------+----------+
| nombre | valor |
+---------+----------+
| El taxi | 10000.00 |
| Un duro | 0.03 |
+---------+----------+
2 rows in set (0.00 sec)

mysql> quit
Bye

Con el comando use hemos indicado la base de datos con la que queremos trabajar. El comando create sirve para crear una nueva tabla en la base de datos, en este caso el nombre de la tabla es precios y tiene dos columnas: una cadena de 50 caracteres de nombre nombre y un número flotante con presentación de 6 cifras enteras y 2 decimales con nombre valor. Con el comando describe hemos podido ver las columnas de la base de datos que coinciden con lo deseado. A continuación hemos insertado (comando insert por si alguien se lo preguntaba) dos nuevas filas en la tabla: el precio del taxi y el precio de un duro. Finalmente hemos realizado una petición al servidor con SELECT para que nos mostrase todas las entradas de la tabla precios recién creada.

Finalmente, vamos a crear un usuario de la base de datos MySQL (no tiene nada que ver con un usuario UNIX) al que se le permitirá acceder a las tablas de esa base de datos desde cualquier máquina en la red (en este punto vamos a ser bastante permisivos, en prácticas futuras pueden estudiar los privilegios de usuarios y restringir un poco el acceso si lo desean). También vamos a darle permisos al usuario root del servidor de base datos para conectarse mediante TCP siempre que sea desde la máquina local. NOTA: sustituir las palabras laclave y laclavepararoot por los passwords que querais y recordarlos.

[33]%> ./mysql --socket=/opt3/lir/lirXY/mysql/socket.sock -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13 to server version: 4.0.21

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> grant all on test.* to lir@'%' identified by 'laclave';
Query OK, 0 rows affected (0.01 sec)
mysql> grant all on *.* to root@'localhost.localdomain' identified by 'laclavepararoot'; query OK, 0 rows affected (0.01 sec) mysql> quit Bye %> ./mysql -h 127.0.0.1 -u lir -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 13 to server version: 4.0.21 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> show databases; +----------+ | Database | +----------+ | test | +----------+ 1 row in set (0.00 sec) mysql> quit Bye

9. Probando el soporte de MySQL desde PHP

Vamos a comprobar que somos capaces de acceder a la base de datos desde scripts PHP. Para ello crearemos un simple script que se conecte a la base de datos y solicite el contenido de la tabla precios de forma similar a como hicimos anteriormente con el cliente mysql solo que ahora mostrando nosotros el contenido con una tabla HTML.

Creamos un fichero llamado pruebasql.php en el directorio /opt3/lir/lirXY/apache/htdocs/ con el siguiente código:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Probando acceso a MySQL</title>
</head>
<body>
Si despues de esta linea no ves nada es que PHP no funciona<br>
<?php
/* Conectarse empleando un usuario en concreto, como el usuario no existe en la base de datos
estamos empleando el usuario anonimo. */
$link = mysql_connect("127.0.0.1", "lir", "laclave") or die("Fallo al conectar con la base de datos");
print "Conectado<br>";
/* Seleccionar la base de datos a emplear */
mysql_select_db("test") or die("Error al seleccionar la base de datos");
print "Base de datos <tt>test</tt> seleccionada<br>";

/* Realizar una busqueda */ $query = "SELECT * FROM precios"; $result = mysql_query($query) or die("Query failed"); /* Sacar el contenido como una tabla HTML */ print "<table border=1>\n"; while ($line = mysql_fetch_array($result, MYSQL_ASSOC)){
print "\t<tr>\n"; foreach ($line as $col_value){ print "\t\t<td>$col_value</td>\n"; } print "\t</tr>\n"; } print "</table>\n"; ?> </body> </html>

Y solicitamos esa página desde un navegador poniendo el siguiente URI: http://localhost:8080/pruebasql.php
El resultado debe ser el siguiente, si no tenemos algún error:

Si despues de esta linea no ves nada es que PHP no funciona
Conectado
Base de datos test seleccionada
El taxi 10000.00
Un duro 0.03

Checkpoint 1
Muestre al responsable de prácticas que todo le funciona correctamente

10. Ficheros de configuración

Apache se configura colocando directrices en ficheros de configuración, que están formados por simple texto. El fichero principal de configuración se suele llamar httpd.conf y su localización se puede especificar al compilar (opciones del script configure). También se puede ejecutar el servidor httpd con la opción -f lo cual permite especificarle el fichero de configuración a emplear. Además, se pueden añadir otros ficheros empleando la directriz Include. Esta directriz se coloca en el fichero de configuración especificando el nombre de otro fichero de configuración cuyo contenido deseamos que se incluya ahí. Es muy importante tener en cuenta que Apache solo lee el fichero de configuración cuando es lanzado, por lo que cualquier cambio realizado en él requiere pararlo y volverlo a lanzar para que los cambios surtan efecto.

Podemos incluir comentarios en el fichero de configuración comenzando la línea con el carácter #. También podemos comprobar la sintaxis del fichero de configuración lanzando el httpd con la opción -t o empleando apachectl configtest

11. Algunas directrices básicas

Estudie el significado de las siguientes directrices:

  • ServerRoot
  • Listen
  • ServerAdmin
  • ServerName
  • DocumentRoot
  • DirectoryIndex

Puede encontrar todas las directrices en:
http://httpd.apache.org/docs/2.0/mod/directives.html

A continuación:

  • Adapte la configuración de todas esas directrices en su fichero httpd.conf
  • Haga que la dirección de correo de administrador sea la de uno de los miembros del grupo de prácticas
  • Que el servidor espere conexiones al puerto 3128 y al 8080
  • Que sirva los ficheros que se coloquen en /opt3/lir/lirXY/webs
  • Que cuando se solicite un directorio intente primero servir un fichero index.php que esté en el directorio y si no lo encuentra busque un index.html y si no un index.htm

Compruebe que todo esto funciona.

Checkpoint 2
Haga una demostración al profesor de prácticas de que todos esos cambios le funcionan

12. Arranque de los servicios

En un entorno real con un ordenador como servidor web, al arrancarse el ordenador todos los servicios relacionados con el servidor web se deberían de iniciar. En nuestro caso eso significa en que el Apache y el MySQL arranquen. En el entorno del laboratorio de Telemática realizar esta tarea es difícil, pero si que se puede crear un pequeño script que al ejecutarlo inicie estas dos aplicaciones. Crea el fichero bash arraque.sh:

#!/bin/bash
/opt3/lir/lirXY/mysql/libexec/mysqld --datadir=/opt3/lir/lirXY/mysql/var --socket=/opt3/lir/lirXY/mysql/socket.sock &
/opt3/lir/lirXY/apache/bin/apachectl restart

Dale permisos de ejecución. Si quieres puedes probar a ejecutarlo, pero como en teoría ya tienes MySQL corriendo te dará un error y sólo reiniciará Apache.

Ahora lo único que tienes que hacer es recordar ejecutar este script cada vez que empieces las prácticas de LIR.

13. Alcance de las directrices

Las directrices colocadas directamente en el fichero de configuración se aplican a todo el servidor. Sin embargo, se pueden colocar directrices dentro del ámbito de otra, de forma que solo apliquen dentro del alcance de la segunda. Por ejemplo, las directrices colocadas entre un <Directory> y su correspondiente </Directory> se aplican solo para el directorio indicado. Ejemplo:

<Directory /home/miweb>
AllowOverride All
</Directory>

Pero hay algunas directrices que solo tienen sentido de forma global y por lo tanto no se pueden colocar dentro de estas directrices de bloque.

14. Directrices de bloque

Estudie el significado de las siguientes directrices de bloque:

  • Directory
  • Files
  • Location

Encontrará una buena explicación de las diferencias entre ellas en:
http://httpd.apache.org/docs/2.0/sections.html

Cuestiones:
El sistema de ficheros ext3 empleado en los linux del laboratorio distingue mayúsculas de minúsculas en los nombres de ficheros. Sin embargo, por ejemplo el sistema de ficheros HFS+ no las distingue, para él el fichero MiFichero y MIfichero son el mismo. Qué consecuencias puede tener esto a la hora de limitar el acceso a ciertos directorios del servidor web?

15. VirtualHost

Existen más directrices de bloque. Una de ellas es <VirtualHost> la cual nos permite servir más de un sitio Web con el mismo servidor Apache.

Suponga que queremos instalar el servidor web para dos empresas independientes. Una posibilidad es tener dos máquinas distintas, cada una con su interfaz de red, su dirección IP, su nombre DNS y ejecutando Apache, una contiene las páginas de la empresa 1 y se llama enterprise1.midominio.net y la otra contiene las páginas de la empresa 2 y se llama enterprise2.sudominio.org.


Dos servidores independientes

Perfecto, pero hay más formas de hacerlo. Por ejemplo, podríamos tener una sola máquina pero con dos tarjetas de red, cada una con una dirección IP. Para cada IP tenemos un nombre de dominio (DNS) diferente. Entonces podemos ejecutar dos copias del programa Apache simultáneamente, una de ellas atendiendo a peticiones que vengan a una de las direcciones IP y el otro atendiendo a las peticiones que vayan a la otra. Cada programa Apache corriendo posee un fichero de configuración diferente y un directorio con páginas web a servir diferente. Estudie cómo debería configurar y lanzar cada copia de Apache.



Un servidor con 2 interfaces y 1 programa Apache corriendo

Una tercera posibilidad es tener dos direcciones IP pero solo ejecutar un servidor Apache, no dos. Ese servidor tendrá que servir las páginas de una u otra empresa según a qué interfaz se dirijan las peticiones.

Esta tercera posibilidad es la que vamos a intentar configurar a continuación. Las máquinas del laboratorio no tienen dos tarjetas de red pero sí tienen dos interfaces de red y por tanto dos direcciones IP (lo cual puede comprobar ejecutando el programa /sbin/ifconfig). Esto se debe a que normalmente todas las máquinas que emplean TCP/IP tienen un interfaz que se llama de Loopback que no corresponde a una tarjeta de red sino a software dentro del sistema operativo (podríamos tener este interfaz sin tener tarjeta de red). Este interfaz tiene configurada la dirección IP 127.0.0.1 y todo el tráfico que se dirija a esa IP se queda dentro de la máquina.


Un servidor con 2 interfaces (uno es localhost) y 1 programa Apache corriendo

Estudie la sintaxis de la directriz <VirtualHost>. Por ejemplo lea:
http://httpd.apache.org/docs/2.0/mod/core.html#virtualhost

Configure su servidor Apache para que:

  • Atienda a conexiones dirigidas al puerto 8080
  • Cuando se le solicite la página localhost:8080/presentacion.html sirva el fichero /opt3/lir/lirXY/webs/presentacion.html
  • y cuando se le solicite la página tlmAB.net.tlm.unavarra.es:8080/presentacion.html sirva el fichero /opt3/lir/lirXY/apache/htdocs/presentacion.html donde AB debe substituirse por lo que corresponda a la máquina donde tenga corriendo el Apache
  • Cree unos ficheros HTML simples: /opt3/lir/lirXY/webs/presentacion.html y /opt3/lir/lirXY/apache/htdocs/presentacion.html para probarlo.

Checkpoint 3
Muestre al profesor de prácticas que le funciona esta última configuración y explique cómo lo ha hecho.

16. Trabajos opcionales para ampliar conocimientos sobre la configuración de Apache

A. Allow, Deny

Podemos controlar a qué clientes serviremos ciertas páginas y a cuáles no. Para ello disponemos de las directrices Allow y Deny. Puede encontrar una explicación de su funcionamiento en:
http://httpd.apache.org/docs/2.0/mod/mod_access.html#allow

Continuando con la configuración de la sección anterior (se sirven 2 directorios diferentes según se le solicite a wwwAB o tlmAB):

  • Modifique la configuración para que solo se sirvan las páginas de wwwAB a las máquinas de la tlm11 a la tlm31
  • y con la misma configuración las páginas de tlmAB solo a todas las demás.

B. Autentificación

Además de limitar las máquinas a las que serviremos ciertas páginas basándonos en su dirección IP o su nombre podemos también dejar acceder solo a ciertos usuarios donde nosotros definimos tales usuarios mediante un nombre de usuario y una password.

Las directrices típicas para esta funcionalidad son:
AuthType, AuthName, AuthGroupFile, AuthUserFile y Require
Encontrará explicado cómo funcionan en:
http://httpd.apache.org/docs/2.0/howto/auth.html

  • Modifique la configuración anterior para probar la autentificación, solo para solicitudes hechas a tlmAB:8080
  • Para ello defina dos usuarios nuevos: alumno y profesor con passwords aula315 y d-1.31 respectivamente
  • Cree un directorio con nombre privado en la raíz servida por el Apache para tlmAB
  • Configure el servidor para que solicite password para todos los directorios de tlmAB de forma que alumno pueda acceder a todo menos al contenido de privado y que profesor pueda acceder a todo.
Cuestiones:
Qué haría falta para poder emplear el método de autentificación Digest en vez del Basic?

C. Ficheros .htaccess

Hasta ahora hemos visto directrices que hemos colocado en el fichero de configuración global httpd.conf. Sin embargo, podemos colocar directrices también en otros ficheros. Especialmente interesante son los ficheros que normalmente se llaman .htaccess que permiten cambiar la configuración que se aplica a los directorios en los que se encuentran. Todo lo que se puede hacer con ellos se puede hacer desde el fichero de configuración global pero hay situaciones en las que son útiles. Podemos controlar el tipo de directrices que se pueden colocar en estos ficheros mediante la directriz AllowOverride. Puede encontrar un tutorial respecto al empleo de estos ficheros en:
http://httpd.apache.org/docs/2.0/howto/htaccess.html

Modifique la configuración de su servidor para que emplee ficheros .htaccess dentro de /opt3/lir/lirXY/webs2 y configure mediante un fichero de este tipo que se solicite password para acceder a ese directorio, siendo válido solo el usuario profesor que creamos con anterioridad.

D. Condiguración de 2 direcciones con sólo una interfaz de red

Supongamos que nuestra máquina tiene un solo interfaz de red (ignoremos la IP 127.0.0.1 dado que nadie de fuera de nuestra máquina puede en realidad comunicarse con ella!). Las máquinas del laboratorio tienen como nombre tlmAB.net.tlm.unavarra.es el cual se convierte en la dirección IP 10.1.1.AB. Hemos configurado el servidor de DNS del laboratorio para que ADEMÁS, el nombre wwwAB.net.tlm.unavarra.es también se resuelva como la dirección 10.1.1.AB. Es decir, podemos dirigirnos a nuestras máquinas por cualquiera de los dos nombres y ambos se convertirán en la misma dirección IP antes de mandar los paquetes IP (recuerde que en los paquetes IP se ponen direcciones IP, no nombres, si tenemos un nombre, antes de poder enviar un paquete IP a esa máquina debemos averiguar a qué dirección IP corresponde ese nombre).

  • Modifique la configuración de su servidor web para que ofrezca los ficheros en /opt3/lir/lirXY/apache/htdocs cuando se soliciten con el formato http://tlmAB.net.tlm.unavarra.es:8080
  • además debe servir (con la misma configuración) del directorio /opt3/lir/lirXY/webs cuando se le soliciten con el nombre http://wwwAB.net.tlm.unavarra.es:8080
  • No debe aceptar peticiones a ningún otro puerto.
Cuestiones:
Cómo puede saber el servidor Web que se le está solicitando una página dirigiéndose a él con un nombre o con otro si en la cabecera de los paquetes IP solo aparecen direcciones IP y no nombres?

17. Resumen y conclusiones

En esta práctica hemos instalado un servidor Apache con soporte de PHP, un servidor de bases de datos MySQL y hemos comprobado el correcto funcionamiento de todo.

La instalación ha sido a partir del código fuente de cada uno de los programas y se ha realizado en directorio home del usuario.

Se han utilizado ejemplos simples de HTML, PHP y SQL a sabiendas de que se profundizará en el uso de todos ellos en las siguientes prácticas.

También hemos aprendido a configurar Apache para que ofrezca varias webs diferentes. Esto nos servirá en las siguientes prácticas dado que el servidor Web va a ser la herramienta que dé el soporte principal a los scripts que creemos.

Última modificación: miércoles, 3 de octubre de 2007, 11:04