Servidor Web LEMP: Linux, NGINX, MariaDB y PHP en el ODROID-HC1

LEMP stack web server: Linux, NGINX, MariaDB, and PHP on the ODROID-HC1

Esta guía te permitirá montar un servidor web económico pero potente usando un ODROID-HC1 (familia XU4, incluido el ODROID-HC2) equipado con un SSD SATA.

Preparar el soporte de arranque

Antes de continuar, graba la última imagen oficial de Hardkernel Ubuntu Minimal en tu soporte de arranque: tarjeta microSD de 8GB + Clase 10. También puedes utilizar un módulo eMMC de Hardkernel, junto con un lector de tarjetas microSD USB3.

Visita al enlace http://bit.ly/2xaucO8 y descárgate la última imagen de Ubuntu Minimal. Además, accede al enlace https://etcher.io/ y descarga la versión de Etcher correspondiente a tu sistema operativo. Inserta la tarjeta microSD en tu ordenador y ejecuta Etcher, luego graba la imagen en tu microSD.

Configurar tu ODROID

Instala el SSD usando el puerto SATA en su ODROID-HC1. Asegúrate de utilizar la fuente de alimentación oficial 5V 4A+ de Hardkernel para garantizar que el SSD disponga de suficiente potencia. Una vez hecho esto, inserta el soporte de arranque ya preparado en tu ODROID y enciende el ODROID-HC1.

El primer arranque suele tardar unos 5 minutos en iniciar el sistema operativo. Si no se enciende tras aproximadamente 5 minutos, puedes probar a reiniciarlo, desconectando/conectando de nuevo el cable de alimentación y volviéndolo a encender.

Ten en cuenta que si utilizas un ODROID-XU4, puedes llegar a montar un NAS de alto rendimiento usando un hub USB con alimentación, un SSD/eMMC para el sistema operativo y uno o más discos duros para el NAS. Los hubs alimentados por bus pueden que no funcionen correctamente debido a una alimentación insuficiente.

Acceso SSH y actualización del sistema

Conéctate a tu ODROID-HC1 a través de SSH y empieza a darle forma a tu servidor web. Se recomienda encarecidamente actualizar la imagen de la tarjeta microSD. Eso te permitirá beneficiarte de las últimas correcciones y del posible soporte para funciones adicionales. Tras acceder por SSH, actualiza Ubuntu y el kernel con los siguientes comandos:

$ sudo apt-get update && sudo apt-get dist-upgrade
$ sudo apt-get install linux-image-xu3
$ reboot

Convertir tu SSD en una partición root

Los soportes de arranque, como las tarjetas microSD, constituyen un sistema ineficiente porque las tarjetas microSD son lenta (para el sistema operativo y las aplicaciones que se ejecuten en ellas, como un servidor web) y están sujeta a fallos tras sucesivas escrituras. Aunque un módulo eMMC es una opción viable para un ODROID-XU4, éste no está disponible para el ODROID-HC1. Por todo ello, la instalación y uso de un SSD es muy recomendable para alojar sitios web que utilicen bases de datos. Para utilizar eficientemente un SSD para el arranque y las aplicaciones, sigue la guía paso a paso que se presenta a continuación, la cual te ayudará a preparar tu SSD con una partición root. Puedes consultar el post del foro en http://bit.ly/2gpT9OR para más detalles.

Re-particionar tu SSD

En primer lugar, debes particionar tu SSD para poder usarlo con dos particiones: una como partición root para el sistema operativo y la otra para los datos. Puedes obtener información sobre tu SSD usando la herramienta fdisk:

$ sudo fdisk -l
# results
...
Disk /dev/sda: 111.8 GiB, 120034123776 bytes, 234441648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 33553920 bytes
Disklabel type: gpt
Disk identifier: 0412F7EC-4E8C-4610-ABFF-D6293387ADB6
Para particionar el SSD, utiliza la herramienta fdisk con el nombre correcto del dispositivo (/dev/sda tal y como aparece en el resultado del comando anterior):
$ sudo fdisk /dev/sda
Las opciones fdisk más útiles se detallan a continuación:

  • p : Mostrar la tabla de particiones
  • n : Añadir una nueva partición
  • d : Eliminar una partición
  • w : Escribir la tabla en el disco y salir
  • q : Salir sin guardar los cambios
  • g : Crear una nueva tabla de particiones GPT vacía
  • m : Ayuda (menú)

