Seguramente ya has leído y experimentado nuestra Guía Rápida – la ya famosa instalación de Webinoly en menos de 5 minutos -, donde en cuestión de minutos tu servidor Nginx y tu primer sitio están listos y completamente configurados.
En el siguiente tutorial mostraremos algunos ejemplos comunes y casos prácticos con un grado de complejidad ligeramente mayor usando Webinoly con el objetivo de mostrarte algo del potencial de esta herramienta de manera que puedas usarlo como guía para aprender de manera práctica el uso de algunos comandos.
Instalación personalizada de Webinoly
Actualizar tu sistema operativo debiera ser siempre tu primer paso: sudo apt update && sudo apt -y upgrade
Empezaremos instalando Webinoly con la opción “-clean”, esto significa que solo se instalará Webinoly, pero aún no se instalará ningún paquete extra en el servidor.
wget -qO weby qrok.es/wy && sudo bash weby -clean
A continuación modificaremos algunos valores previo a la instalación de los paquetes.
# Webinoly Archivo de Configuración
sudo nano /opt/webinoly/webinoly.conf
# Modificar variables
max-mb-uploads:200
nginx-ppa:mainline
timezone:America/Mexico_City
Definimos un máximo en PHP para carga de archivos de 200Mb, instalaremos la rama “mainline” de Nginx y definimos la zona horaria de nuestra preferencia.
Ahora estamos listos para instalar y configurar todos los paquetes necesarios en el servidor. Usamos la opción “lemp” para una instalación, configuración y optimización completa de Nginx, PHP y MariaDB (MySQL).
sudo stack -lemp
Como referencia debes consultar la documentación oficial de Webinoly, además de las instrucciones de instalación.
Suscríbete a nuestro Newsletter para recibir una notificación cuando una actualización de Webinoly esté disponible.
Herramientas de desarrollo
Iniciaremos por crear un sitio de desarrollo en un subdominio:
sudo site dev.example.com -wp -env=development
El tipo de entorno WP “development” habilita de manera automatica el modo “debug” de WordPress, desactiva la cache y pone “noindex” para buscadores.
Para acceder al área de administradores del nuevo sitio WordPress es necesario crear un usuario para la autenticación HTTP, ya que es un área protegida.
sudo httpauth -add
Una vez terminado el desarrollo vamos a configurar un sitio de muestra para aprobación del cliente.
sudo site staging.example.com -env=staging -clone-from=dev.example.com
El entorno “staging” desactiva el modo debug, desactiva la cache y sigue en “noindex” para los buscadores.
Los sitios puedes ser activados o desactivados para evitar visitantes inesperados según sea necesario:
sudo site dev.example.com -off sudo site dev.example.com -on
Webinoly cuenta con las funciones del comando “log” para además de visualizar los eventos en tiempo-real, también nos facilita la activación y control de los logs de WordPress muy útil cuando desarrollamos temas y plugins, o los logs de aplicaciones como PHP y MySQL, entre otros, siempre necesarios durante el proceso de desarrollo de casi cualquier proyecto.
Una vez finalizado el projecto podemos sobrescribir el sitio anterior con el nuevo en el entorno de producción:
sudo site example.com -clone-from=staging.example.com -cache=on -env=production -overwrite=on
El modo debug se desactivará y el indexamiento se activará en buscadores. Además, el cache es habilitado en el comando anterior.
Y finalmente hacemos la entrega del proyecto agregando un certificado SSL al sitio.
sudo site example.com -ssl=on
Finalmente, haremos una copia local donde actualizaremos el sitio de manera frecuente:
sudo site local.example.com -env=local -clone-from=example.com
Para enviar las actualizaciones a producción:
sudo site example.com -clone-from=local.example.com -cache=on -env=production -overwrite=on
Creando sitios con Webinoly
La empresa ha crecido y nuestro cliente ha creado un proyecto sin fines de lucro, por lo que ha adquirido un dominio “.ORG” para promocionarlo.
Proponemos una sola pagina HTML con la información general del proyecto y datos de contacto, incluyendo un formulario para que los visitantes nos envíen sus dudas y algún representante se ponga en contacto con ellos.
Un proyecto realmente sencillo, por lo iniciamos creando el sitio con soporte PHP para ejecutar el formulario de contacto.
sudo site example.org -php
Y habilitamos el acceso SFTP para subir los archivos del nuevo sitio.
sudo webinoly -login-www-data=on
Tras una serie de revisiones se finaliza el proyecto y entregamos el sitio, no sin antes agregar un certificado SSL.
sudo site example.org -ssl=on
WordPress instalado en un subdirectorio
Finalmente el cliente decide agregar un blog para publicar artículos, por lo que de manera rápida y sencilla agregamos un sitio WordPress instalado en un subdirectorio del sitio PHP actual.
sudo site example.org -wp=custom -subfolder=/articulos
Debido a que serán miles de publicaciones en este sitio, se decidió usar una base de datos externa del servicio RDS de Amazon Web Services, por lo que usamos la opción “custom” para instalar WordPress y de esta manera Webinoly nos solicitará los datos para conectar con la base de datos y configurar el sitio automáticamente.
Además, como medida adicional han solicitado remover la autenticación HTTP para ingresar al área de administradores de WordPress de este sitio en específico. Aunque no es recomendable, es necesario por la cantidad de autores y usuarios que utilizará este sitio.
sudo httpauth example.com -wp-admin=off -subfolder=/articulos
Muy importante activar la cache para WP:
sudo site example.org -cache=on -subfolder=/articulos
WordPress Multisite
La empresa de nuestro cliente ha crecido y después de varias actualizaciones y mejoras al sitio principal example.com
, ahora nos solicita agregar a este sitio un área privada para publicaciones internas de la empresa. Además de un nuevo sitio para la recientemente creada escuela para vender certificaciones de la empresa.
La primer decisión es convertir el sitio principal en “Multisite” de esta manera podremos agregar sitios y administrarlos desde un mismo lugar.
sudo site example.com -multisite-convert
Configuramos el sitio con la opción “subdirectorio” y veremos que Webinoly de manera automatica detecta nuestra selección y realiza todas las configuraciones necesarias.
Creamos un nuevo sitio dentro de WordPress Multisite: example.com/members
el cual se administrará de manera independiente. Y además agregamos autenticación HTTP para restringir el acceso únicamente a empleados.
sudo httpauth example.com -path=/members
Anteriormente usaban un dominio exclusivo example.net
para un sitio privado donde alojaban un viejo blog con algunas publicaciones internas. Se ha decidido migrar el contenido del viejo blog al nuevo sitio y área para miembros, por lo que la mejor estrategia es redireccionar el viejo dominio.
sudo site example.net -forward=https://example.com/members
Ahora, por ejemplo: example.net/news
será redireccionado de manera automática a example.com/members/news
.
WordPress Multisite con dominios mapeados
Una de las características actuales de WordPress que en lo personal más me gustan es que ya no es necesario usar un plugin para hacer “Domain Mapping” y esta función ahora la encontramos de manera nativa.
¿Qué quiero decir con esto?
Pues que ya es posible usar un dominio independiente para cada subsitio de tu instalación multisite, es decir, en lugar de usar un subdirectorio o un subdominio, puedes usar un dominio nuevo y de esta manera administrar diferentes sitios web completamente independientes desde una misma instalación de WordPress.
Te recomiendo consultar la documentación oficial “WordPress Multisite Domain Mapping“. Webinoly integra de manera nativa esta función como se describe en el ejemplo siguiente.
Para crear el nuevo sitio de la escuela hemos decidido usar esta opción. Creamos en la instalación Multisite un nuevo sitio: example.com/escuela
al cual accederemos usando el nuevo dominio www.example.edu
como se muestra a continuación:
sudo site example.edu -parked=example.com -domain-mapping-wp-id=2
Ya hemos creado dos sitios independientes usando dos dominios diferentes y administrados desde una misma instalación de WordPress.
Agregamos un certificado SSL y forzamos el uso de “www”.
sudo site example.edu -ssl=on -root=example.com sudo site example.edu -force-redirect=www
Este sitio en especifico será administrado por un departamento en la empresa del cliente distinto a los demás sitios, por lo que han solicitado crear usuarios independientes para la autenticación HTTP.
sudo httpauth example.edu -add
De esta manera agregamos todos los usuarios necesarios y que solo tendrán acceso a este sitio, además los usuarios con acceso general que se crearon en los sitios anteriores, no tendrán acceso a este sitio.
Finalmente, FastCGI debe ser habilitado y debido a que este sitio usa query-strings para mostrar contenido en diferentes idiomas, debemos agregar una excepción a FastCGI para almacenar en caché estas páginas.
sudo site example.edu -cache=on sudo webinoly -query-string-cache=lang
Algunos sitios adicionales
En el sitio del proyecto example.org
tienen un repositorio de archivos para descarga en el servicio S3 de AWS, el cual necesitan acceder desde su propio dominio.
Vamos a crear un sitio “Reverse Proxy” para acceder con nuestro propio dominio al repositorio en S3.
sudo site download.example.org -proxy=[https://s3.amazonaws.com/download.example.org/] -dedicated-reverse-proxy
Y agregamos un certificado SSL:
sudo site download.example.org -ssl=on -manual=http
Ahora podemos acceder al repositorio usando: download.example.org/file.jpg
.
Para la administración de la flotilla de autos de la empresa han implementado un software de seguimiento GPS (Java App) llamado Traccar, el cual viene configurado para usar el puerto 8082 y necesitamos integrarlo con nuestros sitios.
sudo site gps.example.com -proxy=[localhost:8082]
Cualquier app/site de tu preferencia puede ser configurado de esta manera: Laravel, Java, Node, Angular, React, Vue, etc.
Y le agregamos un certificado SSL indicando la ruta donde se encuentra instalado el software de rastreo.
sudo site gps.example.com -ssl=on -root-path=/opt/traccar/web
Y finalmente el equipo de desarrollo de la empresa se encuentra desarrollando un nuevo sistema interno de tickets usando un framework de PHP y para su acceso y alojamiento en el servidor estaremos creando un nuevo sitio:
sudo site internal.example.com -mysql
Despues de ejecutar el comando se muestran los datos de la base de datos recién creada que usaremos para configurar la nueva aplicación de tickets en el servidor. Básicamente es un sitio PHP con una base de datos.
En resumen…
Hemos creado una cantidad de sitios con requerimientos muy distintos.
- example.com (WP Multisite)
- example.com/members (Subsitio protegido)
- www.example.edu (Subsitio con dominio mapeado y auth desabilitada)
- gps.example.com (Java App con Nginx Reverse proxy)
- internal.example.com (PHP con MySQL)
- example.org (PHP)
- example.org/artículos (WP en subfolder con auth independiente y base de datos externa)
- download.example.org (Dedicated Reverse Proxy a S3)
- example.net (Redireccionado a example.com/members)
Respaldos con Webinoly
Con Webinoly vienen pre instalados Duply y Duplicity, un par de herramientas para realizar respaldos en prácticamente cualquier medio conocido. En este tutorial usaremos los respaldos a AWS S3 y los respaldos locales.
Webinoly soporta de manera nativa cualquier servicio Compatible con S3, como: Backblaze B2, Digital Ocean Spaces, Wasabi, Vultr Object Storage, Linode Object Storage, DreamObjects, etc.
Empezaremos por realizar un respaldo completo de todo el directorio de datos de nuestros sitios /var/www
, los respaldos se realizan de manera incremental, por lo que solo la primera vez se envía el total de los datos, después solo se envían los cambios.
Para conectarnos con nuestro bucket en S3 debemos contar con las credenciales IAM necesarias, en este caso nuestro servidor es una instancia EC2 de AWS a la que hemos adjuntado un IAM Role, por lo que no es necesario guardar las credenciales en nuestro servidor.
sudo webinoly -aws-s3-credentials=awsiamrole
Con esto le indicamos a Webinoly que tenemos un IAM role adjunto en nuestro servidor, por lo que no es necesario introducir las credenciales.
Ahora estamos listos para configurar el primer respaldo:
sudo webinoly -backup=s3 -profile=DataBackup -bucket=america/data -source=/var/www -max-age=3M
Una de las funciones que personalmente encuentro mas útil, es la posibilidad de incluir un respaldo de una base de datos que se realizará de manera automática inmediatamente antes de ejecutar el respaldo que configuramos en el paso anterior.
sudo webinoly -backup=s3 -profile=DataBackup -add-db-pre=example.com -destination=/var/www/example.com/db-backup -max=10 -bucket=america/db_com
sudo webinoly -backup=s3 -profile=DataBackup -add-db-pre=example.org -subfolder=/articles -max=3
Es decir, cada que ejecutemos el respaldo “DataBackup”, primero se realizará el respaldo de ambas bases de datos de los sitios WordPress configurados en el paso anterior.
Además, en AWS es posible configurar la replicación automática de un bucket S3, en este caso podemos replicar el bucket “america” a una región distinta, por ejemplo, en Asia.
Ahora agregamos un CronJob para ejecutar este respaldo de manera automática todos los días a las 3am. Ejecutamos sudo crontab -e
y agregamos las siguientes líneas:
0 3 * * * sudo webinoly -backup=s3 -profile=DataBackup -run
# Respaldo extra para la base de datos de ambos sitios
0 15 * * * sudo webinoly -backup=local -wp=example.com -max=10 -bucket=america/db_com
30 15 * * * sudo webinoly -backup=local -wp=example.org -max=5
# Respaldo de un log del sistema de tickets
30 3 * * * sudo webinoly -backup=s3 -send-to-s3=/var/log/internal.log -bucket=america/internal
En caso de usar un usuario distinto a root, como es el caso en AWS, es necesario agregar la ruta del usuario antes de ejecutar ‘RUN’ un respaldo en el Cron (root):
0 20 * * * env HOME=/home/user sudo webinoly -backup=s3 -profile=name -run
En resumen, hemos configurado los siguientes respaldos:
- Diariamente a las 3:00am
- Respaldo local de la base de datos
/var/www/example.com/db-backup
del sitioexample.com
y se envía de manera automática a S3 a la carpeta/db_com
. - Respaldo local de la base de datos
$HOME/webinoly-backups/example.com
del sitioexample.org
. - Respaldo en S3 de todo el directorio de datos, incluyendo el respaldo de la base de datos de
example.com
por estar dentro de este directorio. - Respaldo en S3 del log del sistema de tickets.
- Respaldo local de la base de datos
- Diariamente a las 3:00pm
- Respaldo local de la base de datos
$HOME/webinoly-backups/example.com
del sitioexample.com
y se envía de manera automática a S3 a la carpeta/db_com
. - Respaldo local de la base de datos
$HOME/webinoly-backups/example.org
del sitioexample.org
.
- Respaldo local de la base de datos
Como puedes observar la base de datos se respalda dos veces por día y en el caso de example.com
contamos con 3 copias de los respaldos (local, américa bucket, asía bucket) además de la original. Y si no es suficiente, en cada bucket hay dos copias de la DB, una en la carpeta /data
y otra en /db_com
. ¿Suficiente?
Rendimiento, seguridad y ajustes adicionales de Nginx
Normalmente la FastCGI cachede NGINX viene configurada por Webinoly para expirar cada 30 días, esto es un valor recomendado para sitios web de muy bajo tráfico.
Les explico de manera breve, la primera vez que visitas una determinada página de tu sitio esta queda guardada en la cache FastCGI y así será hasta cumplir el periodo para expirar.
Si nuestro sitio tiene poco tráfico y tenemos configurado un valor, por ejemplo de “1 hora”, la mayoría de los visitantes recibirá una versión no guardada en cache de la página, por lo que no serviría de nada tener la cache habilitada.
Para modificar la configuración y valores de FastCGI en Webinoly utilizamos el siguiente comando:
sudo webinoly -cache-valid
Vamos a configurar tiempos de 1 hora en cache, 20 minutos de inactividad y 10 minutos para redirecciones [1h,20m,10m]. Esta sería una configuración que podría funcionar muy bien en sitios de muy alto tráfico.
También vamos a modificar el acceso a las herramientas del servidor.
sudo webinoly -tools-port=18915 sudo webinoly -tools-site=example.com
Ahora accederemos con el dominio y puerto asignados: example.com:18915
.
Terminado el desarrollo del proyecto, vamos a modificar nuevamente la respuesta predeterminada de Nginx como medida de seguridad.
sudo webinoly -default-site=blackhole
Aun cuando ya tenemos instalado Postfix para el envío de correos electrónicos, prefiero usar un servicio SMTP externo como Amazon SES, Mailgun, SendGrid, etc.
sudo webinoly -smtp
Además, configuraremos algunas cabeceras HTTP.
Activamos la opción “preload” para HSTS y configuramos de manera personalizada el “Referrer” y “Content-Security-Policy”.
# Webinoly Archivo de Configuración
sudo nano /opt/webinoly/webinoly.conf
# Modificar variables
header-hsts:preload
header-referrer:origin-when-cross-origin
header-csp:default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none'
header-permissions:floc
Certificados Wildcard
De manera opcional pudiéramos usar un solo certificado para los sitios:
- example.com
- example.com/members
- gps.example.com
- internal.example.com
Removemos los certificados actuales de los sitios -ssl=off
y creamos un certificado de tipo wildcard para el sitio principal.
sudo site example.com -ssl=on -wildcard
Y finalmente agregamos el resto de los sitios a este certificado.
sudo site gps.example.com -ssl=on -add-to-wildcard=example.com sudo site internal.example.com -ssl=on -add-to-wildcard=example.com
API-Interna de Webinoly
El cliente finalmente tenia un requerimiento especial, debido a un complejo proceso de auditorias internas llevan un estricto control de sus servidores, por lo que necesita que cada sitio que es creado en su servidor sea reportado a una API de su sistema y al finalizar se muestre un mensaje.
Haciendo uso de la API-Interna de Webinoly podemos agregar cualquier accion en casi cualquier punto de la ejecución de Webinoly. Siguiendo las instrucciones, renombramos y usamos el archivo /opt/webinoly/lib/api-events
agregando el siguiente código:
api-events_catch_status() {
if [[ $1 == "si1" ]]; then
wget --timeout=10 -t 1 -qO- https://api.example.net/?crearsitio=true
elif [[ $1 == "sie" ]]; then
echo "Todos los sitios son reportados a la API de example.net en cumplimiento de la auditoria de sistemas informaticos."
fi
}
Conclusión
Con Webinoly como pudimos observar en el ejemplo anterior nuestra idea es siempre facilitar las tareas rutinarias para administrar un servidor web Nginx, todo está a un comando de distancia.
De esta manera es que Webinoly se a convertido en la herramienta predilecta de los profesionales tanto en el desarrollo web, como en las areas empresariales de DevOps e Ingenieria de Software como un aliado para automatizar y agilizar el despliegue de servidores.
Si tienes alguna sugerencia, idea o comentario, por favor visita y únete a nuestra Comunidad.