Monthly Archives: March 2015

Como montar un servidor web en nuestro PC para realizar pruebas de estrés

Si estamos pensando en sacar algún tipo de aplicación web, puede ser interesante saber que estabilidad tendrá esta y cuantas visitas concurrentes soportará.

Por ello, en esta entrada se especificarán los pasos para realizar pruebas de estrés, desde nuestra propia máquina (usando el S.O. Centos y una máquina virtual), también se podría realizar dichas pruebas en maquinas de Amazon o en un servidor cualquiera.

 

PASO 1. Instalación de Centos en una Máquina Virtual sobre Windows. Esta máquina se utilizará como servidor php.

Necesitaremos descargar la versión de Virtual Box compatible con Windows e instalarla, la podremos descargar desde aquí en su web oficial. Luego necesitaremos descargar la imagen .iso del S.O. mencionado, lo cual podremos hacerlo desde también desde su web oficial. En nuestro caso la versión que hemos usado para realizar este tutorial es una versión minimal 6.6 (Descargar v6.6 minimal)
PASO 2. Configuración de Virtual Box.

    1. Hacer click en Nueva. Poner el nombre que queramos, tipo “Linux” y versión “Red Hat (32 bit)”. Hacer click en Siguiente.
    2. Establecer una memoria ram de 1024 MB y hacer click en Siguiente.
    3. Elegimos “Crear disco duro virtual ahora”. Click en Crear.
    4. Elegimos el tipo de disco “VDI (VirtualBox Dick Image) y hacemos click en Siguiente.
    5. Elegimos la opción de reservado dinámicamente. Click en Siguiente.
    6. Ahora hacemos click en Crear.
    7. Una vez creado, seleccionamos la máquina que acabamos de crear y hacemos click en “Configuración”.
    8. Ahora vamos a Almacenamiento → Controlador IDE → Controlador IDE/Vacio → (Icono de disco con flecha hacia abajo) → Seleccionar un archivo de disco virtual de CD/DVD… → (Buscar nuestra imagen .iso y seleccionar).
    9. Ahora configuramos la red: Ir a Red → Adaptador 1 → Conectado a:→ (Seleccionar Adaptador Puente y seleccionar la tarjeta de red de nuestro ordenador con la que nos conectamos a internet).
    10. Por último, hacemos click en Aceptar.

PASO 3. Configuración de Centos.

  1. Seleccionamos la máquina creada y hacemos click en Iniciar.
  2. Dejamos seleccionado “Install or upgrade an existing system”, pulsar Intro y esperar que cargue.
  3. Movemos con las flechas del teclado hasta seleccionar “SKIP” y pulsar Intro (esperar).
  4. Hacemos click en Next.
  5. Seleccionamos idioma (Spanish) y pulsamos en Next.
  6. Dejamos selecciono “Dispositivos de almacenamiento básicos” y hacemos click en “Siguiente”.
  7. Hacemos click en “Si, descarte todos los datos”
  8. Establecemos el nombre del equipo.
  9. Dejamos seleccionado “Europa/Madrid” y pulsamos en “Siguiente”.
  10. Establecemos la contraseña para el usuario root.
  11. Seleccionar “Remplazar sistema(s) Linux existente(s)” y pulsar “Siguiente”
  12. Hacemos click en “Escribir cambios al disco” y esperamos a que finalice la instalación
  13. Por último, reiniciamos.

PASO 4. Primer arranque y actualización.

  1. Usamos nuestro login y nuestra password para acceder como root.
  2. Ejecutamos el comando “ifconfig -a”. Se observa que la interfaz eth0 no tiene configuración IP y que no está levantada.
  3. Ejecutamos el comando “ifup et0″
  4. Ejecutamos “yum update”. Y pulsamos la tecla “s” para continuar cuando sea necesario.
  5. Ejecutamos “yum install nano”
  6. Ejecutamos “nano /etc/sysconfig/network-scripts/ifcfg-eth0″. Una vez dentro de este archivo cambiamos la linea “ONBOOT=no” por “ONBOOT=yes”. Guardamos y salimos. Con este paso habremos conseguido que la interfaz eth0 se levante automáticamente cada vez que arranquemos Centos.

