Categorías
sysadmin

Site Slow or Unreachable (High Number of 404’s)

Introduccion

Al trabajar con WordPress una situación a la que puedes llegar es que ingreses a la pagina y se demore en cargar o que no cargue.

Ante esto lo tipico como Sysadmin vas a proceder a revisar las métricas típicas del servidor como el consumo de CPU, memoria RAM o Load Average, al hacer esto vas a observar que hay un consumo alto de CPU y memoria RAM

Cuando empiezas a depurar los proceso que se están ejecutando observas que el mayor consumo esta dado por apache, php o nginx dependiendo del tipo de despliegue sin embargo se hace claro que hay un problema con WordPress.

Como administrador del sitio depuras el sitio, revisas los plugins de cache, pruebas los plugins para comprobar si hay alguno que presenta error o mal funcionamiento, recargas cache, pruebas varios plugins de cache y no encuentras nada.

He pasado por esta situación y tras un tiempo de investigar y buscar posibles causas encontré que este problema esta relacionado a respuestas 404 y accesos no autorizados, en mayor parte debido a campañas de SEO o bots que consultan paginas que no existen, cambiaron o que están.

Debido a la cantidad de URLs que va a rastrear y la cantidad de llamadas que realiza el o los bots, termina con el sitio respondiendo con una velocidad muy lenta o incluso inhabilitando el sitio.

Seguimientos

Como seguimiento que se puede realizar en el sitio se puede verificar dos datos, el log del servidor web (Apache, Nginx …) y buscar las peticiones con codigo de respuesta 4xx y comparalo con las metricas historicas de CPU y memoria RAM

Otra opcion es usando WP SuperCache, activando el modo de depuracion el cual va a registrar un log, este log es el que vas a revisar y comparar los consumos

Posibles soluciones

Manejo de accesos a archivos no existentes

Dentro del .htaccess agrega lo siguiente

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(robots\.txt|sitemap\.xml(\.gz)?)
RewriteCond %{REQUEST_FILENAME} \.(css|js|html|htm|rtf|rtx|svg
|svgz|txt|xsd|xsl|xml|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc
|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|
m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf
|png|pot|pps|ppt|pptx|ra|ram|rar|swf|tar|tif|tiff|wav|wma|wri|
xla|xls|xlsx|xlt|xlw|zip)$ [NC]
RewriteRule .* – [L]

Acceso a URLs que no existen

Dentro del .htaccess agrega lo siguiente

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} www\.facebook\.com/plugins [NC]
RewriteRule .* 404.html [L,R=404]

Esto va a resultar en que si se esta accediento a a “www.facebook.com/plugins” emita directamente la respuesta 404 sin cargar WordPress, mejorando la velocidad de respuesta y disminuyendo la carga en el servidor.

Referencias

https://support.pagely.com/hc/en-us/articles/115002704391-Site-Slow-or-Unreachable-High-Number-of-404-s-

https://mywifequitherjob.com/speed-up-wordpress-and-reduce-server-load/

https://www.elementpack.pro/how-to-fix-the-404-error-in-wordpress-and-improve-speed/

https://medium.com/@jayaprakashaadhira/a-complete-guide-to-wordpress-error-404-pages-ac9041e84350

Categorías
GIT

Convenciones para Commits en Git

Al trabajar con sistemas de control de versiones como git se empieza a generar una duda, que se tiene que escribir en el mensaje del commit, que estructura o que información se debe ingresar?

A continuación se anexan algunas definiciones que han venido definiendo comunidades

Conventional commits define la siguiente estructura

<tipo>[ámbito opcional]: <descripción>

[cuerpo opcional]

[nota de pie opcional]

Los tipos de commits que se definen son los siguientes