Al mismo tiempo que consultas el menú anterior, elimina las particiones actuales, si las hay, y crea una nueva tabla de particiones GPT. Después crea una nueva partición para la partición root y otra para los datos. En nuestro caso, la partición root tendrá una capacidad de 16G y el resto de espacio irá para la partición de datos. Puedes especificar un tamaño de la partición especifico escribiendo una capacidad, por ejemplo, "+16G".

Revisa el resultado de tus acciones obteniendo información de las particiones con el parámetro "p". Si esta información coincide con tus preferencias, presiona "w" para guardar y salir.

# In fdisk
Command (m for help): p
Disk /dev/sda: 111.8 GiB, 120034123776 bytes, 234441648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 33553920 bytes
Disklabel type: gpt
Disk identifier: 0412F7EC-4E8C-4610-ABFF-D6293387ADB6
 
Device        Start       End   Sectors  Size Type
/dev/sda1      2048  33556479  33554432   16G Linux filesystem
/dev/sda2  33556480 234441614 200885135 95.8G Linux filesystem

Formatear y montar una partición EXT4

Los modernos sistemas Linux generalmente utilizan el sistema de archivos EXT4, de modo que es muy aconsejable crear particiones de tipo ext4:

$ sudo mkfs.ext4 /dev/sda1
$ sudo mkfs.ext4 /dev/sda2
Una vez hecho esto, debes montar las particiones en directorios específicos para poder usar tu SSD. Crea los nuevos directorios para tu SSD:
$ sudo mkdir -p /media/systemdrive
$ sudo mkdir -p /media/data
Usaremos /media/systemdrive como partición root y /media/data como partición de datos:
$ sudo mount /dev/sda1 /media/systemdrive
$ sudo mount /dev/sda2 /media/data
Luego, verifica que estén montadas correctamente:
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/sda1        16G   44M   15G   1% /media/systemdrive
/dev/sda2        95G   60M   90G   1% /media/data
El siguiente paso es modificar los archivos relacionados con el sistema para arrancar desde tu SSD.

Modificando boot.ini

Primero, consulta el UUID de root:

$ sudo lsblk -f
# results
NAME        FSTYPE LABEL  UUID                                 MOUNTPOINT
mmcblk1                                                        
|-mmcblk1p1 vfat   boot   52AA-6867                            /media/boot
`-mmcblk1p2 ext4   rootfs e139ce78-9841-40fe-8823-96a304a09859 /
sda                                                            
|-sda2      ext4          6553d8f1-6224-450f-aec1-3b6f5fc09bd0 /media/data
`-sda1      ext4          f00945e6-46ea-47db-893a-6a74548c3af7 /media/systemdrive
Toma nota del UUID para /media/systemdrive, luego cambia el UUID del sistema de archivos root en boot.ini para que tu gestor de arranque reconozca la partición del SSD como partición root:
$ sudo cp /media/boot/boot.ini /media/boot/boot.ini.bak
$ sudo vi /media/boot/boot.ini
Busca la expresión "Basic Ubuntu Setup" en el archivo:
...
# Basic Ubuntu Setup. Don't touch unless you know what you are doing.
# --------------------------------
setenv bootrootfs "console=tty1 console=ttySAC2,115200n8 root=UUID=e139ce78-9841-40fe-8823-96a304a09859 rootwait ro fsck.repair=yes net.ifnames=0"
…
Cambia el UUID de root para que coincida con el valor anterior. Ten en cuenta que tus valores UUID pueden ser diferentes a los que se aparecen aquí.

Actualizando fstab

Para montar tus particiones automáticamente, añade las entradas necesarias en el archivo /etc/fstab.

$ sudo vi /etc/fstab
UUID=e139ce78-9841-40fe-8823-96a304a09859 / ext4 errors=remount-ro,noatime 0 1
LABEL=boot /media/boot vfat defaults 0 1
Comenta la primera línea y agrega nuevas líneas, tal y como se muestra a continuación:
#UUID=e139ce78-9841-40fe-8823-96a304a09859 / ext4 errors=remount-ro,noatime 0 1
LABEL=boot /media/boot vfat defaults 0 1
/dev/sda1 / ext4 defaults,noatime 0 1
/dev/sda2 /media/data ext4 defaults 0 2

Copiar un partición root

Copia la partición root de microSD al SSD usando la utilidad rsync:

$ sudo apt-get install rsync
$ sudo rsync -axv / /media/systemdrive
Una vez finalizado el proceso de copia, estarás listo para pasar al siguiente paso.

Verificar las particiones

