Está en la página 1de 12

Cómo instalar un servidor web seguro basado en apache, SSL, PHP y MySQL en

entornos windows

Los servidores Web siempre han sido fuente de problemas para los administradores de
sistemas debido a sus enormes archivos de configuración –a veces incluso crípticos–,
más aún cuando son ampliados con módulos que mejoran sus capacidades como SSL,
PHP o MySQL. En este artículo aprenderá a instalar y configurar un servidor Web apto
para su uso en un entorno productivo incluyendo bases de datos SQL y conexiones
seguras.

Ha llegado la época en la que un simple servidor Web no es


suficiente para casi ningún propósito que sea diferente a mostrar
información estática, principalmente debido a las exigencias de
los usuarios que demandan aplicaciones multimedia e
interactivas con capacidades de manejo de bases de datos y,
cómo no, con soporte de comunicaciones seguras al realizar
transacciones.

Todo esto ha hecho que el servidor Web haya pasado a ser uno
de los puntos críticos en las empresas de servicios a través de Internet, pero también ha
conducido a incrementar su complejidad más allá de su objetivo original.

La instalación de un servidor Web como Apache es relativamente sencilla, siendo los


pasos a seguir los típicos: descargar de la última versión, instalación de los archivos
binarios, iniciar el servicio y listo. Pero la configuración avanzada para su perfecta
adaptación a los añadidos que permiten aprovechar todas las características de un
servidor de este tipo se complica bastante.

El objetivo de este artículo es instalar un servidor Web que disponga además de las
típicas páginas HTML, soporte para el lenguaje de programación de páginas web PHP,
acceso a un servidor de bases de datos SQL (Structure Query Language) y transmisión
de datos seguro a través de SSL (Secure Socket Layer).

Para crear los archivos de texto necesarios para seguir el artículo


deberá usar un editor de texto puro (ASCII) que no guarde códigos
de control en los documentos, el Bloc de Notas (notepad.exe)
servirá. Hay que tener cuidado al grabar documentos con el Bloc
de Notas, ya que si no ha desactivado la opción Ocultar
extensiones para tipos de archivos conocidos en Ver->Opciones de
Opciones de carpeta Carpeta de las ventanas del explorador de Windows, entonces los
archivos se guardarán con la extensión .txt lo que puede producir
problemas al editar archivos .html o .php (desactive esta opción tal cómo se muestra en
imagen).

Otro requisito para poder descomprimir los archivos necesarios es un software


compatible con el estándar de compresión ZIP, el más famoso para Windows es Winzip.

En las siguientes secciones se presentan primero la instalación del servidor Apache,


seguido de MySQL, y los añadidos PHP y SSL para Apache, para luego integrarlos
eficazmente y comprobar su funcionamiento en un entorno real.
Apache

El primer requisito es obviamente el servidor de páginas Web Apache. El proyecto


Apache es un desarrollo llevado a cabo por la fundación Apache que tiene como fin
crear un servidor HTTP (Web) robusto, de nivel comercial, con innumerables
características y de distribución gratuita.

Apache fue diseñado con los sistemas UNIX en mente, pero gracias a su popularización
su uso en entornos Windows es cada vez más común, aunque ésta versión no alcanza las
mismas cotas de rendimiento y flexibilidad que la versión UNIX.

En nuestro caso, necesitará descargar la versión para Windows de la dirección


httpd.apache.org/dist/httpd/binaries/win32/; el archivo exacto es apache_1.3.x-win32-
no_src-r2.msi que contiene el instalador sin el código fuente (en el momento de escribir
el artículo la versión disponible era la 1.3.22, pero no debería existir ningún
inconveniente si usa una versión mayor).

La distribución de la versión para Windows usa el sistema de instalación de Microsoft


con la extensión .msi, por lo tanto si no dispone de Microsoft Software Installer en su
sistema necesitará descargarlo mediante ftp del servidor público de Microsoft
(ftp.microsoft.com) en el directorio /developr/platformsdk/oct2000/msi e instalarlo en
primer lugar para después continuar la instalación de Apache.

Instalación del servidor