featCaracteritica nuevaCaracteristicas
fixCorreccion de errorCorreccion de errores
docsSolo se modifica documentacionDocumentacion
styleCambios en el estilo de codificacon (Python, Pylint, Javascript, ESLint)Estilos
refactorCambio en el codigo que no corrige errores ni agrega nuevas característicasRefactorizacion de codigo
perfCambio en el codigo que mejora el rendimientoMejoras de rendimiento
testSe agregan o corrigen pruebas de codigoPruebas
buildCambios que afectan a la forma en la que se construye o empaqueta (ejemplos scopes: gulp, broccoli, npm)Build
ciCambios en el sistema de integracion continua (ejemplos scopes: Travis, Circle, BrowserStack, SauceLabs)Integracion continua
choreOtros cambios que no modifican codigo base o pruebas (ejemplo, mantenimiento)chore
reverRevierte

Dentro del cuerpo del mensaje tambien se debe especificar cuando se realizan cambios que puede romper la compatibilidad, para esto se debe especificar de la siguiente forma

feat: allow provided config object to extend other configs

BREAKING CHANGE: `extends` key in config file is now used for extending other config files

Referencias

Conventional changelog metahub

Conventional commits

Pyhist

RFC2119

AngularJS Git commit convention

Categorías
Docker

Como desplegar WordPress con Docker (PHP-FPM)

Introduccion

WordPress es un sistema de administracion de contenido (CMS) de codigo abierto. Hay multiples opciones para desplegar algun sitio con WordPress, desde opciones adminsitradas hasta implementaciones propias dentro de un servidor en donde se tendria todo el control.

Normalmente al desplegar un sitio con WordPress en un servidor requiere instalar el stack LAMP (Linux, Apache, MySQL y PHP) o LEMP (Linux, Nginx, MySQL y PHP), sin embargo preparar el stack sobre el servidor puede llevar mucho tiempo y ser susceptible a errores cuando se realiza manualmente.

Para esto existen varias alternativas para automatizar y agilizar la instalación y el despliegue. En esta ocasión se va a mostrar como realizar el despliegue con Docker y Docker compose para desplegar un sitio con WordPress usando el stack LEMP.

Para realizar este proceso debemos tener instalados Docker, para esto se puede seguir los siguientes pasos para instalar Docker en Ubuntu 20.04.

Una vez tenemos instalado Docker vamos a descargar el codigo del siguiente repositorio https://github.com/pedroporras/wp-fpm-deploy.git

Dentro del contenido que se descarga vamos a tener dos archivos.


El principal wp-fpm-stack.yml el cual tendra toda la definicion de los servicios que se van a desplegar, para esto vamos a desplegar 4 servicios.

Detalle de servicios desplegados

WordPress: En el servicio de WordPress vamos a seleccionar una de las imagenes oficiales soportadas por WordPress. La version que se selecciona esta sobre PHP-FPM. Para este caso se selecciono una version sobre Debian, sin embargo se puede cambiar la imagen y usar la version de alpine (wordpress:fpm-alpine). Adicional debemos almacenar la informacion de los archivos, para estos especificamos que almacene la informacion dentro de un volumen en docker y adicional queremos tener acceso a tres carpetas directamente desde el servidor, para esto asociamos las rutas de plugins, themes y uploads a la carpeta del servidor.

MySQL: En el servicio de MySQL vamos a usar el mismo ejemplo que muestran en la imagen oficial de Docker soportada por WordPress, adicional la informacion de MySQL se debe preservar aun cuando se reinicien los contenedores, para estos especificamos que almacene la informacion dentro de un volumen en docker.

Nginx: En el servicio de de Nginx vamos a usar Nginx como servidor Web, sin embargo de la misma forma se puede cambiar y usar una imagen de docker de Apache y usar FastCGI (FPM) para publicar la aplicación de WordPress. Para este caso en la imagen de Nginx vamos conectarnos al puerto 9000 el cual es el puerto que expone el servicio de WordPress, luego en el servicio de Nginx exponemos el puerto 80, para este caso asociamos el puerto 9000 del servidor al puerto 80 expuesto por el servicio. Adicional el servicio de Nginx debe poder acceder a los archivos del servicio de WordPress. Adicional montamos el archivo de configuracion de Nginx.

Adminer: En el servicio de Adminer vamos a usar Adminer como herramienta para administrar la base de datos.