Reinicia tu ODROID-HC1 y comprueba si la partición root montada es visible en tu SSD:

$ lsblk -f
NAME        FSTYPE LABEL  UUID                                 MOUNTPOINT
mmcblk1                                                        
|-mmcblk1p1 vfat   boot   52AA-6867                            /media/boot
`-mmcblk1p2 ext4   rootfs e139ce78-9841-40fe-8823-96a304a09859 
sda                                                            
|-sda2      ext4          daff1faa-3895-46cb-896f-bfe67f78535e /media/data
`-sda1      ext4          07ac0233-7d4a-49ac-baf0-4a4ebd07741c /
Tal y como aparece arriba, el MOUNTPOINT del sda1 es "/", lo que significa que el sistema arrancó correctamente desde el SSD.

Servidor LEMP (Linux, NGINX, MariaDB, PHP)

Hemos optado por utilizar nginx como servidor web. Éste utiliza una técnica asincrónica y orientada a eventos para manejar las conexiones, es rápido y tiene capacidad para atender solicitudes de muchos usuarios, además de ofrecer un rendimiento bastante fiable. Ha sido diseñado para ser un software liviano, el cual ofrece muchas características. Si deseas contar con la ventaja de poder usar funciones como es la instalación de módulos adicionales, decantarse por Apache sería una mejor opción.

PHP

Para instalar PHP, debes añadir un repositorio para PHP de antemano. Puedes instalar el último PHP para ARM, versión 7.1 o superior.

$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt-get update && sudo apt-get install php7.1-fpm
Una vez finalizada la instalación, debes cambiar la zona horaria especificada en un archivo de configuración de PHP.
$ sudo vi /etc/php/7.1/fpm/php.ini
Busca "date.timezone" y cámbiala de acuerdo a tu ubicación, inicialmente puede estar comentada por defecto.

MariaDB

No hay disponible un PPA oficial para MariaDB (http://bit.ly/2zktcMs) basado en la arquitectura ARM. Simplemente debes instalarlo desde el repositorio que se proporciona en Ubuntu. Además, debes instalar el paquete php-mysql para enlazar MariaDB con PHP. La instalación de los paquetes necesarios podría demorarse un poco.

$ sudo apt-get update && sudo apt-get install mariadb-server mariadb-client php-mysql
Deberías configurar el conjunto de idiomas que MariaDB usa para UTF-8.
$ sudo vi /etc/mysql/conf.d/mysql.cnf
Elimina todo el contenido existente y copia-pega el nuevo contenido que aparece a continuación.
# MariaDB-specific config file.
# Read by /etc/mysql/my.cnf
 
[client]
# Default is Latin1, if you need UTF-8 set this 
# (also in server section)
default-character-set = utf8mb4
 
[mysqld]
#
# * Character sets
#
# Default is Latin1, if you need UTF-8 set all this 
# (also in client section)
#
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
character_set_server = utf8mb4
collation_server = utf8mb4_unicode_ci
Finalmente, reinicia el servicio MariaDB.
$ sudo service mysql restart

Instalar nginx

Para instalar nginx, debes añadir un repositorio para nginx de antemano. Puedes instalar la última versión para ARM (versión 1.12+):

$ sudo add-apt-repository ppa:nginx/stable
$ sudo apt-get update && sudo apt-get install nginx
Si quieres usarlo con PHP, tienes que modificar la configuración del servidor:
$ sudo mv /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
$ sudo vi /etc/nginx/sites-available/default
Coloca lo que aparece a continuación dentro del nuevo archivo de servidor por defecto.
server {
  listen 80 default_server;
  listen [::]:80 default_server;
 
  root /var/www/html;
 
  index index.html index.php;
 
  server_name _;
 
  location / {
    try_files $uri $uri/ =404;
  }
 
        # This option is important for using PHP.
  location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
  }
}
Reinicia el servicio nginx:
$ sudo service nginx reload

Comprobaciones

Puedes probar si funciona correctamente o no, creando una simple página de información PHP:

$ echo "?php phpinfo();" | sudo tee /var/www/html/index.php
Cuando accedas a http://{DIRECCION IP ODROID}/, te mostrará información relacionada con PHP.

El entorno y las condiciones para las pruebas incluye:

  • Servidor LEMP

    • Ubuntu Minimal 16.04.3 LTS con Kernel 4.9.51-64
    • Nginx 1.12.1
    • PHP 7.1.9
    • MariaDB 10.0.31
    • Herramientas para pruebas de rendimiento
  • Apache JMeter 3.2 r1790748
  • sysbench 0.4.12
  • IOzone 3.471