La instalación del servidor Apache en Windows es prácticamente igual a la de cualquier


otra aplicación, y sólo debemos tener en cuenta 2 detalles:

En la ventana Server Information de este proceso, rellene los


campos con los valores por defecto que aparecen en la parte
superior de ellos, es decir, en Network Domain introduzca
somenet.com, en Server Name introduzca www.somenet.com y en
Administrator’s Email por ejemplo webmaster@somenet.com
(estos datos son ficticios y deberían ser cambiados si el ordenador
Ventana de que ejecute el servidor de Web tiene acceso directo a Internet con
información del dominio propio, pero la mayoría de los usuarios deberían dejar los
servidor indicados). Existen 2 modos de funcionamiento de Apache que se
pueden seleccionar en esta misma ventana, como servicio del
sistema (Run as a service) o como aplicación (Run when started manually); en nuestro
caso elija la segunda opción ya que así funcionará –con arranque manual– en cualquier
versión de Windows (98/ME/NT/2000) de la misma forma, no obstante es posible usar
la primera opción.

En el tipo de instalación seleccione Custom para poder elegir el directorio destino en


c:\web\ que es el que se usará para almacenar los componentes necesarios pulsando en
el botón Change.

Arrancar el servidor
Una vez instalado, ejecute el servidor accediendo a Inicio->Programas ->Apache httpd
server ->Start Apache in console, debería aparecer una consola de sistema con el texto
“Apache/1.3.20 (Win32) running...” en la primera línea, sin ningún otro mensaje de
error, lo que indica que el servidor Web está funcionando.

El siguiente paso es comprobar si el servidor está activo realmente,


para ello inicie una ventana de Internet Explorer u otro navegador
e introduzca en la barra de direcciones localhost ó 127.0.0.1
(dirección de red local de una máquina) si accede desde su propia
máquina, o la IP correspondiente al servidor si se encuentra en otra
diferente (puede averiguar la dirección IP use el comando de MS-
Puesta en marcha DOS ipconfig).

Si todo va bien debería ver una página de bienvenida tal y como se


puede ver en la figura, de no ser así compruebe que ha iniciado
correctamente el servidor Apache según los pasos anteriores y que
no tiene configurado el acceso a Internet a través de un proxy. Si
este es su caso deberá desactivarlo para realizar las pruebas; en el
Página de
IE esta opción se encuentra en Herramientas->Opciones de
bienvenida
Internet->Conexiones->Configuración LAN.

En el archivo de configuración principal


c:\web\apache\conf\httpd.conf se encuentran todas las opciones
necesarias para ajustar el servidor, cambiar el puerto de acceso
(por defecto el 80), directorio raíz del sitio, servidores virtuales,
etc., pero por ahora no es necesario realizar ningún cambio
adicional. Los documentos del sitio web están en
Directorio de las c:\web\apache\htdocs, si desea cambiar el contenido de la web
páginas deberá borrar los archivos de este directorio para sustituirlos por
los propios.

Apache vs. IIS

Sobre este punto sería posible escribir incluso un libro (si no lo hay aún), por lo que en
lugar de exponer todas las características de ambos productos es preferible hacer un
breve repaso indicando sus ventajas e inconvenientes, y que cada cual tome su propia
decisión.

Ventajas
IIS
- Fácil de usar.
- ASP preparado en la instalación por defecto.
- Soporte ODBC integrado.
- Configuración gráfica y en línea de comandos.

Apache
- Código fuente disponible.
- Existen versiones virtualmente para cualquier sistema
operativo.
- Excelente integración con PHP y MySQL.
- Es el servidor web por excelencia en la Red.

Inconvenientes:
ISS
- Multitud de nuevos fallos de seguridad.
- La mayoría de funcionalidad extra debe ser comprada separadamente.
- Sólo funciona en Windows NT/2000.

Apache
- No existe aún configuración gráfica oficial.
- Curva larga de aprendizaje para sacarle el máximo
partido
MySQL

Las bases de datos relacionales se han convertido en una herramienta fundamental en