Dentro de las especificaciones de todos los servicios se esta indicando que los logs que genera cada servicio tengan un tamaño maximo de 10 Megas y que sean un maximo de 5 archivos, de esta forma evitamos que el almacenamiento del servidor se agote por generar y almacenar logs.

Despliegue

A este punto podemos realizar el despligue de WordPress ejecutando el siguiente comando

docker-compose up -d

Apuntes finales

Docker volumes

WordPress en AWS EC2

Wordspress en AWS Lightsail

Docker compose

How to install WordPress with docker compose

Categorías
NLP

Investigación de literatura

Marco Teorico

ANTECEDENTES

Categorías
AWS AWS CDN

Integrando AWS Cloudfront con WordPress

Categorías
AWS AWS SNS

Como crear punto de enlace para Simple Notification Service (SNS) con Python

Como se mencionaba en el post anterior de Configuracion de Temas en Notification Service (SNS), aqui vamos a crear el endpoint el cual podra recibir las notificaciones de SNS.

Para este caso vamos a crear el endpoint con flask. SNS nos permite la opcion de integrarlo con https o http, este enpoint debe permitir peticiones http por metodo POST.

Para empezar vamos a partir sobre el tema que debe estar creado, sobre este tema vamos a agregar una suscripcion, para esto ingresamos a nuestro tema y le damos en crear suscripcion.

Sobre esta suscripcion vamos a usar una configuracion sencilla, ingresamos el protocolo y el endpoint al cual deben llegar las notificaciones.

Lo anterior enviara directamente el JSON al endpoint indicado, este debe estar preparado para recibir la peticion. El JSON que se va a recibir tiene el siguiente formato, de este se debe guardar el link en el objeto SubscribeURL para aceptar la suscripcion.

Luego de esto el endpoint estaria aprobado en el tema de SNS para recibir las notificaciones, en cuyo caso debemos recibir las notificaciones que usan la misma estructura, sin embargo en las notificaciones la importancia esta dentro del objeto Message que es donde se encuentra la informacion con respecto al evento que viene a partir de SES.

Si nos enfocamos en la estructura que vendría dentro del mensaje tendría la siguiente estructura.

De este nodo el receptor nos quedaría de la siguiente forma.

A partir de aqui ya se puede agregar los pasos necesarios que se necesiten ejecutar, en caso de que a partir de esto se requiera actualizar registros o notificar al cliente que su correo ha llegado al destino o que se ha rebotado o clasificado como SPAM.

Categorías
AWS AWS SES

Como usar plantillas en Simple Email Service (SES) con Python

En este tutorial vamos a hacer uso del SDK de Python para crear plantillas con Simple Email Service (SES), para esto vamos a contar con que ya tenemos configurado el correo en la consola de AWS y contamos con las credenciales para conectarnos, si te interesa ver como hacerlo mira este post Como enviar correos con AWS Simple Email Service (SES)

A continuación vamos a listar las diferentes acciones que se pueden hacer.

  • Crear una plantilla
  • Mostrar todas las plantillas
  • Mostrar una plantilla
  • Actualizar una plantilla
  • Eliminar una plantilla
  • Enviar un correo usando la plantilla

Apuntes finales

Si quieres profundizar mas en como interactuar con el SDK para realizar mas operaciones con las plantillas u otros campos disponibles te invitamos a visitar la documentación.

Categorías
AWS AWS SES AWS SNS

Como conectar Simple Notification Service (SNS) con SES en Python

Esta es la continuacion de un post anterior donde mirabamos la forma en la que se pueden enviar correos usando el servicio de Simple Email Service (SES) de AWS

Este proceso lo vamos a dividir en dos partes

  • Configuración de Temas en Simple Notification Service (SNS)
  • Integración en Simple Email Service (SES)

Configuración de Temas en Simple Notification Service (SNS)

Lo primero que necesitamos es crear los Temas o Topics en la seccion de Simple Notification Service (SES), para esto nos dirigimos a la seccion y damos click en Temas

Visualización de Temas