Para probar su rendimiento, llevamos a cabo las pruebas que se muestran a continuación, con las condiciones que hemos enumerado anteriormente.

Figura 1 - Rendimiento de LEMP usando Apache JMeter

Sysbench

En primer lugar, crea una base de datos de "prueba" y después ejecuta las pruebas de rendimiento.

$ sudo sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=test --mysql-user=root prepare
$ sudo sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=test --mysql-user=root --max-time=60 --oltp-read-only=on --max-requests=0 --num-threads=8 run
$ sudo sysbench --test=oltp --mysql-db=test --mysql-user=root cleanup
Para probar la E/S de archivos, ejecuta la siguiente prueba:
$ sudo sysbench --test=fileio --file-total-size=4G prepare
$ sudo sysbench --test=fileio --file-total-size=4G --file-test-mode=rndrw --init-rng=on --max-time=300 --max-requests=0 --num-threads=8 run
$ sudo sysbench --test=fileio --file-total-size=4G cleanup
$ sudo iozone -e -I -a -s 100M -r 4k -r 16384k -i 0 -i 1 -i 2

Resultados

  • Ten en cuenta que las pruebas del módulo eMMC se ejecutaron sobre un ODROID-XU4 y el resto de las de llevaron a cabo en el ODROID-HC1.
  • Todos los resultados tienen sus propios márgenes de error
  • Puesto que WordPress se ejecuta con PHP, MariaDB (MySQL) y Nginx (Apache), instalamos WordPress en cada sistema para crear unas condiciones de prueba nativas. Las pruebas de JMeter se ejecutaron accediendo a la página principal de WordPress por defecto.
  • Observamos fallos en la respuesta si teníamos más de 140 usuarios accediendo de forma simultánea a la simple página web de WordPress.
  • TPS es la abreviatura de Transacción por segundo, así que ésta es la prueba más cercana a un posible entorno de usuario.

HDD 2TB

SSD 120G

eMMC 64G

eMMC 16G

 

MicroSD

 

8G

Apache JMeter

TPS medio con 100 usuarios simultáneos 51.1 53.1 54.5 53.4 52.3
Tiempo de Respuesta medio con 100 usuarios simultáneos 1578 1519 1477 1510 1540

sysbench

TPS medio OLTP(MySQL 361.81 401.59 396.43 395.14 340.05
Velocidad de transferencia media E/S Ficheros (Mbps) 1.9359 17.982 24.593 16.738 0.094831

IOzone (Kbps)

Velocidad de lectura aleatoria (4K) 1580 20937 15466 15203 9139
Velocidad de escritura aleatoria (4K) 1275 21078 15803 17939 827
Velocidad de lectura secuencial  (16M) 115209 363269 142535 147790 42885
Velocidad de escritura secuencial  (16M) 108979 278223 88529 33709 13022

Como puedes ver en la tabla anterior, un HDD es ligeramente más rápido que una tarjeta MicroSD en cuanto a la velocidad de acceso aleatorio. El resultado del TPS OLTP y la velocidad de acceso secuencial son bastante buenos, pero la velocidad de acceso aleatorio no es aceptable. El TPS medio que se muestra arriba es simplemente un valor promedio, necesitas saber que la velocidad de acceso aleatorio es uno de los valores más importantes a la hora medir la velocidad global del sistema. Los resultados OLTP del HDD ODROID variaron bastante entre las pruebas. Sin embargo, en lo que respecta a la velocidad de acceso secuencial, éste es casi tan rápido como un PC escritorio. Por lo tanto, usar una unidad de disco duro en el ODROID-HC1 para un NAS puede ser una muy buena opción.

Respecto a las pruebas TPS con los 100 usuarios simultáneos, no hay mucha diferencia. Sin embargo, en las otras pruebas, como la TPS OLTP y IOzone, el SSD o el eMMC 64G parecen más rápido que el resto. En la prueba E/S de ficheros, el SSD es la más rápido en las estadísticas por solicitud.

En base a los resultados anteriores, no se recomienda utilizar un HDD o tarjeta MicroSD para un sistema LEMP o LAMP. Recomendamos utilizar un módulo eMMC o SSD para lograr el mejor rendimiento con un ODROID-XU4/HC1/HC2 a la hora de alojar un sitio web y/o utilizarlo como un NAS. Para más detalles, puedes visitar el artículo original en http://bit.ly/2l5aUs1.

Be the first to comment

Leave a Reply