las actividades diarias de casi cualquier empresa, y ya quedan pocas que no usen este
sistema para almacenar su información.

MySQL es una base de datos relacional de libre distribución


usada principalmente como soporte de portales web que necesitan
manejar datos dinámicamente, con una potencia que poco tiene
que envidiar a las grandes como SQL Server e incluso Oracle.
Proceso de
instalación
Antes de nada debe descargar la versión binaria para Windows de
la dirección www.mys ql.com/downloads/mysql-3.23.html en el apartado Windows
95/98/NT/2000 (Intel); tenga en cuenta que se trata de un archivo de unos 10MB por lo
que si dispone de una conexión a Internet mediante módem tendrá que tener paciencia.

El archivo de instalación está empaquetado con el compresor ZIP, pero una vez
descomprimido se instala como una aplicación típica de Windows. MySQL asume que
el directorio por defecto será c:\mysql (recomendamos que use este directorio) aunque
puede elegir otro, pero deberá editar el archivo de configuración c:\my.cnf tal y como se
muestra en la figura.

Configuración de MySQL

El primer paso será iniciar el servidor de bases de datos, para ello abra una ventana de
MS-DOS e introduzca estos comandos:

c:\>cd c:\mysql\bin
c:\mysql\bin>mysqld-max
Nótese que dentro del directorio \bin existen diferentes versiones
del servidor SQL: mysqld (versión original con información de
debug incorporada), mysqld-max (binario optimizado), mysqld-nt
(versión para Win NT/2000) y mysqld-max-nt (igual, pero para
Así se ve en consola
NT/2000).

El segundo paso es probar el funcionamiento del servidor MySQL usando el cliente


(mysql.exe) incluido en el paquete básico. En otra ventana de MS-DOS introduzca (los
comandos de MySQL siempre terminan en punto y coma “;”.):

C:\mysql\bin> mysql
Welcome to the MySQL monitor. Commands end with
; or \g.
Your MySQL connection id is 11 to server
version: 3.23.41-max

Type 'help;' or '\h' for help. Type '\c' to


clear the buffer.

mysql> show databases;


+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.11 sec)

mysql> create database terra;


Query OK, 1 row affected (0.06 sec)

mysql>

Si obtiene estos mensajes en pantalla, quiere decir que ha conectado correctamente con
el servidor de bases de datos. Como puede comprobar, en la instalación típica existen
por defecto dos bases de datos: “mysql” (base de datos de administración) y “test” (base
de pruebas).

MySQL vs SQL Server

MySQL es una alternativa a los grandes servidores de bases de datos basados en


Microsoft SQL Server y Oracle, al menos en cuanto a solución para manejar bases de
datos para portales de Internet. MySQL destaca especialmente por su velocidad al
efectuar lecturas y búsquedas en la base de datos –sentencias SELECT en SQL–, pero
no por sus capacidades para realizar miles de transacciones en tiempo real que puede
requerir, por ejemplo, un banco por Internet.

Aquí puede ver una tabla comparativa con los resultados de realizar la sentencia
SELECT * FROM BBDD accediendo a 50 registros en 6 bases de datos diferentes con
el resultado expuesto en segundos (menos tiempo es mejor); esta ha sido ejecutada 41
veces en un servidor web bajo PHP.
Bases de datos 1 2 3 4 5 6 Media
MySQL 1.56 1.57 2.56 1.56 1.52 1.57 1.72
MS SQL 7 2.11 2.07 2.09 2.09 2.09 2.10 2.09
MS SQL 7 ODBC 10.47 10.41 11.46 10.48 10.43 11.48 10.79
Access ODBC 4.11 3.91 4.00 4.99 4.98 3.98 4.33
PHP

Hypertext Preprocessor, es un lenguaje interpretado de alto nivel embebido en páginas


HTML. La mayoría de su sintaxis es similar a C, Java y Perl, con numerosas
características de PHP específicas. La meta de este lenguaje es permitir escribir a los
creadores de páginas web, páginas dinámicas de una manera rápida y fácil.

El archivo a descargar se encuentra en