Aqui vamos a crear tres temas para integrarlos con los tres eventos disponibles desde Simple Email Service, estos son:

  • Bounce Notifications – bounce_mail_notification
  • Complaint Notifications – complaint_mail_notification
  • Delivery Notifications – delivery_mail_notification

Para esto solo le damos click en Crear un tema, vamos a usar una configuración simple por lo que vamos a completar los dos primero campos, el Nombre y Nombre para visualización, los demás campos son opcionales así que dejaremos los valores que traen por defecto. Vamos a hacer este proceso para los tres eventos.

Configuración de tema

Una vez hecho esto debemos crear las suscripciones, estos son los protocolos que se van a usar para enviar los mensajes, aquí tenemos varias opciones disponibles. De estos nos vamos a enfocar en el HTTPS

Configuración de protocolo de la suscripción

Este nos va a pedir un punto de enlace el cual sera la URL de algun servicio WEB que reciba el mensaje, para profundizar en esta parte puedes verlo en el post Creando punto de enlace para Simple Notification Service (SNS)

Visualización de estado de suscripción

Una vez se crea este envia la notificacion al punto de enlace, cuando esta funciona de forma correcta la suscripcion pasa a estado confirmada.
En caso de que sea necesario enviar varias veces este mensaje para pasar la suscripcion al estado validado podemos dar click en el boton de Publicar Mensaje.

Configurando los eventos

En la segunda parte lo primero que necesitamos para integrarlo con el servicio de Simple Email Service (SES) es habilitarlo, para esto vamos a la opción de Simple Email Service y seleccionamos el correo que ya hemos validado previamente.

Visualización de configuración del correo

Aqui le vamos a dar en Edit Configuration donde vamos a seleccionar los Temas con sus respectivos eventos y habilitaremos la opcion de Email Feedback Forwarding el cual nos quedara de la siguiente forma

Configuracion de eventos de correo

Apuntes finales

Si quieres profundizar mas puedes visitar la documentacion de AWS

Categorías
AWS AWS SES

Como enviar correos con AWS Simple Email Service (SES)

En este tutorial vamos a enviar correos con Simple Email Service (SES) de AWS con el SDK para Python.
Este proceso vamos a dividirlo en dos partes

  • Configuracion en AWS
  • Programandolo en Python

Configuracion en AWS

Lo primero que necesitamos es ingresar a la cuenta en AWS, dentro de la cuenta ingresamos a la opcion Simple Email Service, en nuestro caso haremos el proceso en la Region de Norte de Virginia el cual es uno de las regiones donde se encuentra disponible.

Menú de AWS

El primer paso que necesitamos es validar el correo de origen desde donde vamos a enviar los correos, para esto damos click en la opcion Email Addresses y damos click en el boton Verify a New Email Addresses, aqui ingresaremos el correo y le daremos en Verify This Email Address, esto enviara un correo a la direccion ingresada con un enlace al cual ingresaremos para confirmarlo. Cuando completemos esta parte el correo debe quedar en estado verificado.

Visualización de estado de correos

Una vez hecho esto necesitamos el usuario con el que nos vamos a conectar, para esto damos click en la opcion SMTP Settings y daremos click en el boton Create My SMTP Credentias, aqui nos pediran ingresar un nombre para el usuario y nos indicara descargar el archivo de acceso. Necesitamos descargar las credenciales para conectarnos con el SDK, para esto vamos a la seccion de IAM, crearemos y descargaremos la clave de acceso.

Programandolo en Python

Una vez hemos terminado los preparativos vamos a proceder al codigo, este podran verlo con los comentarios del funcionamiento.

Hasta aquí tenemos listo lo necesario para enviar correos con el servicio de SES de AWS, sin embargo esto podemos integrarlo con el servicio Simple Notification Service (SNS) de AWS para manejar los correos que son rechazados (Bounce, Complaints).
Si quieres ver como hacerlo ingresa en el Post Como conectar Simple Notification Service (SNS) con SES en Python donde explicare como hacerlo.

Apuntes finales

Si quieres profundizar mas puedes visitar la documentacion de AWS

Categorías
python-tools

Crear ambiente virtual Python