PASO 5. Configuración de carpeta compartida entre Windows y Centos.

  1. Máquina → Configuración → Carpetas Compartidas
  2. Pulsamos sobre “Añadir Carpeta”
  3. Hacemos click en Ruta Carpeta → Otro → (Crear Carpeta en Escritorio y seleccionar) → Aceptar
  4. Seleccionamos “Automontar” y “Hacer Permanente”. Luego hacemos click en aceptar.
  5. Dentro de la máquina Centos, ejecutamos el comando “mkdir CarpetaCompartida”.
  6. Ejecutamos el comando “yum groupinstall “Development Tools” “
  7. Ejecutamos comando “yum install kernel-devel”
  8. Luego vamos a Dispositivos → Insertar la imagen de CD de las “Guest Additions”
  9. Ejecutamos el comando “mkdir /mnt/cd”
  10. Ejecutamos el comando “mount /dev/sr0 /mnt/cd”
  11. Ejecutamos el comando “cd /mnt/cd”
  12. Ejecutamos el comando “./VBoxLinuxAdditions.run”
  13. Ejecutamos el comando “mount –t vboxsf CarpetaCentos /root/CarpetaCompartida/”

Desde este momento, cualquier archivo que incluyamos en la carpeta creada en Windows, también aparecerá en la creada en Centos, y viceversa.

 

PASO 6. Instalación servidor Apache y mysql

  1. Ejecutamos el comando “yum install httpd”
  2. Ejecutamos el comando “nano /etc/sysconfig/iptables”
  3. Modificamos el fichero añadiendo bajo la línea “-A INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT” la siguiente línea: “-A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT”
  4. Ejecutamos el comando “service iptables start”
  5. Ejecutamos el comando “service httpd start”
  6. Ejecutamos el comando “yum install mysql-server”
  7. Ejecutamos el comando “service mysqld start”
  8. Ejecutamos los comandos “chkconfig httpd on” y “chkconfig mysqld on”
  9. Configuramos mysql-server ejecutando “/usr/bin/mysql_secure_installation”, estableciendo una contraseña y respondiendo si a todo.
  10. Ejecutamos el comando “yum install php php-mysql”
  11. Ejecutamos el comando “service httpd restart”

Instalacion Servidores

PASO 7. Probando php

  1. Ejecutamos el comando “nano /var/www/html/info.php” y escribirmos lo siguiente: <?phpphpinfo();?>
  2. Ejecutamos el comando “ifconfig” y apuntamos la dirección ip de la interfaz eth0
  3. Abrimos un navegador en Windows y escribimos: [IP_ETH0]/info.php