www.php.net/downloads.php en la sección Win32 Binaries con el
nombre PHP 4.0.x Installer, aunque si lo desea puede usar la
versión completa PHP 4.0.x zip package (ocupa bastante más).

La instalación de PHP en Windows es también bastante sencilla y


Instalando PHP sólo hay que tener en cuenta al instalarlo seleccionar en la ventana
Server Type el tipo None para poder configurarlo manualmente en
Apache, en los demás campos son válidos los valores por defecto.

La integración de PHP –en modo CGI (interprete externo) en lugar de módulo de


Apache (interno)- con Apache se realiza editando el archivo de configuración de este
último para que interprete correctamente la extensión de archivos .php. Lo más sencillo
es añadir estas líneas en el principio del archivo “http.conf”:

# terra
ScriptAlias /php/ "c:/php/"
AddType application/x-httpd-php .php
Action application/x-httpd-php “/php/php.exe”

También es necesario modificar la línea que comienza por DirectoryIndex, con el fin de
interpretar correctamente las páginas de inicio, por esta otra:

DirectoryIndex index.html index.php index.php3


Arrancar PHP

Una vez grabados los cambios en el documento httpd.conf es obligatorio detener el


servidor Apache –pulsando CTR-C en su ventana– y volverlo a ejecutar para que relea
el archivo de configuración.

El siguiente fragmento de código usa la función phpinfo() para comprobar si funciona o


no la interpretación de archivos .php, debe grabar éste en un archivo llamado terra.php
en el directorio c:\web\apache\htdocs\:

<?
phpinfo();
?>

Una vez con el archivo grabado en el directorio raíz del servidor web, verifique con el
navegador si Apache procesa correctamente los archivos .php introduciendo en la barra
de dirección http://127.0.0.1/terra.php; si todo ha ido correctamente y no ha obtenido un
mensaje de error observará un mensaje de información de PHP –devuelto por la función
phpinfo()– cómo el de la figura significa que ha instalado PHP correctamente, en caso
contrario deberá repasar su instalación desde el principio, sobre todo teniendo cuidado
con el nombre de los directorios.

PHP vs ASP

Existe un gran debate en la red sobre sí el lenguaje de programación de guiones PHP es


superior o inferior a su homónimo de Microsoft ASP (Active Server Pages). Es cierto
que la gran base de usuarios de Microsoft, sobre todo en las empresas informáticas,
hacen que ASP sea más fácil de implementar y mantener, pero, ¿cuál es más potente?.

Aquí se muestran unas conclusiones explicando por qué PHP es superior a ASP:

1. Velocidad
Uno de los principales problemas en los portales de Internet que soportan una gran
carga de usuarios es la velocidad de respuesta de su servidor, por lo que este debería ser
un punto crítico al elegir un lenguaje u otro.

ASP, probablemente, nunca será tan rápido como PHP. ASP está construido en una
arquitectura de objetos COM, y por lo tanto, cuando un programador de ASP usa
VBScript realmente está corriendo un objeto COM. Si escribe un simple texto en la
salida estándar, estaría llamando al objeto Response del método Write. Si accede a una
base de datos, debe usar otro objeto, etc. Todo esto sobrecarga y hace más lento el
sistema.

En cambio, al usar PHP todas las operaciones se realizan en el espacio de memoria de


PHP. Esto significa que el código PHP ejecutará más rápido ya que no debe cargar
dinámicamente ningún otro objeto en memoria en la ejecución de un programa.

2. Costes ocultos
Una de las cosas que se suelen pasar por alto al usar un software determinado son los
costes ocultos o derivados de la primera compra.

ASP cumple con esta especificación, es decir, un desarrollador posiblemente no pueda


realizar todas las tareas que necesita con las opciones que ofrece ASP por defecto; si
necesita encriptación comprará ASPEncrypt, si necesita gestión de correo comprará
Qmail de ServerObject, por ejemplo, si necesita subir ficheros (file uploading) al
servidor comprará SA-FileUP de Artisans.

Todo esto y más está disponible en PHP gratuitamente.

3. Programación parecida a C o Java


Aunque este punto es más una opinión que una conclusión, poca gente negará las
ventajas –a nivel de programación empírica– del lenguaje C sobre VisualBasic.

Además de tener una sintaxis basada en C, PHP toma prestado de perl la interpretación
de expresiones regulares y de Java el sistema de objetos.

SL (Secure Socket Layer)

Esta es quizás la parte más problemática de todo el artículo por lo que es recomendable
tener paciencia y hacer exactamente los mismos pasos que aquí se describen debido a
que las implementaciones de conexiones seguras (SSL) para la versión de Windows de
Apache son conversiones directas de sus análogas de UNIX y fallan al más mínimo
descuido.

Para realizar el servidor Web perfecto en un entorno Windows no


puede faltar soporte para conexiones seguras que eviten las
intercepciones de datos a través de Internet al realizar
transacciones bancarias o compras online. Aunque existen varias
soluciones, sin duda la más probada es SSL por lo que estaría bien
proporcionar soporte SSL en nuestro reciente servidor Web.

Para este proyecto descargue el modulo SSL precompilado para la


versión de Apache que tiene instalada (en nuestro caso la 1.3.20)
de la dirección www.modssl.com/con trib/Apache_1.3.20-
Mod_SSL_2.8.4-Open SSL_0.9.6a-WIN32.zip. Descomprima el
archivo ZIP en el directorio c:\modssl y copie los archivos
ssleay32.dll y libeay32.dll del directorio modssl\openssl\bin al
Certificado
directorio del sistema (windows\system en Win98 y
winnt\system32 en Windows NT/2000).

Crear certificados SSL

Después es necesario crear los certificados SSL que a grandes rasgos es una credencial
digital que permite a los visitantes de un sitio usar su navegador para verificar la
autenticidad del sitio y comunicarse con él en forma segura.

Estas son las instrucciones exactas para crearlos:

C:\>cd modssl
C:\modssl>cd openssl\bin
C:\modssl\openssl\bin>openssl req -config
openssl.cnf -new -out somenet.csr

Using configuration from openssl.cnf


Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
..................++++++....++++++
writing new private key to 'privkey.pem'

Enter PEM pass phrase: esto es una prueba para


terra
Verifying password - Enter PEM pass phrase: esto
es una prueba para terra
-----
You are about to be asked to enter
information that will be incorporated
into your certificate request.
What you are about to enter is what is called
a Distinguished Name or a DN.
There are quite a few fields but you can leave
some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:es
State or Province Name (full name) []:madrid
Locality Name (eg, city) []:madrid
Organization Name (eg, company) []:idg
Organizational Unit Name (eg, section) []:terra
Common Name (eg, your websites domain name)
[]:www.somenet.com
Email Address []:webmaster@somenet.com

Please enter the following 'extra' attributes


to be sent with your certificate request
A challenge password []:calidad

C:\modssl\openssl\bin>
C:\modssl\openssl\bin>openssl rsa -in
privkey.pem -out somenet.key
read RSA key
Enter PEM pass phrase: prueba terra
writing RSA key
C:\modssl\openssl\bin>openssl x509 -in
somenet.csr
-out somenet.cert -req -signkey somenet.key
-days 365
Loading 'screen' into random state - done
Signature ok
subject=/C=es/ST=madrid/L=madrid/O=idg/
OU=terra/CN=www.somenet.com/Email=webmas
ter@somenet.com
Getting Private key

C:\modssl\openssl\bin>

Si no se ha producido ningún error, entonces el certificado SSL se ha creado con éxito.


Este certificado ha sido firmado digitalmente por nosotros y sólo será válido para hacer
pruebas. Si trabajáramos en un entorno real sería necesario obtenerlo de una entidad
certificadora.

Poner en marcha SSL

Lo siguiente es crear el directorio c:\web\apache\conf\ssl y mover los archivos


somenet.key y somenet.cert (del certificado digital), así:

C:\web\Apache>cd conf
C:\web\Apache\conf>md ssl
C:\web\Apache\conf>cd ssl
C:\web\Apache\conf\ssl>copy ..\..\openssl\
bin\somenet.key
1 archivos copiados
C:\web\Apache\conf\ssl>copy ..\..\openssl\
bin\somenet.cert
1 archivos copiados
C:\web\Apache\conf\ssl>

Después modifique el archivo de configuración de Apache para que incluya las


siguientes líneas:

# para más información


# http://www.modssl.org/docs/
2.4/ssl_reference.html
LoadModule ssl_module modules/mod_ssl.so
SSLMutex sem
SSLRandomSeed startup builtin
SSLSessionCache none
SSLLog logs/SSL.log
SSLLogLevel info
Listen 443
SSLEngine On
SSLCertificateFile conf/ssl/somenet.cert
SSLCertificateKeyFile conf/ssl/somenet.key

Apache estará configurado para trabajar en modo SSL en el puerto


443 (HTTPS) únicamente, por lo que las peticiones al puerto 80
(HTTP) dejarán ahora de funcionar. Es posible disponer de los
puertos 80 y 443 simultáneamente para trabajar con conexiones
normales y seguras al mismo tiempo pero sería necesario crear
Vista de la consola servidores virtuales.

Antes de iniciar Apache en modo SSL es necesario copiar los archivos que se
encuentran en la carpeta modssl en la carpeta Apache sobrescribiendo los archivos
previos.

Apache cargará el módulo mod_ssl al iniciarlo con apache –D ssl, por lo que si aún se
encuentra activo es necesario detenerlo para después desde una línea de comandos
ejecutarlo de la forma indicada (si no hace esto, no podrá reconocer solicitudes SSL):

C:\web\Apache>apache -D ssl
Apache/1.3.20 (Win32) mod_ssl/2.8.4
OpenSSL/0.9.6a running...

Si no se produce ningún error tendrá listo su servidor Apache con soporte PHP, MySQL
y conexiones seguras SSL bajo Windows. Pero antes de probarlo todo en conjunto inicie
un IE e introduzca en la barra de direcciones https://127.0.0.1/terra.php, debería
aparecer la misma página web que en el apartado PHP pero en esta ocasión mediante
una transmisión segura (el protocolo HTTPS es a groso modo una encapsulación de http
sobre SSL).

Si es la primera vez que conecta con su servidor mediante SSL, IE presentará un aviso
en pantalla indicándole información sobre el certificado que ha creado anteriormente
que deberá aceptar para poder continuar. Además, cuando el navegador realiza una
conexión segura con un servidor muestra en la parte inferior de la pantalla un pequeño
candado cerrado.

Probando nuestro trabajo

Un ejemplo real aunque muy limitado en este caso es crear una agenda de nombres
accesible mediante una página web.

Para ello lo primero deberemos crear la estructura de la base de datos, en nuestro caso
será simplemente una tabla con 2 registros creada en la base de datos terra (creada en el
apartado MySQL): id (número de identificación) y nombre (nombre personal del
usuario):

C:\mysql\bin>mysql
Welcome to the MySQL monitor.
Commands end with ; or \g.
Your MySQL connection id is 2 to server version:
3.23.41-max-debug

Type 'help;' or '\h' for help. Type '\c' to


clear the buffer.

mysql> use terra;


Database changed
mysql> create table agenda (id int not null
auto_increment, nombre char(50), primary
key(id));

Query OK, 0 rows affected (0.16 sec)

mysql> show tables;


+------------------+
| Tables_in_terra |
+------------------+
| agenda |
+------------------+
1 row in set (0.11 sec)

mysql> describe agenda;


...
2 rows in set (0.06 sec)

En los siguientes comandos se usan la sentencia “INSERT” de SQL para introducir


algunos datos en la base de datos.
mysql> insert into agenda (nombre)
values('Pepe Falso');
Query OK, 1 row affected (0.11 sec)

mysql> insert into agenda (nombre)


values('Jonny Me Lavo');
Query OK, 1 row affected (0.00 sec)

mysql> select * from agenda;


+----+---------------+
| id | nombre |
+----+---------------+
| 1 | Pepe Falso |
| 2 | Jonny Me Lavo |
+----+---------------+
2 rows in set (0.06 sec)

mysql>