PASO 8. Descargar la BD, crearla e importarla

  1.  Descargar en Windows la BD en formato .csv (“IP2LOCATION-LIST-DB5.CSV”) desde la siguiente url: Descargar BD
  2. Copiar la BD a la carpeta compartida creada anteriormente.
  3. En Centos, ejecutamos el comando “cd /root/CarpetaCompartida”
  4. Ejecutamos el comando “mysql –u root –p”, introducimos nuestra contraseña y a continuación los siguiente comandos:CREATE DATABASE ip2location;USE ip2location;CREATE TABLE `ip2location_db5`(`ip_from` INT(10) UNSIGNED,`ip_to` INT(10) UNSIGNED,`country_code` CHAR(2),`country_name` VARCHAR(64),`region_name` VARCHAR(128),`city_name` VARCHAR(128),`latitude` DOUBLE,`longitude` DOUBLE,INDEX `idx_ip_from` (`ip_from`),

    INDEX `idx_ip_to` (`ip_to`),

    INDEX `idx_ip_from_to` (`ip_from`, `ip_to`)

    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    LOAD DATA LOCAL

    INFILE ‘/root/CarpetaCompatida/IP2LOCATION-LITE-DB5.CSV’

    INTO TABLE

    `ip2location_db5`

    FIELDS TERMINATED BY ‘,’

    ENCLOSED BY ‘”‘

    LINES TERMINATED BY ‘\r\n’

    IGNORE 0 LINES;

  5. Ejecutamos el comando “exit”

Descargar, Crear, Importar BD 1

PASO 9. Creación del fichero .php que acceda a la BD y devuelva una respuesta

  1. Ejecutamos el comando “mkdir /var/www/html/MAC”
  2. Ejecutamos el comando “nano /var/www/html/MAC/localizarIpv2.php” y escribimos lo siguiente:<!DOCTYPE html><html ><head><meta charset=”utf-8″><meta http-equiv=”X-UA-Compatible” content=”IE=edge”><meta name=”viewport” content=”width=device-width, initial-scale=1″><meta name=”description” content=”"><meta name=”author” content=”"><title>Localiza tu IP</title></head><body><div>

    <div>

    <h2>Localizador IP</h2>

    <?php

    function Dot2LongIP ($IPaddr)

    {

    if ($IPaddr == “”) {

    return 0;

    } else {

    $ips = split (“\.”, “$IPaddr”);

    return ($ips[3] + $ips[2] * 256 + $ips[1] * 256 * 256 + $ips[0] * 256 * 256 * 256);

    }

    }

    if(isset($_GET["ip"]) & !empty($_GET["ip"])){

    $result=Dot2LongIP($_GET["ip"]);

    $host = “localhost”;

    $user = “root”;

    $pass = “localhost”;

    $db = “ip2location”;

    $conexion = mysql_connect($host, $user, $pass);

    mysql_select_db($db, $conexion);

    $str=”SELECT IP.country_name, IP.region_name, IP.city_name, IP.latitude, IP.longitude FROM ip2location_db5 IP

    WHERE (IP.ip_from <= “.$result.”) AND (IP.ip_to >= “.$result.”)”;

    $query = mysql_query($str);

    $row=mysql_fetch_array($query);

    echo(“<h3>Pais:”.$row[0].”</h3>”);

    echo(“<h3>Region:”.$row[1].”</h3>”);

    echo(“<h3>Ciudad:”.$row[2].”</h3>”);

    }

    else{

    echo(“<h3>Parámetros no validos</h3>”);

    }

    ?>

    </div>

    </div>

    </body>

    </html>

  3. Probamos en un navegador en Windows la siguiente dirección: “http://[direccion ip eth0]/MAC/localizarIpv2.php?ip=125.12.36.158″

PASO 10. Crear una nueva máquina virtual repitiendo los pasos 1, 2, 3 y 4. Se puede realizar en el mismo ordenador o en otro conectado a la misma red.

En la nueva máquina virtual…

  1. Ejecutamos el comando “yum install wget”
  2. Ejecutamos el comando “wget http://download.joedog.org/siege/siege-3.0.9.tar.gz
  3. Ejecutamos el comando “tar xvfz siege-3.0.9.tar.gz”
  4. Ejecutamos el comando “cd siege-3.0.9″
  5. Ejecutamos el comando “./configure”
  6. Ejecutamos el comando “make”
  7. Ejecutamos el comando “make install”

Pruebas estres siege 0

PASO 11. Pruebas de estrés (desde la máquina cliente).

Primera prueba ejecutando el comando “siege –t 1m –c 100 –u http://[ip maquina servidor]/MAC/localizarIpv2.php?ip=125.12.36.158″

Los resultados son los siguientes:

Transactions:                   3066 hits

Availability:                 100.00 %

Elapsed time:                  62.96 secs

Data transferred:               1.70 MB

Response time:                  4.18 secs

Transaction rate:              48.70 trans/sec

Throughput:                     0.03 MB/sec

Concurrency:                  203.41

Successful transactions:        3066

Failed transactions:               0

Longest transaction:           34.83

Shortest transaction:           0.30

 

Una primera forma de mejorar estos resultados es modificar la consulta con el comando “nano /var/www/html/MAC/localizarIpv2.php” modificando la línea:

WHERE (IP.ip_from <= “.$result.”) AND (IP.ip_to >= “.$result.”)”;  por la línea:

WHERE (IP.ip_to >= “.$result.”) LIMIT 1″;

 

Otro forma en la que pueden mejorarse estos resultados es modificando la configuración del servidor Apache para que lance más hilos concurrentes. Esto se hace ejecutando el comando “nano /etc/httpd/conf/httpd.conf” y modificando en el fichero las líneas:

StartServers -> 15

MinSpareServers -> 15

MaxSpareServers -> 35

Configuracion httpd 0

Tras esto, antes de realizar la siguiente prueba de estrés deberemos ejecutar el comando “service httpd restart”

Importar una imagen de VM en una instancia AWS

En primer lugar necesitamos una máquina virtual la cual vamos a cargar en Amazon (El equipo desde el que se trabaja en este caso es Windows, en caso de emplear un sistema basado en Unix consultar la configuración de CLI en Linux o Mac). En este caso se trata de una máquina CentOS con phpmyadmin instalado a través de apache con datos integrados.

CapturaPara ello necesitamos el o los discos que estén montados en esta imagen (formato vhd) y los colocamos en un directorio bien localizado el cual tendremos que acceder más tarde mediante consola. Una vez se tenga preparada la “imagen” se procede a la ejecución de los pasos para importarla a AWS:

  1. Instalar el CLI de Amazon EC2 en tu equipo. Comenzamos descargando el archivo comprimido desde la web de Amazon (es necesario tener instalado Java 1.7 mínimo). Para que estos comandos resulten efectivos debemos crear una serie de variables de entorno que permitan el manejo de dichos comandos de forma cómoda por la ventana de comandos del sistema.
    • Click en Inicio, Equipo, Propiedades.
    • Configuración avanzada del sistema.
    • Variables de entorno.
    • Variables de usuario, click en Nueva.
    • Nombre de variable, JAVA_HOME.
    • Valor de la variable, el path del ejecutable de Java: “C:\Program Files (x86)\Java\jre7” (sin incluir el directorio bin).
    • Ok.

    Estos mismos pasos hay que repetirlos para crear el resto de variables necesarias:

    • Nombre de variable EC2_HOME, valor de la variable path del directorio de CLI descargado: “C:\AWS\EC2\ec2-api-tools-1.7.0.0“.
    • Nombre de la variable AWS_ACCESS_KEY, valor de la variable la ID de tu clave de acceso.
    • Nombre de la variable AWS_SECRET_KEY, valor de la variable tu clave de acceso secreto.
    • Nombre de la variable EC2_URL, valor de la variable la url de la región donde desees trabajar (consultar en Amazon Web Services General Reference), “https://ec2.eu-west-1.amazonaws.com“.

    Captura2

  2. Mirar los requisitos previos de la máquina virtual para AWS, de ahí el formato de disco anterior y el hecho de guardar sólo los discos.
  3. Exportar la imagen de la máquina virtual. Este paso ya se realizó anteriormente, sin embargo, se coloca en este puesto para recordar que no solo es posible importar en AWS imágenes creadas por una máquina virtual, sino que existen herramientas (VMWare Converter, Microsoft System Center Virtual Machine Manager, XenConvert…) para crear copias virtuales de un equipo físico.
  4. Importar imagen en AWS. Antes de importar, es importante recordar que se debe crear un bucket en el servicio S3 de AWS, donde se almacenará la imagen que subamos mediante comandos.
    Captura3
    El formato del comando a emplear debe ser el siguiente:

    ec2-import-instance disk_image_filename -f file_format -t instance_type -a architecture -b s3_bucket_name -o owner -w secret_key -p platform_name

    Cabe recordar que es importante consultar qué máquina está disponible en tu región, qué tipo de instancia es compatible con tu sistema (windows o linux), etc. Aunque se guardaran las credenciales de la cuenta con Amazon en las variables de entorno correspondientes, es necesario volver a especificarlas en el comando, así como el bucket de S3 creado anteriormente. A modo de ejemplo el comando lanzado en nuestro caso fue el siguiente:

    ec2-import-instance C:\Users\usuario\Desktop\Centos\CentOSMiami-disk1_gueno.vhd -f VHD -t m3.xlarge -a i386 -b cloud-master-benito -o ... -w ... -p Linux

    Captura4Captura5

  5. Manipular la instancia en AWS. Una vez subida la imagen, aparecerá automáticamente la instancia en Amazon EC2, sin embargo, el que sea automático no implica que no podamos manejarla como una instancia propia, es decir, se puede guardar una AMI y emplearla en instancias puntuales si se desea, se puede realizar implementar el autoescalado de AWS, etc.
    Captura6Captura7
    Con ello, lanzando una instancia puntual con dicha AMI y tomando su IP pública, comprobamos que la imagen es exacta a la de la máquina virtual, pero sin restricciones iniciales, tal como si se hubiera creado desde un principio en Amazon.Captura8
    El último paso a realizar es eliminar los datos del bucket de S3, ya que no son necesarios mantenerlos ahí por más tiempo.

Referencias: